不完整的读数据串口

时间:2015-06-20 04:01:38

标签: visual-c++ serial-port

我想从arduino到VC ++读取6个数据传感器"握手"方法,我发送" 1"到arduino然后这个设备将数据发送到PC。 我的数据格式是:  &data0,data1,data2,data3,data4,data5%

但是当我用VC ++数据读取它总是不完整的时候,甚至认为缓冲区的大小足以容纳所有数据

这是我的vC ++程序的快照,我把它放在计时器事件

    DWORD nbytes;
    char buffer[24];

    //Read Sensors

    if(!WriteFile( hnd_serial, "1", 1, &nbytes, NULL )){KillTimer(cTimer1);MessageBox(L"Write Com Port fail!");return;}
    Sleep(5);
    if(!ReadFile( hnd_serial, buffer, 23, &nbytes, NULL )){KillTimer(cTimer1);MessageBox(L"Read Com Port fail!");return;}
    Sleep(50);

我已经改变了波特率但结果仍然相同。 但如果我减少一个数据,如data5(成为5个传感器),数据就完成了。 我的程序有问题吗?

2 个答案:

答案 0 :(得分:0)

您可以将ReadFile()函数放在do-while循环中。

do{
    if(!ReadFile( hnd_serial, buffer, 23, &nbytes, NULL )){
        //Process error
        break;
    }
    if (nbytes>= 6)
    {
        //Put your flag - or process here
        break;
    }
}while(nbytes);

ReadFile()仅返回当前缓冲区状态,它不会等待接收到满的预期数据

答案 1 :(得分:0)

您不会说出您正在使用的波特率。

您也不会说出已设置的超时(如果有)。

让我们假设它的9600意味着端口每秒传输960个字节。所以每个字节只有1毫秒以上。

如果你的睡眠(5)应该等待" 1"要发送AND以便数据返回,那么您应该等待足够长的时间来传输所有字节。假设设置了超时,以便ReadFile立即返回RX缓冲区中的任何字节,那么您有可能读得太快。

尝试更大的延迟。