導航:首頁 > 操作系統 > linux串口丟數據

linux串口丟數據

發布時間:2023-03-16 08:34:32

1. linux下串口通信丟位元組的問題是怎麼樣解決

int con=atoi(portstr);
unsigned char Port_file_name[30];
int fd0,rc;
struct termios ts0;
switch (con)
{ //選項O_NOCTTY 表示不能把本串口當成控制終端,否則用戶的鍵盤輸入信息將影響程序的執行
//O_NDELAY表示打開串口的時候,程序並不關心另一端的串口是否在使用中
case 1: fd0=open("/dev/ttyM0",O_RDWR | O_NOCTTY | O_NDELAY); break;
case 2: fd0=open("/dev/ttyM1",O_RDWR | O_NOCTTY | O_NDELAY); break;
case 3: fd0=open("/dev/ttyM2",O_RDWR | O_NOCTTY | O_NDELAY); break;
case 4: fd0=open("/dev/ttyM3",O_RDWR | O_NOCTTY | O_NDELAY); break;
case 5: fd0=open("/dev/ttyM4",O_RDWR | O_NOCTTY | O_NDELAY); break;
case 6: fd0=open("/dev/ttyM5",O_RDWR | O_NOCTTY | O_NDELAY); break;
case 7: fd0=open("/dev/ttyM6",O_RDWR | O_NOCTTY | O_NDELAY); break;
case 8: fd0=open("/dev/ttyM7",O_RDWR | O_NOCTTY | O_NDELAY); break;
default : fd0=open("/dev/ttyM0",O_RDWR | O_NOCTTY | O_NDELAY); break;
}

tcgetattr(fd0,&ts0);
bzero(&ts0,sizeof(struct termios));
switch (gytype)
{
case 1:{ts0.c_cflag |= B300 | CS7 | CLOCAL | CREAD | PARENB ;
ts0.c_cflag &= ~PARODD; // 轉換為偶效驗
ts0.c_iflag |= INPCK; // Disnable parity checking
break; }
case 2:{ts0.c_cflag |= B1200 | CS8 | CLOCAL | CREAD | PARENB ;
ts0.c_cflag &= ~PARODD; // 轉換為偶效驗
ts0.c_iflag |= INPCK; // Disnable parity checking
break;
}
case 3:{
ts0.c_cflag |= B9600 | CS8 | CLOCAL | CREAD ;
ts0.c_cflag &= ~PARENB; // Clear parity enable
ts0.c_iflag &= ~INPCK; // Enable parity checking
break;
}
case 4:{ts0.c_cflag |= B9600 | CS8 | CLOCAL | CREAD | PARENB ;
ts0.c_cflag &= ~PARODD; // 轉換為偶效驗
ts0.c_iflag |= INPCK; // Disnable parity checking
break;
}
}

ts0.c_lflag &= ~ECHO;
ts0.c_lflag &= ~ECHONL;
ts0.c_iflag &= ~IXOFF;
ts0.c_iflag &= ~IXON;
ts0.c_cflag &= ~CSIZE;
switch (gytype)
{
case 1:{ts0.c_cflag |= CS7 ; break;}
case 2:{ts0.c_cflag |= CS8 ; break;}
case 3:{ts0.c_cflag |= CS8 ; break;}
case 4:{ts0.c_cflag |= CS8 ; break;}
}

ts0.c_lflag &= ~ICANON; //如果設置使能規范輸入,否則使用原始數據(本文使用)
ts0.c_oflag &= ~ONLCR; //如果設置將NL轉換成CR-NL後輸出
ts0.c_iflag &= ~INLCR; //如果設置將接收到的NL(換行)轉換成CR(回車)。
ts0.c_cc[VMIN] = 0; //最少可讀數據
ts0.c_cc[VTIME] = 0; //等待數據時間(10秒的倍數)
ts0.c_cflag &= ~CSTOPB; //如果設置則使用兩個停止位 ,如果取消則使用一個停止位
ts0.c_iflag |= IGNBRK; //如果設置則忽略接收到的break信號
ts0.c_lflag &= ~IEXTEN; //如果設置則啟用實現自定義的輸入處理
ts0.c_lflag |= NOFLSH; //如果設置則禁止產生SIGINT,SIGQUIT和SIGSUSP信號時刷新輸入和輸出隊列
switch (gytype)
{
case 1:{rc = cfsetospeed(&ts0,B300);break; }
case 2:{rc = cfsetospeed(&ts0,B1200);break; }
case 3:{rc = cfsetospeed(&ts0,B9600);break; }
case 4:{rc = cfsetospeed(&ts0,B9600);break; }
}
rc = tcsetattr(fd0,TCSAFLUSH,&ts0);
return fd0;

2. linux 下,串口讀取很多數據 放到1.txt里

你的這個串口設備在打開(也就是調用open函數獲取設備描述符)的時候設置的是非阻塞方式。導致串口上沒數據的時候read也立即返回,但是你的while已經把有效的數據讀走了,if裡面讀到的一定是空的,所以什麼也不列印。

建議
1. 在打開串口設備時使用阻塞方式,不會設置的話查查open系統調用的幫助,它有個flag;
2. 把while循環內的if語句去掉。

閱讀全文

與linux串口丟數據相關的資料

熱點內容
安卓怎麼關許可權保護隱私 瀏覽:390
海牛微視app怎麼用 瀏覽:70
單片機怎樣選變壓器 瀏覽:829
癌症pdf 瀏覽:725
雲伺服器鏡像批量部署環境 瀏覽:683
安卓手機瀏覽器能訪問什麼網站 瀏覽:254
找不到網站的伺服器ip地址該如何解決 瀏覽:743
演算法十個數降序排列 瀏覽:95
基於單片機的老年人健康監測系統 瀏覽:706
python入門經典pdf下載 瀏覽:17
東芝變頻2p空調壓縮機 瀏覽:227
自家wifi怎麼能加密 瀏覽:644
紅米k40加密門禁卡 瀏覽:847
什麼樣的源碼好看 瀏覽:156
手機主伺服器有什麼用 瀏覽:612
程序編寫命令 瀏覽:597
android發送心跳包 瀏覽:385
指標源碼和原理 瀏覽:700
汽車空調壓縮吸盤 瀏覽:208
崽崽因app版本不同不能邀請怎麼辦 瀏覽:686