提升asio串口最初发送错误数据

时间:2012-12-21 21:34:26

标签: c++ boost serial-port boost-asio

我正在尝试使用boost asio进行串行通信。我目前在Windows工作,但最终将代码转移到Linux。当我重新启动我的计算机时,从程序发送的数据不是它应该是什么(例如我发送一个空后跟一个回车并在二进制中得到“00111111 10000011”)并且它不一致(多个空值产生不同的二进制) 。

但是,只要我使用任何其他程序将任何数据发送到串行端口并再次运行程序,它就能完美运行。我想我必须在端口的初始化中遗漏一些东西,但是我的研究还没有解决任何问题。

以下是我打开端口的方法:

// An IOService to get the socket to work
boost::asio::io_service *io;
// An acceptor for getting connections
boost::shared_ptr<boost::asio::serial_port> port;

// Cnstructor Functions
void Defaults() {
    io = new boost::asio::io_service();

    // Set Default Commands
    command.prefix = 170;
    command.address = 3;
    command.xDot[0] = 128;
    command.xDot[1] = 128;
    command.xDot[2] = 128;
    command.throtle = 0;
    command.button8 = 0;
    command.button16 = 0;
    command.checkSum = 131;
}

void Defaults(char * port, int baud) {
    Defaults();

    // Setup the serial port
    port.reset(new boost::asio::serial_port(*io,port));
    port->set_option( boost::asio::serial_port_base::baud_rate( baud ));

    // This is for testing
    printf("portTest: %i\n",(int)port->is_open());
    port->write_some(boost::asio::buffer((void*)"\0", 1));
    boost::asio::write(*port, boost::asio::buffer((void*)"\0", 1));
    boost::asio::write(*port, boost::asio::buffer((void*)"\r", 1));
    boost::asio::write(*port, boost::asio::buffer((void*)"\r", 1));
    Sleep(2000);
}

编辑:在尝试删除不相关的代码时,我意外删除了设置波特率的行,我将其添加回来。另外,我正在使用零调制解调器和Docklight检查输出。除了波特率,我使用为升级串口指定的所有默认串行设置(我也试过明确地设置它们没有效果)。

2 个答案:

答案 0 :(得分:0)

您还没有说过如何检查发送的内容,但这可能是两端之间的波特率不匹配。

看起来你错过了这个:

port->set_option( boost::asio::serial_port_base::baud_rate( baud ) );

如果数据位,奇偶校验以及起始和停止位的数量与默认值不同,则还需要进行配置。

如果仍然无法对其进行排序,请在输出上粘贴示波器并比较发送器和接收器的波形。你会看到like this

答案 1 :(得分:0)

这是寻找此问题时搜索结果的顶部,所以我想我应该给出正确的答案:

在撰写本文时,Boost Asio已出现错误,并且未在Windows平台上设置端口的默认值。取而代之的是,它将获取端口上的当前值,然后将其重新烘焙。重新启动后,该端口尚未使用,因此其Windows默认值可能对通信没有用(字节大小通常默认为9)。将端口与正确设置了值的程序或库一起使用后,Asio之后获取的值是正确的。

要解决此问题,直到Asio合并此修复程序,只需在端口上显式设置所有内容,即:

using boost::asio::serial_port;
using boost::asio::serial_port_base;

void setup_port(serial_port &serial, unsigned int baud)
{
    serial.set_option(serial_port_base::baud_rate(baud));
    serial.set_option(serial_port_base::character_size(8));
    serial.set_option(serial_port_base::flow_control(serial_port_base::flow_control::none));
    serial.set_option(serial_port_base::parity(serial_port_base::parity::none));
    serial.set_option(serial_port_base::stop_bits(serial_port_base::stop_bits::one));
}