[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中的终端也可正常接收数据。

【完结】

时间: 2024-10-17 04:18:37

[RK_2014_0910]串口编程中,串口数据接收不全的可能原因的相关文章

内核中用于数据接收的结构体struct msghdr(转)

内核中用于数据接收的结构体struct msghdr(转) 我们从一个实际的数据包发送的例子入手,来看看其发送的具体流程,以及过程中涉及到的相关数据结构.在我们的虚拟机上发送icmp回显请求包,ping另一台主机172.16.48.1.我们使用系统调用sendto发送这个icmp包. ssize_t sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen);

串口通讯中垃圾数据的处理

在双机串口通讯中,开关机(串口开闭)期间发送方有时候会发一些无效的垃圾数据,同时因为有的协议解析只有接收到一定数量才能解析.这就会出现一个现象:如果开头的数据是错误的,又没有及时丢弃,后面正确的数据接着位置存储,最终造成解析失败.现象就是有时候数据交互正确,有时候错误(冷启动第一次出现错误的几率较大).所以串口通讯中对垃圾数据的防护及解析的顺序方法就显的很重要. if(USART_GetITStatus(UART4,USART_IT_RXNE))    {        USART_ITConf

前端编程中的数据与标签分离

很久很久以前跟大神kobe讨论了一下这个话题,大神的意思是将数据绑定到标签内,获取数据时从标签的attributes的值得到数据.更新数据时重新更新attributes即可. 但是我用了一个对象Data={}来保存数据,在标签上只保存ID,获取数据时可以从Data里进行查找,更新数据时除了更新view,也要更新Data.虽然看起来多写了一点代码, 但是大大降低了耦合度,实现了模块化,可读性也更强,尤其是当我们改变DOM结构的时候,低耦合的好处立刻就体现了出来,比如我们们用ul和li实现了一组数据

使用Windows API进行串口编程

串口通信一般分为四大步:打开串口->配置串口->读写串口->关闭串口,还可以在串口上监听读写等事件. 1.打开和关闭串口 Windows中串口是作为文件来处理的,调用CreateFile()函数可以打开串口,函数执行成功返回串口句柄,出错返回INVALID_HANDLE_VALUE. HANDLE WINAPI CreateFile( _In_ LPCTSTR lpFileName,//要打开或创建的文件名 _In_ DWORD dwDesiredAccess,//访问类型 _In_ D

【转】虚拟串口VSPM解决串口编程问题

通过串口调试软件 UartAssist.exe 和虚拟串口软件 VSPM,可以解决串口编程时没用硬件调试的问题,通过VSPM虚拟出串口设备,让程序发送信息到 VSPM 设备后通过 UartAssist.exe 直接回显信息,可以方便的调试串口通信程序. UartAssist 下载:http://download.csdn.net/detail/zh405123507/4198012 VSPM虚拟串口 下载: http://download.csdn.net/detail/zh405123507/

【ALB技术笔记】基于多线程方式的串行通信接口数据接收案例

基于多线程方式的串行通信接口数据接收案例 广东职业技术技术学院  欧浩源 1.案例背景 在本博客的<[CC2530入门教程-06]CC2530的ADC工作原理与应用>中实现了电压数据采集的程序设计,传感器模块以每1秒发送一帧数据的形式通过串口向上位机发送电压数据.其数据帧由4个字节组成:一个帧头和一个帧尾,中间两个字节为电压数据,其格式如下: 帧头(0xAF)    电压数据高8位    电压数据低8位    帧尾(0xFA) 在篇博文中,将讲述如何通过多线程的方式,从串口接收传感器发送过来的

C#串口通信—向串口发送数据,同步接收返回数据

最近写C#串口通信程序,系统是B/S架构.SerialPort类有一个DataReceived事件,用来接收串口返回的数据,但这种方式在C/S架构下很好用,但B/S就不好处理了.所以写了一个同步模式接收返回数据的方法,不使用DataReceived事件.经过测试,可以正常使用(不支持多线程调用). 一.Machine类 1.Machine类有一个静态变量,定义如下: private static SerialPort serialPort = null; 2.向串口发送数据,同步接收返回数据的方

C#异步数据接收串口操作类

C#异步数据接收串口操作类 使用C#调用传统32位API实现串口操作,整个结构特别的简单.接收数据只需要定义数据接收事件即可. 上传源代码我不会,需要源代码的请与我([email protected])联系.你也可以教我怎么上传源代码. using System; using System.Runtime.InteropServices; /// <summary> /// (C)2003-2005 C2217 Studio  保留所有权利 /// /// 文件名称:     IbmsSeri

单片机第12课:串口通信---中断方式--从计算机接收数据

JP3和P0口连接.用中断的方式来接收数据. #include<reg51.h> //声明初始化子函数 void initSer(); void main() { //初始化子函数调用 initSer(); while(1) { //一句话都没有 } } //定义初始化子函数 void initSer() { //定时器工作方式为2 TMOD = 0x20; //波特率9600,SMOD=0 TH1 = 0xfd; TL1 = 0xfd; //启动定时器 TR1 = 1; //串口工作方式1