当前位置: 首页 > article >正文

boost linux 串口,boost 串口编程 | 求索阁

ASIO不仅支持网络通信,还能支持串口通信。要让两个设备使用串口通信,关键是要设置好正确的参数,这些参数是:波特率、奇偶校验 位、停止位、字符大小和流量控制。两个串口设备只有设置了相同的参数才能互相交谈。

ASIO提供了boost::asio::serial_port类,它有一个set_option(const SettableSerialPortOption& option)方法就是用于设置上面列举的这些参数的,其中的option可以是:

serial_port::baud_rate 波特率,构造参数为unsigned int

serial_port::parity 奇偶校验,构造参数为serial_port::parity::type,enum类型,可以是none, odd, even。

serial_port::flow_control 流量控制,构造参数为serial_port::flow_control::type,enum类型,可以是none software hardware

serial_port::stop_bits 停止位,构造参数为serial_port::stop_bits::type,enum类型,可以是one onepointfive two

serial_port::character_size 字符大小,构造参数为unsigned int

演示代码

#include

#include

#include

using namespace std;

using namespace boost::asio;

int main(int argc, char* argv[])

{

io_service iosev;

// 串口COM1, Linux下为“/dev/ttyS0”

serial_port sp(iosev, "COM1");

// 设置参数

sp.set_option(serial_port::baud_rate(19200));

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));

// 向串口写数据

write(sp, buffer("Hello world", 12));

// 向串口读数据

char buf[100];

read(sp, buffer(buf));

iosev.run();

return 0;

}

上面这段代码有个问题,read(sp, buffer(buf))非得读满100个字符才会返回,串口通信有时我们确实能知道对方发过来的字符长度,有时候是不能的。

如果知道对方发过来的数据里有分隔符的话(比如空格作为分隔),可以使用read_until来读,比如:

boost::asio::streambuf buf;

// 一直读到遇到空格为止

read_until(sp, buf, ' ');

copy(istream_iterator(istream(&buf)>>noskipws),

istream_iterator(),

ostream_iterator(cout));

另外一个方法是使用前面说过的异步读写+超时的方式,代码如下:

#include

#include

#include

using namespace std;

using namespace boost::asio;

void handle_read(char *buf,boost::system::error_code ec,

std::size_t bytes_transferred)

{

cout.write(buf, bytes_transferred);

}

int main(int argc, char* argv[])

{

io_service iosev;

serial_port sp(iosev, "COM1");

sp.set_option(serial_port::baud_rate(19200));

sp.set_option(serial_port::flow_control());

sp.set_option(serial_port::parity());

sp.set_option(serial_port::stop_bits());

sp.set_option(serial_port::character_size(8));

write(sp, buffer("Hello world", 12));

// 异步读

char buf[100];

async_read(sp, buffer(buf), boost::bind(handle_read, buf, _1, _2));

// 100ms后超时

deadline_timer timer(iosev);

timer.expires_from_now(boost::posix_time::millisec(100));

// 超时后调用sp的cancel()方法放弃读取更多字符

timer.async_wait(boost::bind(&serial_port::cancel, boost::ref(sp)));

iosev.run();

return 0;

}

http://www.lryc.cn/news/2419264.html

相关文章:

  • WebLogic JNDI 编程
  • Response.Cookies 和 Request.Cookies
  • Ubuntu下使用Wine安装QQ
  • Java中static作用及用法详解
  • java httpclient4_httpclient4使用说明
  • componentsJoinedByString和componentsSeparatedByString的使用
  • PHP中用header(Location: test.php)进行跳转时应注意的问题
  • Linux服务器防御最全教程
  • 杀毒软件 对应的进程名称
  • 龙将加速浏览器_《看门狗:军团》即将开启预载,迅游加速器支持下载和联机加速 18183手机游戏网...
  • VC 界面编程总结
  • 交换机基础配置-新版(4)
  • 没事也研究一下外挂--C#简单游戏外挂制作(以Warcraft Ⅲ为例)
  • 【MATLAB】等高线的绘制
  • 8、全国世界城市列表API接口,免费好用
  • ASN.1编码学习笔记
  • 【C】 C语言入门——带你从0开始
  • 数学思想方法猜想与反驳(3)反例反驳
  • android 手机芯片 datasheet,Datasheet (Alldatasheet.com)
  • BAT等大厂已开源的70个实用工具盘点(附下载地址)
  • 常用实用网站整理大全
  • 网络设计总体要求设计方案
  • 什么是次世代?建模初学者看过来
  • 老毛桃U盘装XP,ntldr is missing
  • 【MQ-3 酒精检测器与 Arduino检测酒精】
  • 定时关机命令——shutdown
  • 采轩服饰工业园选择飞鱼星完成无线覆盖
  • 将pygame库编写的小游戏打包为exe文件
  • 启动应用程序出现d3dx9_33.dll缺少问题解决
  • GSM功率等级