Linux串口select編程_第1頁(yè)
Linux串口select編程_第2頁(yè)
Linux串口select編程_第3頁(yè)
Linux串口select編程_第4頁(yè)
Linux串口select編程_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Linux下串口程序開(kāi)發(fā)串行口是計(jì)算機(jī)一種常用的接口,具有連接線少,通訊簡(jiǎn)單,得到廣泛的使用。常用的串口是RS-232-C接口(又稱EIA RS-232-C)它是在1970年由美國(guó)電子工業(yè)協(xié)會(huì)(EIA)聯(lián)合貝爾系統(tǒng)、調(diào)制解調(diào)器廠家及計(jì)算機(jī)終端生產(chǎn)廠家共同制定的用于串行通訊的標(biāo)準(zhǔn)。它的全名是"數(shù)據(jù)終端設(shè)備(DTE)和數(shù)據(jù)通訊設(shè)備(DCE)之間串行二進(jìn)制數(shù)據(jù)交換接口技術(shù)標(biāo)準(zhǔn)"該標(biāo)準(zhǔn)規(guī)定采用一個(gè)25個(gè)腳的DB25連接器,對(duì)連接器的每個(gè)引腳的信號(hào)內(nèi)容加以規(guī)定,還對(duì)各種信號(hào)的電平加以規(guī)定。傳輸距離在碼元畸變小于4%的情況下,傳輸電纜長(zhǎng)度應(yīng)為50英尺。在linux文件中,所有的設(shè)備文件

2、一般都位于/dev下,其中串口一、串口二分別對(duì)應(yīng)的設(shè)備名依次為“/dev/ttyS0”、“/dev/ttyS1”,可以查看在/dev下的文件以確認(rèn)。在linux下面對(duì)于串口的讀寫就可以通過(guò)簡(jiǎn)單的read、write函數(shù)來(lái)完成,所不同的是只是需要對(duì)串口的其他參數(shù)另坐配置。1.   串口編程需要用到的頭文件#include <stdio.h> / 標(biāo)準(zhǔn)輸入輸出定義#include <stdlib.h>#include <fcntl.h> / 文件控制定義,主要完成串口通信中對(duì)文件的讀寫操作#include <

3、;unistd.h> / linux標(biāo)準(zhǔn)函數(shù)定義#include <sys/ioctl.h>#include <termios.h>   / POSIX終端控制定義                        #include <sys/time.h> #include &l

4、t;sys/types.h> 2.   串口終端函數(shù)2.1      打開(kāi)串口設(shè)備     int fd;       char *device = "/dev/tts/0"               

5、    / 設(shè)備路徑,初始使用UART0             for(t=1;t<argc;t+)                          

6、      / 獲取程序入口時(shí)輸入的參數(shù)                     if(!strcmp(argvt,"-d") && (argc > (t+1)          

7、;                         device = argvt+1;                      

8、      if(!strcmp(device,"/dev/tts/1")               / 不允許使用UART1,因?yàn)樗押蚉C相連。                 

9、60;   printf("can not use /dev/tts/1n");              return -1;                   fd = open(device, O_RDWR);&

10、#160;                        / 打開(kāi)設(shè)備       if (fd < 0)              

11、                            / 設(shè)備打開(kāi)失敗                    

12、; printf("open device errorn");              return -1;       2.2      設(shè)置串口最基本的串口設(shè)置包括波特率設(shè)置,校驗(yàn)位和停止位設(shè)置。實(shí)際上串口的設(shè)置只要是設(shè)置Struct termios()結(jié)構(gòu)體中各成員的值。struct ter

13、mio     unsigned short  c_iflag;    /* 輸入模式標(biāo)志 */       unsigned short  c_oflag;          /* 輸出模式標(biāo)志 */     

14、;  unsigned short  c_cflag;          /* 控制模式標(biāo)志*/        unsigned short  c_lflag;           /* local mode flags */ &

15、#160;     unsigned char  c_line;                  /* line discipline */             unsigned char  c

16、_ccNCC;    /* control characters */;2.2.1  波特率設(shè)置struct  termios Opt;tcgetattr(fd, &Opt);             / 得到當(dāng)前串口的參數(shù)cfsetispeed(&Opt,B19200);     /*設(shè)置為19200Bps*/

17、cfsetospeed(&Opt,B19200);tcsetattr(fd,TCANOW,&Opt);    / 激活新配置設(shè)置波特率的例子函數(shù):/*brief  設(shè)置串口通信速率*param  fd     類型 int  打開(kāi)串口的文件句柄*param  speed  類型 int  串口速度*return  void

18、*/int speed_arr = B38400, B19200, B9600, B4800, B2400, B1200, B300,              B38400, B19200, B9600, B4800, B2400, B1200, B300, ;int name_arr = 38400,  19200,  9600,  4800,  2400, &#

19、160;1200,  300, 38400,                      19200,  9600, 4800, 2400, 1200,  300, ;void set_speed(int fd, int speed)       in

20、t   i;       int   status;       struct termios   Opt;       tcgetattr(fd, &Opt);       for ( i= 0;  

21、i < sizeof(speed_arr) / sizeof(int);  i+)               if  (speed = name_arri)                      &

22、#160;   tcflush(fd, TCIOFLUSH);                         cfsetispeed(&Opt, speed_arri);           

23、0;          cfsetospeed(&Opt, speed_arri);                       status = tcsetattr(fd1, TCSANOW, &Opt);    

24、;                  if  (status != 0)                            &

25、#160;       perror("tcsetattr fd1");                             return;      &#

26、160;                                          tcflush(fd,TCIOFLUSH);   

27、0;                    2.2.2  校驗(yàn)位和停止位設(shè)置/*brief   設(shè)置串口數(shù)據(jù)位,停止位和效驗(yàn)位*param  fd     類型  int  打開(kāi)的串口文件句柄*param  databi

28、ts 類型  int 數(shù)據(jù)位   取值 為 7 或者8*param  stopbits 類型  int 停止位   取值為 1 或者2*param  parity  類型  int  效驗(yàn)類型 取值為N,E,O,S*/int set_Parity(int fd,int databits,int st

29、opbits,int parity)       struct termios options;       if  ( tcgetattr( fd,&options)  !=  0)   / 得到當(dāng)前串口的參數(shù)            

30、60; perror("SetupSerial 1");                  return(FALSE);         /設(shè)置字符大小options.c_cflag &= CSIZE;       

31、60;switch (databits) /*設(shè)置數(shù)據(jù)位數(shù)*/                case 7:                       options.c_cflag |= CS7; 

32、;             break;       case 8:                  options.c_cflag |= CS8;      

33、;        break;         default:                 fprintf(stderr,"Unsupported data sizen"); return (FALSE);  &#

34、160;      /設(shè)置奇偶校驗(yàn)位switch (parity)  case 'n':      / 無(wú)奇偶校驗(yàn)位case 'N':           options.c_cflag &= PARENB;   /* Clear parity enable */

35、60;       break; case 'o':  case 'O':            options.c_cflag |= (PARODD | PARENB); /* 設(shè)置為奇效驗(yàn)*/         options.c_iflag |

36、= INPCK;  / INPCK:奇偶校驗(yàn)使能        break; case 'e': case 'E':          options.c_cflag |= PARENB;     /* Enable parity */     &

37、#160;      options.c_cflag &= PARODD;   /* 轉(zhuǎn)換為偶效驗(yàn)*/            options.c_iflag |= INPCK;       /* Disnable parity checking */    &#

38、160;   break;case 'S':    / Space 校驗(yàn)case 's':  /*as no parity*/       options.c_cflag &= PARENB;        options.c_cflag &= CSTOPB;   

39、60;    options.c_iflag |= INPCK;break; default:          fprintf(stderr,"Unsupported parityn");           return (FALSE);   / 設(shè)置停止位 swi

40、tch (stopbits)    case 1:            options.c_cflag &= CSTOPB;  / 1個(gè)停止位         break;   case 2:        &

41、#160;   options.c_cflag |= CSTOPB;  / 2個(gè)停止位     break;  default:             fprintf(stderr,"Unsupported stop bitsn");        

42、;   return (FALSE); / 處理未接收的字符tcflush(fd,TCIFLUSH); / 設(shè)置等待時(shí)間和最小接收字符options.c_ccVTIME = 150; /* 設(shè)置超時(shí)15 seconds*/  options.c_ccVMIN = 0; /* Update the options and do it NOW */ / 激活新配置if (tcsetattr(fd,TCSANOW,&options) != 0)  

43、60; perror("SetupSerial 3");    return (FALSE); return (TRUE); 2.2.3  模式設(shè)置需要注意的是,如果不是開(kāi)發(fā)終端之類的,只是串口傳輸數(shù)據(jù),而不需要串口來(lái)處理,那么使用原始模式(Raw Mode)方式來(lái)通信。       newtio.c_lflag &= (ICANON | ECHO | ECHOE | ISIG); / 原

44、始數(shù)據(jù)輸入       newtio.c_oflag &= (OPOST); / 原始數(shù)據(jù)輸出2.2.4  串口配置實(shí)例void init_ttyS(int fd)       struct termios newtio;        bzero(&newtio, sizeof(newtio);/ 得到當(dāng)前串口的參數(shù)&#

45、160;      tcgetattr(fd, &newtio);                                 / 將輸入波特率設(shè)為19200/ 將輸出波特率設(shè)為

46、19200       cfsetispeed(&newtio, B19200);                                  cfsetospeed(&

47、;newtio, B19200);                         / 使能接收并使能本地狀態(tài)       newtio.c_cflag |= (CLOCAL | CREAD);      &#

48、160;            / 無(wú)校驗(yàn) 8位數(shù)據(jù)位1位停止位       newtio.c_cflag &= PARENB;                     &

49、#160;         newtio.c_cflag &= CSTOPB;       newtio.c_cflag &= CSIZE; / 8個(gè)數(shù)據(jù)位       newtio.c_cflag |= CS8; / 原始數(shù)據(jù)輸入       newt

50、io.c_lflag &= (ICANON | ECHO | ECHOE | ISIG);       newtio.c_oflag &= (OPOST); / 設(shè)置等待時(shí)間和最小接收字符數(shù)       newtio.c_ccVTIME    = 0;           

51、                     newtio.c_ccVMIN     = 0;   / 處理未接收的字符       tcflush(fd, TCIFLUSH);    

52、0;                        / 激活新配置       tcsetattr(fd,TCSANOW,&newtio);           

53、              2.1      讀串口讀取串口數(shù)據(jù)使用文件操作read函數(shù)讀取,如果設(shè)置為原始模式(Raw Mode)傳輸數(shù)據(jù),那么read函數(shù)返回的字符數(shù)是實(shí)際串口收到的字符數(shù)。char  buff1024;int    Len;int  readByte = read(fd,buff,Len);可以使用操作文件的函數(shù)來(lái)實(shí)

54、現(xiàn)異步讀取,如fcntl,或者select等來(lái)操作。void SERIAL_RX(void)      /  read(fd, RXBUF , RX_len);#if 1       int ret,n,pos,retval;       fd_set rfds;       struct time

55、val tv ;       pos = 0;/指向接收緩沖        for(n = 0; n < RX_len; n+)                     RXBUFn = 0xFF;   

56、            FD_ZERO(&rfds);/ 清空串口接收端口集       FD_SET(fd,&rfds);/ 設(shè)置串口接收端口集          tv.tv_sec = 2;      

57、0;tv.tv_usec = 0;        while(FD_ISSET(fd,& rfds) / 檢測(cè)串口是否有讀寫動(dòng)作           / 每次循環(huán)都要清空,否則不會(huì)檢測(cè)到有變化              FD_ZER

58、O(&rfds);/ 清空串口接收端口集              FD_SET(fd,&rfds);/ 設(shè)置串口接收端口集                  retval = select(fd+1,&rfds,NULL,NULL,&

59、amp;tv);                if(retval = -1)                              &

60、#160;    perror("select()");                     break;                  &#

61、160;                                      else if(retval)         

62、;       /判斷是否還有數(shù)據(jù)                     /sleep(2);                  

63、0;                               ret = read(fd, RXBUF, RX_len);             

64、0;       pos += ret;                     /printf("ret = %d n",ret);              

65、;       if(RXBUFpos-2 = 'r') & (RXBUFpos-1 = 'n') / 確實(shí)接收到了數(shù)據(jù),并打印出來(lái)                             

66、                    FD_ZERO(&rfds);                           

67、; FD_SET(fd,&rfds);                                  retval = select(fd+1,&rfds,NULL,NULL,&tv);   

68、                           if(!retval)/no datas                   

69、0;                                           break;     

70、0;                                                 

71、0;                           else                      

72、             break;                     Linux下直接用read讀串口可能會(huì)造成堵塞,或數(shù)據(jù)讀出錯(cuò)誤。然而用select先查詢com口,再用read去讀就可以避免,并且當(dāng)com口延時(shí)時(shí),程序可以退出,這樣就不至于由于c

73、om口堵塞,程序就死了。Select的函數(shù)格式(我所說(shuō)的是Unix系統(tǒng)下的伯克利socket編程,和windows下的有區(qū)別,一會(huì)兒說(shuō)明):int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout);先說(shuō)明兩個(gè)結(jié)構(gòu)體:l        struct fd_set可以理解為一個(gè)集合,這個(gè)集合中存放的是文件描述符(file descriptor),

74、即文件句柄,這可以是我們所說(shuō)的普通意義的文件,當(dāng)然Unix下任何設(shè)備、管道、FIFO等都是文件形式,全部包括在內(nèi),所以毫無(wú)疑問(wèn)一個(gè)socket就是一個(gè)文件,socket句柄就是一個(gè)文件描述符。fd_set集合可以通過(guò)一些宏由人為來(lái)操作,比如:?        FD_ZERO(fd_set *set):清除一個(gè)文件描述符集;?        FD_SET(int fd, fd_set *set):將一個(gè)文件描

75、述符加入文件描述符集中;?        FD_CLR(int fd, fd_set *set):將一個(gè)文件描述符從文件描述符集中清除;?        FD_ISSET(int fd, fd_set *set): 檢查集合中指定的文件描述符是否可以讀寫。一會(huì)兒舉例說(shuō)明。l        struct tim

76、eval是一個(gè)大家常用的結(jié)構(gòu),用來(lái)代表時(shí)間值,有兩個(gè)成員,一個(gè)是秒數(shù),另一個(gè)是毫秒數(shù)。struct timeval              long tv_sec;             long tv_unsec;具體解釋select的參數(shù):l      

77、0; int maxfdp是一個(gè)整數(shù)值,是指集合中所有文件描述符的范圍,即所有文件描述符的最大值加1,不能錯(cuò)!在Windows中這個(gè)參數(shù)的值無(wú)所謂,可以設(shè)置不正確。l        fd_set *readfds是指向fd_set結(jié)構(gòu)的指針,這個(gè)集合中應(yīng)該包括文件描述符,我們是要監(jiān)視這些文件描述符的讀變化的,即我們關(guān)心是否可以從這些文件中讀取數(shù)據(jù)了,如果這個(gè)集合中有一個(gè)文件可讀,select就會(huì)返回一個(gè)大于0的值,表示有文件可讀,如果沒(méi)有可讀的文件,則根據(jù)timeout參數(shù)再判斷是否超時(shí),若超出

78、timeout的時(shí)間,select返回0,若發(fā)生錯(cuò)誤返回負(fù)值??梢詡魅隢ULL值,表示不關(guān)心任何文件的讀變化。l        fd_set *writefds是指向fd_set結(jié)構(gòu)的指針,這個(gè)集合中應(yīng)該包括文件描述符,我們是要監(jiān)視這些文件描述符的寫變化的,即我們關(guān)心是否可以向這些文件中寫入數(shù)據(jù)了,如果這個(gè)集合中有一個(gè)文件可寫,select就會(huì)返回一個(gè)大于0的值,表示有文件可寫,如果沒(méi)有可寫的文件,則根據(jù)timeout參數(shù)再判斷是否超時(shí),若超出timeout的時(shí)間,select返回0,若發(fā)生錯(cuò)誤返回負(fù)值。

79、可以傳入NULL值,表示不關(guān)心任何文件的寫變化。l        fd_set *errorfds同上面兩個(gè)參數(shù)的意圖,用來(lái)監(jiān)視文件錯(cuò)誤異常。l        struct timeval* timeout是select的超時(shí)時(shí)間,這個(gè)參數(shù)至關(guān)重要,它可以使select處于三種狀態(tài),第一,若將NULL以形參傳入,即不傳入時(shí)間結(jié)構(gòu),就是將select置于阻塞狀態(tài),一定等到監(jiān)視文件描述符集合中某個(gè)文件描述符發(fā)生變化為止;第二,若將

80、時(shí)間值設(shè)為0秒0毫秒,就變成一個(gè)純粹的非阻塞函數(shù),不管文件描述符是否有變化,都立刻返回繼續(xù)執(zhí)行,文件無(wú)變化返回0,有變化返回一個(gè)正值;第三,timeout的值大于0,這就是等待的超時(shí)時(shí)間,即select在timeout時(shí)間內(nèi)阻塞,超時(shí)時(shí)間之內(nèi)有事件到來(lái)就返回了,否則在超時(shí)后不管怎樣一定返回,返回值同上述。l        返回值:負(fù)值:select錯(cuò)誤 正值:某些文件可讀寫或出錯(cuò) 0:等待超時(shí),沒(méi)有可讀寫或錯(cuò)誤的文件在有了select后可以寫出像樣的網(wǎng)絡(luò)程序來(lái)!舉個(gè)簡(jiǎn)單的例子,就是從網(wǎng)絡(luò)上接受數(shù)

81、據(jù)寫入一個(gè)文件中。一般來(lái)說(shuō),在使用select函數(shù)之前,首先使用FD_ZERO和FD_SET來(lái)初始化文件描述符集,在使用了select函數(shù)時(shí),可循環(huán)使用FD_ISSET測(cè)試描述符集,在執(zhí)行完對(duì)相關(guān)的文件描述符后,使用FD_CLR來(lái)清除描述符集。2.2      寫串口讀寫串口設(shè)置好串口之后,讀寫串口就很容易了,把串口當(dāng)作文件讀寫就是。發(fā)送數(shù)據(jù):char  buffer1024;int    Length;int    nByte;nByte = write(fd, buffe

82、r ,Length);2.3      關(guān)閉串口close(fd);3.   具體應(yīng)用實(shí)例#include <stdio.h>#include <string.h>#include <stdlib.h>#include <fcntl.h>#include <unistd.h>#include <sys/ioctl.h>#include<time.h>#include <termios.h>  

83、;                          #include <sys/select.h>  #include <sys/types.h> /#include "COMM.h"  #define ACK_SUCCESS 

84、60;           0x00      / 操作成功#define  ACK_FAIL             0x01     / 操作失敗#define  ACK_FULL

85、60;           0x04     /  Full#define ACK_NOUSER        0x05      / 無(wú)此用戶#define  ACK_USER_EXIST 0x07   &#

86、160;  / 用戶已存在#define  ACK_TIMEOUT             0x08      / 采集超時(shí)#define ACK_COUNT          0x3   /發(fā)生錯(cuò)誤時(shí)候,重試次數(shù)

87、60;extern unsigned char TXBUF9900;extern unsigned char RXBUF9900;extern unsigned char rev_ok;extern unsigned int  TX_len;extern unsigned int  RX_len;extern unsigned char one_onecontrast(unsigned char user_number_h,unsigned char user_number_l);extern unsigned char one_morecontrast

88、(void);extern unsigned char Get_UserNumber_Right(void);extern unsigned char set_addmode(unsigned char yn_repeat);extern unsigned char add_Fingerprint(unsigned char time_number,unsigned char user_number_h,                

89、                                        unsigned char user_number_l,unsigned char user_right);extern

90、 unsigned char del_alluser(void);extern unsigned char del_oneuser(unsigned char user_number_h,unsigned char user_number_l);extern unsigned char read_usernumber(void);  int fd; unsigned char USER_NUMBER_H;    / 用戶號(hào)高8位unsigned char USER_NUMBER_L;  

91、0;  / 用戶號(hào)低8位unsigned char USER_RIGHT;            / 用戶權(quán)限 unsigned char FEATURE_BUFFER512;   / 要下傳的指紋特征值數(shù)據(jù)unsigned char FEATURE_LEN;           

92、;      / 要下傳的指紋特征值的長(zhǎng)度  unsigned char CharToHex(unsigned char ch);unsigned char select_one_onecontrast(void);void select_Get_Usernumber_right(void);  /* name:        SERIAL_TX* func:    

93、      發(fā)生數(shù)據(jù)到指紋模塊串口* para:          none* ret:            none* modify:* comment:         */int SERIAL_TX(void) 

94、      int ret;        ret = write(fd, TXBUF, TX_len);        / 試圖從串口發(fā)送數(shù) 據(jù)                  

95、;                   if(ret = -1)                        / 確實(shí)接收到了數(shù)據(jù),并打印出來(lái) &#

96、160;            /     *(rcv_buf+ret)='0'              printf(" Write device error!n");       

97、;       return -1;       /     ret = 0;               return 0; /* name:        SERIA

98、L_RX* func:          從指紋模塊串口接收數(shù)據(jù)* para:          none* ret:            none* modify:* comment:       

99、0; */void SERIAL_RX(void)      /  read(fd, RXBUF , RX_len);#if 1       int ret,n,pos,retval;       fd_set rfds;       struct timeval tv ;  &

100、#160;    pos = 0;/指向接收緩沖       tv.tv_sec = 2;       tv.tv_usec = 0;       for(n = 0; n < RX_len; n+)            

101、         RXBUFn = 0xFF;                    /while(FD_ISSET(fd,&uart_r)|FD_ISSET(fd,&uart_w);      / 檢測(cè)串口是否有讀寫動(dòng)作&

102、#160;      while(1) / 檢測(cè)串口是否有讀寫動(dòng)作                         FD_ZERO(&rfds);/ 清空串口接收端口集       

103、       FD_SET(fd,&rfds);/ 設(shè)置串口接收端口集                 retval = select(fd+1,&rfds,NULL,NULL,&tv);           

104、60;    if(retval = -1)                                   perror("select()");   &

105、#160;                 break;                               &

106、#160;                         else if(retval)                /判斷是否還有數(shù)據(jù)    &

107、#160;                /sleep(2);                               

108、60;                  ret = read(fd, RXBUF, RX_len);                     pos += ret;   

109、0;                 /printf("ret = %d n",ret);                     if(RXBUFpos-2 = 'r') &

110、 (RXBUFpos-1 = 'n')                           / 確實(shí)接收到了數(shù)據(jù),并打印出來(lái)               

111、                                  FD_ZERO(&rfds);             

112、;               FD_SET(fd,&rfds);                               &#

113、160;  retval = select(fd+1,&rfds,NULL,NULL,&tv);                              if(!retval)/no datas     

114、0;                                                 

115、0;       break;                                         

116、0;                                         else        

117、                           break;                      

118、void init_ttyS(int fd)       struct termios newtio;        bzero(&newtio, sizeof(newtio);       tcgetattr(fd, &newtio);          

119、60;                        / 得到當(dāng)前串口的參數(shù)       cfsetispeed(&newtio, B19200);          &#

120、160;                 / 將輸入波特率設(shè)為19200       cfsetospeed(&newtio, B19200);                

121、60;          / 將輸出波特率設(shè)為19200       newtio.c_cflag |= (CLOCAL | CREAD);                   / 使能接收并使能本地狀態(tài) &#

122、160;     newtio.c_cflag &= PARENB;                         / 無(wú)校驗(yàn) 8位數(shù)據(jù)位1位停止位       newtio.c_cflag &

123、;= CSTOPB;       newtio.c_cflag &= CSIZE;       newtio.c_cflag |= CS8;       newtio.c_lflag &= (ICANON | ECHO | ECHOE | ISIG); / 原始數(shù)據(jù)輸入       

124、newtio.c_oflag &= (OPOST);        newtio.c_ccVTIME    = 0;                          / 設(shè)置等待時(shí)間和最小接收字符數(shù)&

125、#160;      newtio.c_ccVMIN     = 0;          tcflush(fd, TCIFLUSH);                     &#

126、160;       / 處理未接收的字符       tcsetattr(fd,TCSANOW,&newtio);                         / 激活新配置&

127、#160;unsigned char set_addmode(unsigned char yn_repeat)       unsigned char check, i;       TXBUF0 = 0xF5;       TXBUF1 = 0x2D;       TXBUF2 = 0x00;  

128、     TXBUF3 = yn_repeat;       TXBUF4 = 0x00;       TXBUF5 = 0x00;       check = TXBUF1;       for (i = 2; i < 6; i+)  

129、60;                  check = TXBUFi;              TXBUF6 = check;       TXBUF7 = 0xF5;   &

130、#160;         rev_ok = 1;       TX_len = 8;       RX_len = 8;        SERIAL_TX();       sleep(delaytime);       SERIAL_RX();       rev_ok = RXBUF4;    

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論