0

我正在尝试使用 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 检查输出。除了波特率之外,我还使用了为升压串行端口指定的所有默认串行设置(我也尝试过明确设置它们但没有效果)。

4

2 回答 2

1

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

看起来你错过了这个:

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

如果数据位数、奇偶校验位、起始位和停止位与默认值不同,也需要配置它们。

如果还是不能排序,就在输出端贴个示波器,对比一下发送端和接收端的波形。你会看到这样东西。

于 2012-12-21T22:02:14.237 回答
1

这是查找此问题时的热门搜索结果,所以我想我会给出我认为正确的答案:

在撰写本文时,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));
}
于 2019-05-15T15:45:44.973 回答