Boost串口通信 boost::asio::serial_port基本使用

发布时间:2020-07-08 22:25:13 作者:fengyuzaitu
来源:网络 阅读:4754

boost库有一个asio,支持串口通信。
步骤:
  1、产生一个boost::asio::io_service(前摄模式,类似于完成端口,不过,可以针对不同IO对象)
  2、构造一个boost::asio::serial_port,有两种方法:
      (一)boost::asio::serial_port m_serialPort(m_IoService, "COM1");
      (二)boost::asio::serial_port m_serialPort(m_IoService);
         m_serialPort.open("COM1"); 
注意这种方式打开,如果串口没有准备好,会导致程序抛异常,导致程序崩溃,所以应该要try{} catch包含,或者使用如下的方式
 boost::system::error_code ec;
 serial_port sp(iosev);
 m_serialPort.open("COM1", ec);
 if (ec) return;
或者
 try
 {
             boost::asio::serial_port m_serialPort(m_IoService);
         m_serialPort.open("COM1"); s
 }
 catch (exception& err)
 {
 }

  3、设置串口参数:波特率、奇偶校验 位、停止位、字符大小和流量控制,通过set_option方法 
boost::asio::serial_port::baud_rate      波特率
boost::asio::serial_port::parity            奇偶校验,可以为serial_port::parity::none / odd / even。
boost::asio::serial_port::flow_control      流量控制, 可以为serial_port::flow_control::type,enum类型,可以是none software hardware
boost::asio::serial_port::stop_bits          停止位,    可以为serial_port::stop_bits::one /onepointfive /two
boost::asio::serial_port::character_size   字符大小
  4、数据读写
    read_some
    write_some
      async_read_some
    async_write_some
      5、同步读取例子

 io_service iosev;
 boost::system::error_code ec;
 serial_port sp(iosev);
 sp.open("COM1", ec);
 
 if (ec) return;
 sp.set_option(serial_port::baud_rate(9600));
 sp.set_option(serial_port::flow_control(serial_port::flow_control::none));
 sp.set_option(serial_port::parity(serial_port::parity::none));
 sp.set_option(serial_port::stop_bits(serial_port::stop_bits::one));
 sp.set_option(serial_port::character_size(8));

 std::string strCompleteMsg;
 boost::asio::streambuf content_sb;
 int bytes = 0;

 while (1)
 {
  strCompleteMsg = "";
  bytes = 0;
  while (strCompleteMsg.find("\r\n") == std::string::npos)
  {
   bytes += boost::asio::read(sp, content_sb, boost::asio::transfer_exactly(1), ec);
   if (ec) break;

   boost::asio::streambuf::const_buffers_type cont_bufs = content_sb.data();
   strCompleteMsg = std::string(boost::asio::buffers_begin(cont_bufs), boost::asio::buffers_begin(cont_bufs) + bytes);
  }
 }


问题

        按照提供的代码,在阻塞等待时间的过程中,会导致Win10系统崩溃,崩溃的信息如下:
1)第一种情形 终止代码:DRIVER_IRQL_NOT_LESS_EQUAL
2)第二种情形  wdf01000sys蓝屏

解决
1)通过串口转网卡,连接到串口服务器解决
2)采用Windows的原生接口解决


推荐阅读:
  1. Python 实现Serial 与STM32J进行串口通讯
  2. 使用python serial 获取所有的串口名称的实例

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

serial port

上一篇:Mongodb基础实践(二)

下一篇:PHP_OS内核预定义常量

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》