Boost asio串行端口从18字节写入损坏的数据

Boost asio串行端口从18字节写入损坏的数据,boost,serial-port,boost-asio,send,Boost,Serial Port,Boost Asio,Send,我在使用boost将数据写入串行端口时遇到问题。 我在这里使用稍微修改过的minicom_客户端类: 消息中的前17个字节被正常发送,但剩余字节被以下内容替代: FD FD FD FD AB AB AB AB AB AB AB AB EE FE EE FE 00 00 00 etc 消息长度正确 当我打电话时 for (int i = 0; i < 128; ++i) miniComClient.do_write(i); 我有三重检查波特率,停止位和奇偶校验 有没有办法改变发

我在使用boost将数据写入串行端口时遇到问题。 我在这里使用稍微修改过的minicom_客户端类:

消息中的前17个字节被正常发送,但剩余字节被以下内容替代:

FD FD FD FD AB AB AB AB AB AB AB AB EE FE EE FE 00 00 00 etc
消息长度正确

当我打电话时

for (int i = 0; i < 128; ++i)
    miniComClient.do_write(i);
我有三重检查波特率,停止位和奇偶校验


有没有办法改变发送缓冲区的大小?也许这是另一个问题

类似0xfdfd、0xabababab和0xfeeefeee的值为

换句话说,您看到的是从堆中分配的未初始化内存。在串行端口编程中,假设一次读取就得到了整个消息,这是一个相当标准的错误。只有在调试程序时才会发生这种情况,从而使程序速度减慢。当它以全速运行时,串行端口是非常慢的设备。您必须注意read_complete()函数中传输的
bytes
,并在收到所有字节之前不解释收到的数据。这需要跟踪全部数据,缓冲部分数据,并知道何时收到完整响应


数据变成垃圾的字节值也是一个幻数。0x10是换行控制字符的ASCII码。它通常用作消息结束指示器。确保将您在线路另一端使用的任何软件配置为不检查线路终端,只显示其实际接收的字节。

此问题的原因是我对原始代码的“轻微”修改

我希望简化整个字节数组的编写(而不是在循环中调用do_write()),因此我添加了以下方法:

void miniComClient::do_write_buffer( QByteArray msg )
    bool write_in_progress = !writeMsgs.empty(); // is there anything currently being written? 

    for(int i = 0; i < msg.size(); ++i)
        writeMsgs.push_back(msg[i]); // store in write buffer 

    if (!write_in_progress) // if nothing is currently being written, then start 
            write_start();
}

这是一个可怕的错误,因为writeMsgs的类型是std:deque,所以它不会连续存储在内存中,所以它会从我想要的点发送一些字节,然后发送垃圾。

我使用RealTerm和Hercules工具在另一端接收数据,所以这个问题与数据发送有关。谢谢你指向神奇的数字。我正在进一步搜索。再次感谢您,但当我将呼叫更改为仅发送0x02时,它在同一位置中断,因此换行符在这里不是问题。请在您的问题中包含相关源代码。我已添加标题和源的链接,并在我的回答中解释了修改。
void miniComClient::do_write_buffer( QByteArray msg )
    bool write_in_progress = !writeMsgs.empty(); // is there anything currently being written? 

    for(int i = 0; i < msg.size(); ++i)
        writeMsgs.push_back(msg[i]); // store in write buffer 

    if (!write_in_progress) // if nothing is currently being written, then start 
            write_start();
}
void miniComClient::write_start( void )
{
    // Start an asynchronous write and call write_complete when it completes or fails 
    boost::asio::async_write(serialPort, 
            boost::asio::buffer(&writeMsgs.front(), writeMsgs.size()), 
            boost::bind(&miniComClient::write_complete, 
            this, 
            boost::asio::placeholders::error));
}