?????? fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY );
??????? 打開的串口設備有很多設置選項。本文中使用int setup_com(int fd)設置。在系統頭文件
c_cflag? : 控制選項
c_lflag? : 線選項
c_iflag? : 輸入選項
c_oflag? :輸出選項
c_cc??? :控制字符
c_ispeed :輸入數據波特率
c_ospeed :輸出數據波特率
??????? 如果要設置某個選項,那么就使用"|="運算,如果關閉某個選項就使用"&="和"~"運算。本文使用的各個選項的意義定義如下:
c_cflag: CLOCAL 本地模式,不改變端口的所有者
???????? CREAD? 表示使能數據接收器
???????? PARENB? 表示偶校驗
???????? PARODD 表示奇校驗
??????? CSTOPB? 使用兩個停止位
??????? CSIZE??? 對數據的bit使用掩碼
??????? CS8????? 數據寬度是8bit
??????? c_lflag:? ICANON 使能規范輸入,否則使用原始數據(本文使用)
??????? ECHO??? 回送(echo)輸入數據
??????? ECHOE?? 回送擦除字符
??????? ISIG????? 使能SIGINTR,SIGSUSP, SIGDSUSP和 SIGQUIT 信號
??????? c_iflag:? IXON???? 使能輸出軟件控制
???????? ?IXOFF??? 使能輸入軟件控制
???????? IXANY??? 允許任何字符再次開啟數據流
???????? INLCR??? 把字符NL(0A)映射到CR(0D)
???????? IGNCR??? 忽略字符CR(0D)
?????? ICRNL??? 把CR(0D)映射成字符NR(0A)
??? c_oflag: OPOST? 輸出后處理,如果不設置表示原始數據(本文使用原始數據)
c_cc[VMIN]:? 最少可讀數據
c_cc[VTIME]: 等待數據時間(10秒的倍數)
????? 根據以上設置的定義,串口端口設置函數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;
}
??????? 兩個打包和拆包函數和SLIP協議定義的一樣,拆包函數和打包相反,這里不列舉了。
??????? 小結
?????? 本文描述的是一個非常簡單的串口上網程序,如果需要可靠的通信,增加吞吐量,可在用戶空間添加適當的網絡控制協議,也可增加數據壓縮算法。
評論
查看更多