我对这个看似简单的任务感到非常头痛:发送一个中断信号给我的设备,如wxTerm(或任何类似的终端应用程序)。根据我的测试和设备规格,该信号必须长125ms。这种尝试发送中断信号有什么问题?
它应该导致一个特定的响应,但我得到的是比预期更长的响应,并且传输日期是错误的。
如:
它应该响应08 00 81 00 00 01 07 00
它做什么回应08 01 0A 0C 10 40 40 07 00 7F
真正博格尔斯我的是,我已经用过之后wxTerm看我可用的COM端口(无连接或发送任何东西),我的代码开始工作!我可以随时发送尽可能多的休息时间,从那时起我就可以得到我的答复。我必须重置我的电脑才能再次尝试。
这到底是怎么回事?
这里是我的一个突破信号复位代码:
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端口 - 为了使我的代码正常工作,不需要建立活动连接。
我猜测,有一些初始化丢失,这是在wxTerm正在为串口组合框创建列表时完成的。
这是一个疯狂的猜测:你的“设备”需要进入适当的状态,然后才会根据你正在查看的规范进行响应。 'wxTerm'在中断之前将它置于该状态,否则你的代码不会。 – alexis
@alexis - 是和不是 - 看起来,它已经足以启动wxTerm并转到选择Combo的组合框 - 无需连接任何东西!在此之后,我的代码适用于每个设备,并且我必须重新启动,以便重建此行为。 – Jook
那么也许这是你的计算机的端口需要进入适当的状态? – alexis