首页 > 代码库 > [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]串口编程中,串口数据接收不全的可能原因