我对这个看似简单的任务非常头疼:向我的设备发送一个中断信号,比如 wxTerm (或任何类似的终端应用程序)。
根据我的测试和设备规范,此信号必须长达125ms。
它应该会产生特定的响应,但我得到的响应比预期的更长,并且传输的日期是错误的。
e.g:
它应该回应什么08 00 81 00 00 01 07 00
它的回复08 01 0A 0C 10 40 40 07 00 7F
真正令我难以置信的是,在我使用wxTerm查看可用的com-ports(没有连接或发送任何内容)之后,我的代码开始工作了!我可以发送尽可能多的休息时间,从那时起我就得到了我的回复。我必须重置我的电脑才能再试一次。
这到底是怎么回事?!
这是我通过中断信号重置的代码:
minicom_client(boost::asio::io_service& io_service, unsigned int baud, const string& device)
: active_(true),
io_service_(io_service),
serialPort(io_service, device)
{
if (!serialPort.is_open())
{
cerr << "Failed to open serial port\n";
return;
}
boost::asio::serial_port_base::flow_control FLOW( boost::asio::serial_port_base::flow_control::hardware );
boost::asio::serial_port_base::baud_rate baud_option(baud);
serialPort.set_option(FLOW);
serialPort.set_option(baud_option);
read_start();
std::cout << SetCommBreak(serialPort.native_handle()) << std::endl;
std::cout << GetLastError() << std::endl;
boost::posix_time::ptime mst1 = boost::posix_time::microsec_clock::local_time();
boost::this_thread::sleep(boost::posix_time::millisec(125));
boost::posix_time::ptime mst2 = boost::posix_time::microsec_clock::local_time();
std::cout << ClearCommBreak(serialPort.native_handle()) << std::endl;
std::cout << GetLastError() << std::endl;
boost::posix_time::time_duration msdiff = mst2 - mst1;
std::cout << msdiff.total_milliseconds() << std::endl;
}
编辑:
只需要查看wxTerm的com-port组合框选择 - 不需要建立活动连接以使我的代码工作。
我猜,当wxTerm正在为串口组合框创建列表时,缺少某种初始化,这就完成了。
答案 0 :(得分:0)
在深入研究之后,我发现,我必须正确设置character_size
才能使其正常工作。
然而,我并没有真正忘记这一点,直到现在才有必要。当我的设备已经处于重置后状态时,他们会根据我的请求发送数据 - 所以一切都很好,我只需要指定baud_rate
。
因为没有主动流控制是一个经常使用的默认值,我想,这可能是一些错误。但是,实际上只需要设置character_size
。然后用预期答案回复中断信号。
这是最小的设置:
minicom_client(boost::asio::io_service& io_service, unsigned int baud, const string& device)
: active_(true),
io_service_(io_service),
serialPort(io_service, device)
{
if (!serialPort.is_open())
{
cerr << "Failed to open serial port\n";
return;
}
boost::asio::serial_port_base::character_size CSIZE( 8 );
boost::asio::serial_port_base::baud_rate baud_option(baud);
serialPort.set_option( CSIZE );
serialPort.set_option(baud_option);
read_start();
std::cout << SetCommBreak(serialPort.native_handle()) << std::endl;
std::cout << GetLastError() << std::endl;
boost::posix_time::ptime mst1 = boost::posix_time::microsec_clock::local_time();
boost::this_thread::sleep(boost::posix_time::millisec(125));
boost::posix_time::ptime mst2 = boost::posix_time::microsec_clock::local_time();
std::cout << ClearCommBreak(serialPort.native_handle()) << std::endl;
std::cout << GetLastError() << std::endl;
boost::posix_time::time_duration msdiff = mst2 - mst1;
std::cout << msdiff.total_milliseconds() << std::endl;
}
但是,为了确保,我现在正在设置所有串口参数。
此处找到的示例文件Boost Asio serial_port - need help with io帮助了解。