Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何丢弃以boost::asio发送的数据?

如何丢弃以boost::asio发送的数据?
EN

Stack Overflow用户
提问于 2014-03-22 09:51:14
回答 1查看 6.1K关注 0票数 5

我正在编写一些使用boost::asio类读写串行设备的代码。然而,当在程序之间发送几个字符串时,我注意到在接收程序中,数据是按照写入串口的顺序读取的,而不是从其他程序发送的数据--如果几秒钟后我开始读取数据,我就不会得到当前发送的值,而是以前发送的值。我假设这是我设置boost::asio::serial_port的方式造成的

代码语言:javascript
运行
AI代码解释
复制
int main(int argc, char const *argv[]){

    int baud=atoi(argv[1]);
    std::string pty=argv[2];

    printf("Virtual device: %s\n",pty.data());
    printf("Baud rate: %d\n",baud);

    boost::asio::io_service io;
    boost::asio::serial_port port(io, pty);
    port.set_option(boost::asio::serial_port_base::baud_rate(baud));

    // counter that writes to serial port in 1s intervals
    int val=0;
    while (1){
        std::string data=std::to_string(val);
        data+='\n';
        std::cout << data;
        write(port,boost::asio::buffer(data.c_str(),data.size()));
        sleep(1); 
        val++;
        data.clear();
    }

    port.close(); 
    return 0;
}

在将新值发送到串行端口(我认为应该在代码的写()部分上完成)时,是否有一种方法强制丢弃过去的数据?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-23 15:04:06

Boost.Asio不提供用于刷新串口缓冲区的更高级别的抽象。但是,这通常可以通过让特定于平台的调用(如tcflush()PurgeComm() )在串口的手柄()上操作来实现。

每个串行端口都有一个接收和发送缓冲器,并且在一个或两个缓冲器上进行刷新操作。例如,如果连接了两个串行端口(/dev/pts/3/dev/pts/4),并且程序A打开并写入了/dev/pts/3,那么它只能刷新与/dev/pts/3相关的缓冲区(在/dev/pts/3上接收的数据没有读取,数据被写入/dev/pts/3但没有传输)。因此,如果程序B启动、打开/dev/pts/4并希望读取非陈旧数据,那么程序B需要在打开串口后为/dev/pts/4刷新接收缓冲区。

这里是一个运行在CentOs上的完整示例。当该示例作为编写器运行时,它将每秒钟向串行端口写入一个顺序递增的数字。当该示例作为编写器运行时,它将读取5个数字,睡眠5秒,并每隔一次迭代刷新其读取缓冲区:

代码语言:javascript
运行
AI代码解释
复制
#include <iostream>
#include <vector>
#include <boost/asio.hpp>
#include <boost/thread.hpp>

/// @brief Different ways a serial port may be flushed.
enum flush_type
{
  flush_receive = TCIFLUSH,
  flush_send = TCOFLUSH,
  flush_both = TCIOFLUSH
};

/// @brief Flush a serial port's buffers.
///
/// @param serial_port Port to flush.
/// @param what Determines the buffers to flush.
/// @param error Set to indicate what error occurred, if any.
void flush_serial_port(
  boost::asio::serial_port& serial_port,
  flush_type what,
  boost::system::error_code& error)
{
  if (0 == ::tcflush(serial_port.lowest_layer().native_handle(), what))
  {
    error = boost::system::error_code();
  }
  else
  {
    error = boost::system::error_code(errno,
        boost::asio::error::get_system_category());
  }
}

/// @brief Reads 5 numbers from the serial port, then sleeps for 5 seconds,
///        flushing its read buffer every other iteration.
void read_main(boost::asio::serial_port& serial_port)
{
  std::vector<unsigned char> buffer(5);
  for (bool flush = false;; flush = !flush)
  {
    std::size_t bytes_transferred =
        read(serial_port, boost::asio::buffer(buffer));
    for (std::size_t i = 0; i < bytes_transferred; ++i)
      std::cout << static_cast<unsigned int>(buffer[i]) << " ";
    boost::this_thread::sleep_for(boost::chrono::seconds(5));
    if (flush)
    {
      boost::system::error_code error;
      flush_serial_port(serial_port, flush_receive, error);
      std::cout << "flush: " << error.message() << std::endl;
    }
    else
    {
      std::cout << "noflush" << std::endl;
    }
  }
}

/// @brief Write a sequentially increasing number to the serial port
///        every second.
void write_main(boost::asio::serial_port& serial_port)
{
  for (unsigned char i = 0; ; ++i)
  {
    write(serial_port, boost::asio::buffer(&i, sizeof i));
    boost::this_thread::sleep_for(boost::chrono::seconds(1));
  }
}

int main(int argc, char* argv[])
{
  boost::asio::io_service io_service;
  boost::asio::serial_port serial_port(io_service, argv[2]);
  if (!strcmp(argv[1], "read"))
    read_main(serial_port);
  else if (!strcmp(argv[1], "write"))
    write_main(serial_port);
}

socat创建虚拟串口

代码语言:javascript
运行
AI代码解释
复制
$ socat -d -d PTY: PTY:
2014/03/23 16:22:22 socat[12056] N PTY is /dev/pts/3
2014/03/23 16:22:22 socat[12056] N PTY is /dev/pts/4
2014/03/23 16:22:22 socat[12056] N starting data transfer loop with
                                 FDs [3,3] and [5,5]

开始读和写示例:

代码语言:javascript
运行
AI代码解释
复制
$ ./a.out read /dev/pts/3 & ./a.out write /dev/pts/4
[1] 12238
0 1 2 3 4 noflush
5 6 7 8 9 flush: Success
14 15 16 17 18 noflush
19 20 21 22 23 flush: Success
28 29 30 31 32 noflush
33 34 35 36 37 flush: Success

正如输出中所演示的那样,只有当读取器刷新其读取缓冲区:3 4 noflush 5 6 7 8 9 flush 14 15时,才会在序列中跳过数字。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22581315

复制
相关文章
java中finally有什么意义呢,在现实中?举例
马克-to-win: finally有什么意义呢,在现实中?比如你开了一个流处理文件,可能没开成功,或开成功了,但后面的操作失败了,但不管你怎么样,你必须在一个地儿把它关闭,那就是finally块儿。
马克java社区
2021/04/08
5130
java中finally有什么意义呢,在现实中?举例
Java中如何实现序列化,有什么意义?
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决对象流读写操作时可能引发的问题(如果不进行序列化可能会存在数据乱序的问题)。 要实现序列化,需要让一个类实现Serializable接口,该接口是一个标识性接口,标注该类对象是可被序列化的,然后使用一个输出流来构造一个对象输出流并通过writeObject(Object)方法就可以将实现对象写出(即保存其状态);如果需要反序列化则可以用一个输入流建立对象输入流,然后通过readObject方法从流中读取对象。序列化除了能够实现对象的持久化之外,还能够用于对象的深度克隆(可以参考第29题)。
唐怀瑟
2018/08/30
7380
SpringDataA和Mybaits有什么区别,如何使用?
阿粉之前一直都是使用传统的SSM进行开发,也就我们所说的 Spring,SpringMVC,Mybatis,即使使用的SpringBoot,无非也就是这么集中,对于持久层框架的选择,也都是Mybaits,但是阿粉无意中发现,现在使用SpringDataJPA的公司也是非常的多的,所以,今天阿粉来讲一下这个SpringDataJPA.
Java极客技术
2022/12/04
9900
SpringDataA和Mybaits有什么区别,如何使用?
什么是JWT及在JAVA中如何使用?
在不使用JWT的情况下,我们一般选择的是cookie和session来进行服务鉴权(判断是否登录,是否具有某种权限),但是这是针对于只有一个客户端的情况下,现在客户端从pc端增长到了app端,现在就是多端访问了。
叫我阿杰好了
2022/11/07
3.2K0
什么是JWT及在JAVA中如何使用?
在 WordPress 中如何使用 Date 和 Time
使用 Date 和 Time 是程序员一个非常日常的工作,比如定时发布,定时抓取信息等。PHP 提供很多 date/time 函数,但是 WordPress 有自己的一套,下面讲解下 WordPress 中使用 Date 和 Time 的经验和坑。
Denis
2023/04/14
1.7K0
(4)SparkSQL中如何定义UDF和使用UDF
Spark SQL中用户自定义函数,用法和Spark SQL中的内置函数类似;是saprk SQL中内置函数无法满足要求,用户根据业务需求自定义的函数。
NBI大数据
2022/09/26
1K0
(4)SparkSQL中如何定义UDF和使用UDF
预置位和看守位有什么区别?在EasyCVR平台中如何使用?
EasyCVR基于云边端智能协同架构,具有强大的设备接入、视频汇聚管理、全网分发、按需调阅、鉴权播放、智能分析等视频能力与服务。平台开放度高、兼容性强、可支持灵活拓展与第三方集成。
TSINGSEE青犀视频
2023/05/23
5200
MySQL中的profile的意义以及使用场景有哪些?
MySQL可以使用profile分析SQL语句的性能消耗情况。例如,查询到SQL会执行多少时间,并看出CPU、内存使用量,执行过程中系统锁及表锁的花费时间等信息。
AiDBA宝典
2023/08/09
3130
MySQL中的profile的意义以及使用场景有哪些?
Spring 注册 Bean 在配置中的定义和使用 Autowired
因为项目的需要,我们使用了一个第三方的电子邮件库,但是我们希望把这个库在项目中注册成 Bean 然后随时在其他地方使用。
HoneyMoose
2022/09/19
1.9K0
Spring 注册 Bean 在配置中的定义和使用 Autowired
在 Java 中如何使用 transient
Java语言的transient不像class、synchronized和其他熟悉的关键字那样众所周知,因而它会出现在一些面试题中。这篇文章我将为大家讲解transient。
哲洛不闹
2018/09/18
6.5K0
在 Java 中如何使用 transient
在Scrapy中如何使用aiohttp?
当我们从一些代理IP供应商购买代理IP时,他们可能是提供一个网址供我们查询当前可用的代理IP。我们周期性访问这个网址,拿到最新的IP,再分给爬虫使用。
青南
2020/07/16
6.9K0
在HTML中如何使用CSS?
一、前言 在 HTML 中使用 CSS,包括内联式、内嵌式、链接式和导入式。 二、分类 2.1 内联式 内联式是所有样式应用方式中最为直接的一种,它通过对 HTML 标记使用 属性,将 CSS 代码直接写在其中。 内联式是最简单、直接的 CSS 使用方法,但它的针对性很明显,只能作用于当前标记,造成代码冗余,维护比较困难。 2.2 内嵌式 内嵌式与内联式使用方法不同,它将 CSS 代码写在 标记之间,并需要采用 标记进行声明。 使用内嵌式 CSS 用法时 CSS 代码将被集中放在 标记中,这样方便查
企鹅号小编
2018/02/01
9.4K0
在Zeppelin中如何使用Hive
我们来看看强大的 Zeppelin 能够给 Hive 带来什么吧。首先需要安装 Hive 和 Zeppelin。具体请参考如下两篇文章:
smartsi
2020/10/27
7K0
在Zeppelin中如何使用Hive
在Python中如何使用Elasticsearch?
在这篇文章中,我将讨论Elasticsearch以及如何将其整合到不同的Python应用程序中。
马哥linux运维
2019/06/10
8.6K0
在Python中如何使用Elasticsearch?
如何使用es和grafana在tempo中查找trace
Grafana tempo是最近发布的的分布式追踪后端,跟踪发现依赖于其他数据源集成。Tempo的工作是存储大量跟踪,将其放置在对象存储中,并通过ID检索它们。日志和其他数据源使用户能够比以往更快,更强大地直接跳转到跟踪。
有点技术
2020/12/22
4.4K0
在C#中ref和out具体怎么使用?在什么情况下使用?
ref是传递参数的地址,out是返回值,两者有一定的相同之处,不过也有不同点。   使用ref前必须对变量赋值,out不用。   out的函数会清空变量,即使变量已经赋值也不行,退出函数时所有out引用的变量都要赋值,ref引用的可以修改,也可以不修改。   区别可以参看下面的代码应该就明白了:
zls365
2020/08/19
3K0
java中异常(Exception)的定义,意义和用法。举例
System.out.println("马克-to-win:inside try");
马克java社区
2021/04/06
5330
java中异常(Exception)的定义,意义和用法。举例
在Python中如何随心所欲使用自定义模块
Python模块并不神秘,它只是一个Python文件或一组Python文件。使用Python模块,可以编写可重用的、更有条理的代码。例如,可以编写一个通用Python模块来执行CSV文件处理任务,世界各地的数据科学家都可以使用该模块来读取、写入和操作CSV文件。
fanjy
2022/06/04
2.3K0
了解多线程的意义和使用
了解多线程的意义和使用
Java架构师必看
2021/05/14
3340
点击加载更多

相似问题

在指令定义中使用$compile有什么意义?

12

使用[:]有什么意义

260

使用RenderBeginTag和RenderEndTag有什么意义

40

在PHP中使用$this和self::有什么意义?

30

使用Opal有什么意义?

15
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档