原创 求linux C高手---一个搞笑但很有借鉴意义的串口程序★★★★

2011-6-14 21:22 1491 10 10 分类: MCU/ 嵌入式
楼主编了一个串口操作的函数,但是运行的时候有问题,后来网友们发现原来他的程序中让系统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条评论)

登录后参与讨论
我要评论
0
10
关闭 站长推荐上一条 /2 下一条