【问题标题】:What is wrong with this attempt of sending a break-signal?这种发送中断信号的尝试有什么问题?
【发布时间】:2012-10-22 13:13:04
【问题描述】:

我对这个看似简单的任务感到非常头疼:向我的设备发送中断信号,就像 wxTerm(或任何类似的终端应用程序)所做的那样。

根据我的测试和设备规范,此信号的长度必须为 125 毫秒。

它应该会导致特定的响应,但我得到的是比预期更长的响应,并且传输的日期是错误的。

例如:

它应该回复什么08 00 81 00 00 01 07 00

它确实响应08 01 0A 0C 10 40 40 07 00 7F

真正让我吃惊的是,在我使用 wxTerm 查看我可用的通信端口(没有连接或发送任何东西)之后,我的代码开始工作!我可以发送尽可能多的休息时间,从那时起我就会得到回复。我必须重置我的电脑才能重试。

这到底是怎么回事?!

这是我通过中断信号重置的代码:

 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-ports 的组合框选择 - 无需建立活动连接即可​​使我的代码正常工作。

我猜,当 wxTerm 为串行端口组合框创建列表时,缺少某种初始化。

【问题讨论】:

  • 这是一个疯狂的猜测:您的“设备”需要进入适当的状态,然后它才会根据您正在查看的规范做出响应。 wxTerm 在中断之前将其置于该状态,而您的代码不会。
  • @alexis - 是和否 - 似乎启动 wxTerm 并转到 com-ports 的选择组合框就足够了 - 无需连接任何东西!在此之后,我的代码适用于每台设备,我必须重新启动才能重建这种行为。
  • 那么可能是您的计算机端口需要进入正确的状态?
  • @alexis 是的,我也这么认为,但我怎么才能知道,这可能是哪个州?!我已经通过一些疯狂的想法从微软通信功能参考中寻找可能的方法 - 例如。 FlushCommBuffers 没有帮助 - 任何想法哪些设置/开关可能导致这种行为?
  • 您可以从提供更具体的信息开始。我不擅长硬件问题,但还有其他人可以提供帮助。但是没有人可以帮助您解决“我的设备无法正常工作”的问题——您的问题将会结束。

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


【解决方案1】:

在深入研究后我发现,我必须正确设置 character_size 才能使其正常工作。

但是我并没有真正忘记这一点,直到现在才没有必要。当我的设备已经处于重置后状态时,它们会根据我的请求发送数据 - 所以一切都很好,我只需要指定 baud_rate

因为 no active flow control 是一个经常使用的默认值,我想,这里可能有一些错误。但是实际上只需要设置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 在此过程中提供了帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 2019-09-23
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多