一、【情形1】
【Ubuntu14.04-->Win8】
[環境描述]
PC1:Win8,運行串口調試工具:USR-TCP232-Test.exe;串口COM1的參數設置為“9600,8,1,N"。
PC2:Ubuntu14.04;串口/dev/ttyUSB0的參數設置為“9600,8,1,N"。
[代碼描述]
// 串口傳輸線程 處理函數void*CTestEth::ThreadFuncHandleSerialPortTransfer(IN void* arg){ if ((NULL == arg)) { return NULL; } CTestEth* pc_test_eth = (CTestEth*)arg; // 打開串口 if (pc_test_eth->SerialPortOpen(pc_test_eth)) { cout << "pc_test_eth->SerialPortOpen() Error!" << endl; return NULL; } while (1) { // 串口傳輸函數,循環發送字符串:"hello, ubuntu14.04/n"。 if (pc_test_eth->EthToSerialPortTransfer(pc_gap_eth)) //usleep(100000); // 延遲100000微秒,即100毫秒 //sleep(1); // 延遲1秒 } // 關閉串口 pc_test_eth->SerialPortClose(pc_gap_eth); return NULL;}
[問題描述]
在PC2上,啟動串口傳輸線程,循環發送字符串“hello, ubuntu14.04/n”。
在PC1上的串口調試工具中進行接收,發現數據接收不全,有時接收到“hello,”,有時接收到“hello, ubun”,有時接收到“h”。
[原因分析]
出現類似問題的原因是
(1)發送端或者接收端,串口配置代碼有誤。
(2)頻繁打開,關閉串口。
(3)發送端程序沒有設置延時,導致對端接收程序來不及接收,或者接收不全。
(4)還有可能是發送端或者接收端的串口接觸不良,出現松動。
(5)可能還有其他原因,稍后補充。
[對應的解決方法]
(1)核對發送端以及接收端的串口參數設置。另外,仔細核對兩端的串口代碼。
(2)不要頻繁打開,關閉串口。
(3)在發送端程序中添加延時代碼。
(4)重新安裝發送端或者接收端的串口線。
[延時函數]
ubuntu中的延時函數為:sleep() // 秒級usleep() // 微秒級,1秒=10^6微秒nanosleep() // 納秒級,1秒=10^9納秒
[其他參考信息]
(1)msdn中的SerialPort.Open 方法
http://msdn.microsoft.com/zh-cn/library/system.io.ports.serialport.open(v=vs.110).aspx
備注
每個SerialPort對象只能有一個打開的連接。
對于所有應用程序,最佳做法是在調用Close方法之后和嘗試調用Open方法之前等待一會兒,因為端口可能未即時關閉。
(2)linux man page
sleep(3) - Linux man page
http://linux.die.net/man/3/sleep
usleep(3) - Linux man page
http://linux.die.net/man/3/usleep
nanosleep(2) - Linux man page
http://linux.die.net/man/2/nanosleep
二、【情形2】
【ubuntu14.04-->ubuntu14.04】
[環境描述]
PC1:ubuntu14.04;串口/dev/ttyS0的參數設置為“9600,8,1,N"。
PC2:Ubuntu14.04;串口/dev/ttyUSB0的參數設置為“9600,8,1,N"。
[情況描述]
在兩端均為ubuntu14.04的情況下,
在PC2中啟動串口傳輸線程,
在PC1的終端中輸入命令
# cat /dev/ttyS0
那么即使PC2中的數據發送速率很快,每次發送的數據包很大(幾百字節),PC1中的終端也可正常接收數據。
三、【原文網址】[原文發布于2014-09-10 18:05]
http://www.CUOXin.com/tom-and-jerry/p/3964781.html
【完結】
新聞熱點
疑難解答