青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 45,  comments - 232,  trackbacks - 0

Linux平臺上的串口通訊API很簡單,也很適用,使用C語言實現(xiàn)。我特別覺得它的讀數(shù)據(jù)函數(shù)很好用,因為使用了select機(jī)制,可以很容易的做讀數(shù)據(jù)超時。代碼簡單,不說了,自己下載了看就明白了。

/**

 * @file serialport.c

 * @brief serial port API implementation

 * @author Deng Yangjun

 * @date 2007-1-9

 * @version 0.1

 */

#include       <stdio.h>        

#include       <stdlib.h>

#include       <sys/types.h>

#include       <sys/stat.h>  

#include       <fcntl.h>         

#include       <termios.h>     

#include       <errno.h>        

#include       <sys/ioctl.h>      

#include       <assert.h>         

 

#include "serialport.h"

 

#ifdef __cplusplus

extern "C" {

#endif

 

#define MAX_DEV_NAME 256

 

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,  1200,  300,

           38400,  19200,  9600, 4800, 2400, 1200,  300, };

         

/**

* @brief  set speed of the serial port

* @param  fd [in] file description of the serial port

* @param  speed [in] speed that want to set value in speed array

* @return error code

*/       

int set_serial_port_speed(int fd, int speed)

{

       int   i;

      int   status;

      struct termios   opt;

      tcgetattr(fd, &opt);

      for ( i= 0;  i < sizeof(speed_arr) / sizeof(int);  i++ )

      {

              if(speed == name_arr[i])

             {

                 tcflush(fd, TCIOFLUSH);

           cfsetispeed(&opt, speed_arr[i]);

           cfsetospeed(&opt, speed_arr[i]);

           status = tcsetattr(fd, TCSANOW, &opt);

           if(status != 0)

                          return status;

                   else

                          return 0;

            }

             tcflush(fd,TCIOFLUSH);

      }

  

   //invalid baud rate

   assert(FALSE);

}

 

/**

* @brief  set serial port control flag

* @param  fd [in] file description of the serial port

* @param  databits [in] data bits, it's value is 7 or 8

* @param  stopbits [in] stop bits, it's value is 1 or 2

* @param  parity   [in] parity char, it's value is onef of 'N','E','O','S'

* @return error code

*/

int set_serial_port_ctrl_flag(int fd,int databits,int stopbits,int parity)

{

       struct termios options;

       int result = tcgetattr(fd,&options);

       if(result != 0){

              return result;

       }

      

       /*8N1*/

      options.c_cflag &= ~CSIZE; /* Mask the character size bits */

      switch (databits)

      {

             case 7:

             options.c_cflag |= CS7;

             break;

             case 8:

             options.c_cflag |= CS8;

             break;

             default:

             assert(FALSE);

             break;

       }

      

       switch (parity)

      {

             case 'n':

             case 'N':

                    options.c_cflag &= ~PARENB;   /* Clear parity enable */

                     options.c_iflag &= ~INPCK;     /* Enable parity checking */

                     break;

              case 'o':

              case 'O':

                     options.c_cflag |= (PARODD | PARENB);  /* Set odd checking*/

                     options.c_iflag |= INPCK;             /* Disnable parity checking */

                     break;

              case 'e':

              case 'E':

                            options.c_cflag |= PARENB;     /* Enable parity */

                            options.c_cflag &= ~PARODD;   /* Set event checking*/ 

                            options.c_iflag |= INPCK;       /* Disnable parity checking */

                            break;

              case 'S':

              case 's':  /*as no parity*/

                            options.c_cflag &= ~PARENB;

                            options.c_cflag &= ~CSTOPB;

                            break;

              default:

                            assert(FALSE);

                            break;

              }

             

       //set stop bits

       switch (stopbits)

      {

             case 1:

                    options.c_cflag &= ~CSTOPB;

                     break;

              case 2:

                     options.c_cflag |= CSTOPB;

                     break;

              default:

                     assert(FALSE);

                     break;

       }

      

  /* Set input parity option */

       if (parity != 'n') {

             options.c_iflag |= INPCK;

      }

 

      options.c_cc[VTIME] = 150; // 15 seconds

       options.c_cc[VMIN] = 0;

      

       options.c_cflag &= ~CRTSCTS;//disable hardware flow control;

       options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);/*raw input*/

       options.c_oflag  &= ~OPOST;   /*raw output*/

      

       tcflush(fd,TCIFLUSH); /* Update the options and do it NOW */

       result = tcsetattr(fd,TCSANOW,&options);

       if ( result != 0)

       {

              return result;

       }

      

       return 0;

 }

 

/**

* @breif open serial port device

* @param dev [in] name of the device

* @return file description of the device

*/

static int open_dev(const char *dev)

{

       int   fd = open( dev, O_RDWR | O_NOCTTY | O_NDELAY );

       if (fd != -1 ){

              fcntl(fd, F_SETFL,0); //set to block

       }

       return fd;

}

 

/**

* @breif open serial port

* @param port_num [in] number of the serial port, from 0~255

* @return file description of the serial port

*/

 int open_serial_port(int port_num)

 {

       assert(port_num > -1 && port_num < 256);

      

       char dev[MAX_DEV_NAME]={0};

       // dev/ttyS0 = serial port 0

       sprintf(dev,"/dev/ttyS%d",port_num);

       return open_dev(dev);

 }

 

 /**

  * @brief write serial port data

  * @param fd [in] file description of serial port

  * @param buffer [in] write data buffer

  * @param size [in] write data buffer size

  * @return write data count,return -1, occur error

  */

 int write_serial_port(int fd,unsigned char *buffer, size_t size)

 {

       int writecount = write(fd,buffer,size);

      

       return writecount;

 }

 

/**

* @brief read N data from serial port in time out

* @param    fd [in] file description of the serial port

* @param    buffer [in] read data buffer

* @param    size [in] read data buffer size

* @param     readcount [in,out] at last read (readcount) size data.

*                   set it equal to 0, read random count data.

*                   it will return received data count.

*                   return -1, the serial port closed

*                   return N, count of the serial port received

* @param     timeout [in] read N count data's time out

* @return     return 0 : time out\n

*                   return -1 : error\n

*                   return N: received data count\n

*/

int read_serial_port(int fd, unsigned char *buffer,size_t size, size_t *readcount,

                                          struct timeval *timeout)

{

       assert(size >= *readcount);

      

       fd_set inputs;

       int result;     //select result

       int nread;            //totla read count

       int iread;              //ont time read count

       int maxfd;

      

       maxfd = fd + 1; //NOTE

       nread = 0 ;  

      

      

       FD_ZERO(&inputs);

       FD_SET(fd, &inputs);

      

       do {

              result = select(maxfd, &inputs,(fd_set *)NULL, (fd_set *)NULL, timeout);

              switch(result)

              {

                     case 0: //time out

                     case -1:        //error

                     return result;

                     default:

                     if(FD_ISSET(fd,&inputs)) {

                            ioctl(fd,FIONREAD,&iread);

                            if(iread == 0) {

                                   *readcount = -1; //port closed

                                   return TRUE;

                            }

                            int count = 0;

                            if(*readcount != 0) {

                                   //only care buffer size

                                   count = min(iread, size - nread);

                            }

                           

                            nread += read(fd, buffer+nread, count);

                    

                     }

                     else {

                            assert(FALSE);

                     }

              }//end of switch

       }while((*readcount != 0) && (nread < *readcount));

      

       //receive random data, return data count

       if( 0 == *readcount) {

              *readcount = nread;

       }

       return TRUE;

}

 

/*

 * @brief close serial port

 * @param fd [in] file description of the serial port

 */

void close_serial_port(int fd)

{

       close(fd);

}

 

#ifdef __cplusplus

} /* extern "C" */

#endif

posted on 2007-08-24 09:31 天下無雙 閱讀(3046) 評論(2)  編輯 收藏 引用

FeedBack:
# re: 串口編程(3)--實現(xiàn)Linux、Unix串口通訊
2008-07-11 16:54 | KC
# re: 串口編程(3)--實現(xiàn)Linux、Unix串口通訊
2013-07-13 16:56 | chekliang
學(xué)習(xí)了,非常感謝!  回復(fù)  更多評論
  

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理



常用鏈接

留言簿(15)

隨筆分類

隨筆檔案

相冊

我的其它領(lǐng)域Blog

搜索

  •  

積分與排名

  • 積分 - 207331
  • 排名 - 130

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美一区二区| 国产日韩欧美日韩大片| 亚洲国产高清一区二区三区| 久久精品久久99精品久久| 午夜欧美大片免费观看 | 国产精品99久久久久久宅男| 午夜精品久久久久久久99樱桃| 国产欧美日韩一区二区三区| 久久久av毛片精品| 欧美一区二区视频在线观看| 狠狠狠色丁香婷婷综合久久五月| 欧美激情精品久久久久久变态| 欧美精品v日韩精品v国产精品 | 亚洲天堂网在线观看| 亚洲综合电影| 伊甸园精品99久久久久久| 亚洲激情视频网站| 国产精品视频在线观看| 欧美aⅴ一区二区三区视频| 欧美日韩精品欧美日韩精品| 欧美一区二区三区精品电影| 免费在线欧美黄色| 欧美主播一区二区三区| 欧美成人有码| 久久久激情视频| 欧美天堂亚洲电影院在线播放| 久久精品人人做人人爽电影蜜月| 欧美国产综合视频| 久久精品亚洲一区二区| 欧美日韩国产综合新一区| 久久这里只有| 国产欧美短视频| 亚洲免费不卡| 91久久精品国产91久久性色tv| 亚洲主播在线播放| 宅男在线国产精品| 美女黄色成人网| 久久麻豆一区二区| 国产精品一区二区你懂的| 亚洲美女精品久久| 91久久精品国产91性色| 久久久久看片| 久久精品综合网| 国产日本欧美一区二区| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 久久综合婷婷| 国产一区导航| 亚洲欧美日韩在线高清直播| 亚洲一区二区欧美| 欧美日韩系列| 亚洲免费观看视频| 夜夜嗨av一区二区三区四区| 欧美成人tv| 亚洲国产婷婷香蕉久久久久久| 黄色国产精品| 久久久国产一区二区| 久久精品一区二区国产| 国产精品素人视频| 午夜欧美大尺度福利影院在线看| 午夜在线一区二区| 国产麻豆午夜三级精品| 性色av一区二区三区在线观看| 午夜在线视频观看日韩17c| 国产精品美女久久久久久免费| 在线亚洲一区| 久久激情网站| 亚洲福利一区| 欧美精品在线看| 一区二区三区高清| 久久高清福利视频| 狠狠综合久久av一区二区小说 | 欧美成人亚洲成人| 亚洲精品一区二区在线| 亚洲精品久久久蜜桃| 久久理论片午夜琪琪电影网| 国产精品久久精品日日| 一区二区三区高清在线观看| 午夜精品久久久久99热蜜桃导演| 国产精品综合av一区二区国产馆| 亚洲欧美激情在线视频| 久久久国产视频91| 亚洲国产成人久久| 欧美日韩国产成人在线| 中文在线一区| 久久夜色精品| 亚洲精品一区二区三区四区高清 | 欧美成人中文字幕| 日韩一区二区久久| 久久久久.com| 亚洲精选中文字幕| 国产婷婷精品| 欧美一区二区三区精品电影| 久久久亚洲高清| 欧美激情一区二区三区在线视频| 一本久道久久综合中文字幕 | 午夜激情久久久| 欧美大片一区二区| 性娇小13――14欧美| 亚洲国产91| 国产农村妇女精品| 欧美精品一区二区三区在线播放| 亚洲一区免费网站| 亚洲国产欧美久久| 久久精品国产亚洲一区二区| 日韩视频第一页| 国产欧美一区二区三区国产幕精品 | 久久久久久久久蜜桃| 一本色道久久综合精品竹菊| 免费看精品久久片| 亚洲电影欧美电影有声小说| 日韩视频在线观看免费| 国产日本欧洲亚洲| 欧美女激情福利| 久久综合给合久久狠狠狠97色69| 亚洲一级片在线观看| 亚洲福利小视频| 久久婷婷丁香| 久久精品30| 午夜精品美女自拍福到在线| 亚洲精品国产系列| 一区在线免费| 国内一区二区三区| 国产婷婷成人久久av免费高清| 欧美国产日韩免费| 男男成人高潮片免费网站| 欧美一区二区三区四区高清| 国产精品99久久久久久有的能看| 亚洲经典视频在线观看| 欧美大片一区二区| 欧美成人福利视频| 欧美xart系列高清| 亚洲免费av电影| 在线观看欧美精品| 樱桃国产成人精品视频| 国产在线国偷精品产拍免费yy| 国产精品乱子久久久久| 国产精品av免费在线观看| 欧美日韩精品在线视频| 欧美日韩成人综合天天影院| 欧美激情在线免费观看| 欧美区一区二区三区| 欧美日韩亚洲三区| 国产精品久久久久av免费| 国产精品成人一区二区三区吃奶 | 久久亚洲一区二区三区四区| 欧美在线视屏| 久久久久久自在自线| 久久午夜色播影院免费高清| 另类av一区二区| 欧美福利电影在线观看| 欧美日韩亚洲另类| 国产乱码精品一区二区三区av| 国产伦精品一区二区三区| 国产日韩欧美不卡在线| 久久gogo国模裸体人体| 一区二区三区四区五区视频| 在线视频欧美日韩| 西瓜成人精品人成网站| 久久久女女女女999久久| 欧美成年人视频网站欧美| 亚洲精品久久久久久久久久久| 亚洲美女一区| 欧美亚洲一级片| 久久一区二区三区超碰国产精品| 欧美成人免费在线观看| 欧美私人啪啪vps| 国产一区在线观看视频| 亚洲精品乱码久久久久久久久 | 欧美美女福利视频| 国产精品尤物| 亚洲成人在线观看视频| 亚洲图色在线| 老司机免费视频一区二区| 亚洲青色在线| 久久国产欧美| 欧美天堂亚洲电影院在线观看 | 国产精品入口日韩视频大尺度| 欧美一区二区三区四区在线观看 | 欧美成人视屏| 99国产欧美久久久精品| 欧美一区在线看| 欧美人成免费网站| 精品动漫3d一区二区三区免费版| 99亚洲一区二区| 免费成人黄色| 亚洲在线免费视频| 欧美人与禽性xxxxx杂性| 国产一区二区欧美日韩| 亚洲一区欧美二区| 欧美韩日精品| 久久精品一区二区三区不卡牛牛 | 国产精品女主播在线观看| 亚洲国产精品毛片| 久久久噜噜噜久久| 中文在线不卡| 欧美三级免费| 一区二区91| 亚洲激情图片小说视频| 久久久久久久久久久成人| 国产偷自视频区视频一区二区|