2012-10-22 33 views
0

我对这个看似简单的任务感到非常头痛:发送一个中断信号给我的设备,如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正在为串口组合框创建列表时完成的。

+0

这是一个疯狂的猜测:你的“设备”需要进入适当的状态,然后才会根据你正在查看的规范进行响应。 'wxTerm'在中断之前将它置于该状态,否则你的代码不会。 – alexis

+0

@alexis - 是和不是 - 看起来,它已经足以启动wxTerm并转到选择Combo的组合框 - 无需连接任何东西!在此之后,我的代码适用于每个设备,并且我必须重新启动,以便重建此行为。 – Jook

+0

那么也许这是你的计算机的端口需要进入适当的状态? – alexis

回答

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帮助。