<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Linux串口上網(wǎng)的程序?qū)崿F(xiàn)方法

          Linux串口上網(wǎng)的程序?qū)崿F(xiàn)方法

          作者: 時(shí)間:2011-05-10 來源:網(wǎng)絡(luò) 收藏
          如果打包前的數(shù)據(jù)中有END這個(gè)字符,那么使用ESC_END代替,如果發(fā)現(xiàn)有ESC這個(gè)字符,那么使用ESC_ESC字符替換。在環(huán)境下,名從ttyS0開始依次是ttyS1、ttyS2等。在本中,使用ttyS0作為通信。在打開ttyS0的時(shí)候,選項(xiàng)O_NOCTTY 表示不能把本當(dāng)成控制終端,否則用戶的鍵盤輸入信息將影響的執(zhí)行; O_NDELAY表示打開串口的時(shí)候,并不關(guān)心另一端的串口是否在使用中。在中,打開串口設(shè)備和打開普通文件一樣,使用的是open()系統(tǒng)調(diào)用。比如我么打開串口設(shè)備1也就是COM1,只需要:

          本文引用地址:http://www.ex-cimer.com/article/150775.htm

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

          打開的串口設(shè)備有很多設(shè)置選項(xiàng)。本文中使用int setup_com(int fd)設(shè)置。在系統(tǒng)頭文件termios.h>中定義了終端控制結(jié)構(gòu)struct termios,tcgetattr()和tcsetattr()兩個(gè)系統(tǒng)函數(shù)獲得和設(shè)置這些屬性。結(jié)構(gòu)struct termios中的域描述的主要屬性包括:

          c_cflag : 控制選項(xiàng)

          c_lflag : 線選項(xiàng)

          c_iflag : 輸入選項(xiàng)

          c_oflag :輸出選項(xiàng)

          c_cc :控制字符

          c_ispeed :輸入數(shù)據(jù)波特率

          c_ospeed :輸出數(shù)據(jù)波特率

          如果要設(shè)置某個(gè)選項(xiàng),那么就使用|=運(yùn)算,如果關(guān)閉某個(gè)選項(xiàng)就使用=和~運(yùn)算。本文使用的各個(gè)選項(xiàng)的意義定義如下:

          c_cflag: CLOCAL 本地模式,不改變端口的所有者

          CREAD 表示使能數(shù)據(jù)接收器

          PARENB 表示偶校驗(yàn)

          PARODD 表示奇校驗(yàn)

          CSTOPB 使用兩個(gè)停止位

          CSIZE 對(duì)數(shù)據(jù)的bit使用掩碼

          CS8 數(shù)據(jù)寬度是8bit

          c_lflag: ICANON 使能規(guī)范輸入,否則使用原始數(shù)據(jù)(本文使用)

          ECHO 回送(echo)輸入數(shù)據(jù)

          ECHOE 回送擦除字符

          ISIG 使能SIGINTR,SIGSUSP, SIGDSUSP和 SIGQUIT 信號(hào)

          c_iflag: IXON 使能輸出軟件控制

          IXOFF 使能輸入軟件控制

          IXANY 允許任何字符再次開啟數(shù)據(jù)流

          INLCR 把字符NL(0A)映射到CR(0D)

          IGNCR 忽略字符CR(0D)

          ICRNL 把CR(0D)映射成字符NR(0A)

          c_oflag: OPOST 輸出后處理,如果不設(shè)置表示原始數(shù)據(jù)(本文使用原始數(shù)據(jù))

          c_cc[VMIN]: 最少可讀數(shù)據(jù)

          c_cc[VTIME]: 等待數(shù)據(jù)時(shí)間(10秒的倍數(shù))

          根據(jù)以上設(shè)置的定義,串口端口設(shè)置函數(shù)setup_com()定義如下:

          int setup_com(int fd){

          struct termios options;

          tcgetattr(fd, options);

          /* Set the baud rates to 38400...*/

          cfsetispeed(options, B38400);

          cfsetospeed(options, B38400);

          /* Enable the receiver and set local mode...*/

          options.c_cflag |= (CLOCAL | CREAD);

          /* Set c_cflag options.*/

          options.c_cflag |= PARENB;

          options.c_cflag = ~PARODD;

          options.c_cflag = ~CSTOPB;

          options.c_cflag = ~CSIZE;

          options.c_cflag |= CS8;

          /* Set c_iflag input options */

          options.c_iflag =~(IXON | IXOFF | IXANY);

          options.c_iflag =~(INLCR | IGNCR | ICRNL);

          options.c_lflag = ~(ICANON | ECHO | ECHOE | ISIG);

          /* Set c_oflag output options */

          options.c_oflag = ~OPOST;

          /* Set the timeout options */

          options.c_cc[VMIN] = 0;

          options.c_cc[VTIME] = 10;

          tcsetattr(fd, TCSANOW, options);

          return 1;

          }

          兩個(gè)打包和拆包函數(shù)和SLIP協(xié)議定義的一樣,拆包函數(shù)和打包相反,這里不列舉了。

          小結(jié)

          本文描述的是一個(gè)非常簡單的串口程序,如果需要可靠的通信,增加吞吐量,可在用戶空間添加適當(dāng)?shù)木W(wǎng)絡(luò)控制協(xié)議,也可增加數(shù)據(jù)壓縮算法。

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

          linux相關(guān)文章:linux教程



          上一頁 1 2 3 4 5 下一頁

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();