楼主编了一个串口操作的函数,但是运行的时候有问题,后来网友们发现原来他的程序中让系统sleep了,而且时间还不短。
我們用linux C控制單科ai馬達,但動作不能連續,只會執行最後動作。若只轉一次,他就很正常。但若連續,會先執行SLEEP在動最後動作
程式如下:
#include <termios.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/signal.h>
#include <sys/types.h>
#include<stdlib.h>
#include<string.h>
#include <sys/stat.h>
#define BAUDRATE B9600
#define MODEMDEVICE "/dev/ttyUSB0"
#define _POSIX_SOURCE 1
#define FALSE 0
#define TRUE 1
volatile int STOP=FALSE;
void signal_handler_IO (int status);
int wait_flag=TRUE;
int fd;
char CheckSum=0;
int data_write(char Data1,char Data2){
int i,w_value=0;
char ins[4];
CheckSum = (Data1^Data2)&0x7f;
ins[0]=0xff;
ins[1]=Data1;
ins[2]=Data2;
ins[3]=CheckSum;
printf("0xff=%x\n",ins[0]);
printf("Data1=%d\n",ins[1]);
printf("Data2=%d\n",ins[2]);
printf("CheckSum=%d\n",ins[3]);
printf("fd=%d\n",fd);
w_value=write(fd,&ins,8);
//free(ins);
printf("w_value=%d\n",w_value);
if(w_value==-1)
return 0;
return 1;
}
int find_ch(char* buf, char ch, int len)
{
int i;
for(i=0; i< len; i++)
{
if(buf==ch)
return TRUE;
if(buf==0)
break;
}
return FALSE;
}
main()
{
int c, res;
struct termios oldtio,newtio;
struct sigaction saio; /* definition of signal action */
sigset_t sigset;
int mystr_idx;
char ch;
static char s1[20];
char buf[255];
char mystr[255];
fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (fd <0) {perror(MODEMDEVICE); exit(-1); }
saio.sa_handler = signal_handler_IO;
saio.sa_mask = sigset;
saio.sa_flags = 0;
saio.sa_restorer = NULL;
sigaction(SIGIO,&saio,NULL);
fcntl(fd, F_SETOWN, getpid());
fcntl(fd, F_SETFL, FASYNC);
tcgetattr(fd,&oldtio);
newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
newtio.c_iflag = IGNPAR;
newtio.c_oflag = 0;
newtio.c_cc[VMIN]=1;
newtio.c_cc[VTIME]=0;
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
mystr_idx = 0;
memset(mystr,0,255);
printf("Write...\n");
data_write(13,220);
sleep(1);
data_write(13,240);
sleep(1);
data_write(13,10);
sleep(1);
data_write(13,60);
tcsetattr(fd,TCSANOW,&oldtio);
}
void signal_handler_IO (int status)
{
printf("received SIGIO signal.\n");
wait_flag = FALSE;
}
之後馬達只會先執行sleep 之後只會轉動最後一個角度60 其他角度都不會動到
========================================================================
你想問甚麼??
sleep(1000000000);
...睡31年...
到電腦掛了都還沒睡醒
=======================================================================
時間是n 所以我打那個是停一秒
sleep(1000000000);
這裡我可能打錯 但我組員測試時
他寫的是停一秒 執行時只跑最後一個角度
停止時間會先停一停在動
-----------
sleep 的單位是秒
sleep(1000000000);
是停 1000000000 秒 (~31年)
文章评论(0条评论)
登录后参与讨论