[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)还有可能是发送端或者接收端的串口接触不良,出现松动。

(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.cnblogs.com/tom-and-jerry/p/3964781.html 

 

【完结】

你可能感兴趣的:(编程)