首页 > 代码库 > [RK_2014_0910]串口编程中,串口数据接收不全的可能原因
[RK_2014_0910]串口编程中,串口数据接收不全的可能原因
【情形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)可能还有其他原因,稍后补充。
[解决方法]
(1)核对发送端以及接收端的串口参数设置。另外,仔细核对两端的串口代码。
(2)不要频繁打开,关闭串口。
(3)在发送端程序中添加延时代码。
[延时函数]
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中的终端也可正常接收数据。
【完结】
[RK_2014_0910]串口编程中,串口数据接收不全的可能原因