使用后台线程不断从串行端口读取数据

2023-12-04

由于串行端口通信是异步的,我在涉及与 RS 232 设备通信的项目的早期就发现,我必须有一个后台线程不断读取端口接收的数据。现在,我使用 IronPython (.NET 4.0),因此我可以访问 .NET 中内置的灵活 SerialPort 类。这让我可以编写这样的代码:

self.port = System.IO.Ports.SerialPort('COM1', 9600, System.IO.Ports.Parity.None, 8, System.IO.Ports.StopBits.One)
self.port.Open()
reading = self.port.ReadExisting() #grabs all bytes currently sitting in the input buffer

够简单的。但正如我提到的,我希望在新数据到达时不断检查该端口是否有新数据。理想情况下,我会有操作系统tell只要有数据等待,就随时联系我。你知道吗,我的祈祷已经得到回应,有一个DataReceived提供活动!

self.port.DataReceived += self.OnDataReceived

def OnDataReceived(self, sender, event):
    reading = self.port.ReadExisting()
    ...

可惜这并没有什么价值,因为不保证会引发此事件!

不保证每个接收到的字节都会引发 DataReceived 事件。

那么,回到编写侦听器线程。我很快就完成了这个BackgroundWorker这只是调用port.ReadExisting()一遍又一遍地。它会在字节进入时读取字节,并且当它看到行结尾时 (\r\n),它将读取的内容放入linebuffer。然后我的程序的其他部分看看linebuffer查看是否有任何完整的线路等待使用。

现在,这是一个经典生产者-消费者问题,显然。生产者是BackgroundWorker,将完整的线放入linebuffer。消费者是一些消耗这些行的代码linebuffer尽可能快。

然而,消费者的效率有点低。现在他不断地检查linebuffer,每次发现它是空的都感到失望;虽然每隔一段时间就会发现里面有人排队。优化这一点的最佳方法是什么,以便消费者仅在有空闲线路时醒来?这样消费者就不会不断地转来转去访问linebuffer,这可能会引入一些并发问题。

另外,如果有一种更简单/更好的方法来不断地从串行端口读取数据,我愿意接受建议!


我不明白为什么你不能使用DataReceived事件。正如文档所述

DataReceived 事件不是 保证每个字节都会升高 已收到。使用 BytesToRead 属性 确定还剩多少数据 被读取到缓冲区中。

这就是说,不能保证您为每个单独的数据字节获得单独的事件。您可能需要使用以下命令检查端口上是否有多个可用字节BytesToRead属性并读取相应的字节数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用后台线程不断从串行端口读取数据 的相关文章

随机推荐

  • 如何更新 dplyr 管道中的值?

    我想更新新列中的值 这是我的数据 people lt c father parents father children girl boy grand father grand mother grandparents dataset0 lt
  • SoundPool 不播放声音(而 MediaPlayer 播放声音)

    我正在尝试在应用程序中播放声音 但是 使用 SoundPool 我无法这样做 代码非常简单 我看不出哪里会失败 类似的代码但使用 MediaPlayer 确实有效 但我对使用 SoundPool 感兴趣 声音池代码 private void
  • 使用 numpy 支持覆盖字典

    使用来自的基本思想如何 完美 覆盖字典 我编写了一个基于字典的类 该类应该支持分配点分隔键 即Extendeddict level1 level2 value level1 level2 value 代码是 import collectio
  • 如何在asp中使用数据库创建多语言网站

    如何在数据库存储翻译的aspx中创建多语言网站 我搜索了很多文章 但没有唯一的解决方案 有人有好主意或知道任何好文章吗 您将需要创建自己的数据库资源提供程序 参见这篇文章 http msdn microsoft com en us libr
  • 为什么我不能在 Go 中用一种类型的切片替换另一种类型?

    我正在尝试了解 Go 的类型转换规则 假设我们有这些接口 type woofer interface woof type runner interface run type woofRunner interface woofer runne
  • 如何获取自动刷新的日期?

    我正在尝试获取页面上刷新的日期 这样我就不必每天手动刷新它 我有这段代码 但它似乎不起作用 日期会显示 但日期更改时不会更新 作为参考 这是在 BrightSign 显示屏上使用的 谁能告诉我我做错了什么 我是一个 JavaScript 初
  • 从 Servlet 访问 SSL 私钥

    我在本地运行 Apache Tomcat 并使用 OpenSSL 安装了自签名证书 我还有一个正在运行的 servlet 我想做的是 Servlet 接收 POST 参数 并将回显使用服务器的 PrivateKey 签名的参数 也就是说 将
  • 运行 playbook 后访问 ansible playbook 结果

    我正在使用 ansible 脚本运行ansible pull在我看不到的远程计算机 客户端 上 我想确保 ansible playbook 成功执行然后应该发送摘要 ansible playbook 如果未成功执行 应发送失败的摘要 启用a
  • 来自客户端的 Instagram API

    我正在尝试从客户端调用 Instagram API 端点 我只能使用 JSONP 访问基于 GET 的端点 这Instagram 推荐 对于那些需要 POST 或 DELETE 的人 似乎没有启用 CORS 因此这些类型的 ajax 调用会
  • 如何等待齐射响应完成其在intentservice内的工作?

    与intentservice合作 在后台使用 Google Volley 获取7个Rss Feed链接的数据 并使用ResultReceiver获取结果 但我无法配置如何等待volley响应来完成触发标志的工作ResultReceiver显
  • 黑白 imageNamed 和 imageWithContentsOfFile 的区别 [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 黑白有什么区别图像命名 and 带文件内容的图像在 Objective C 中 图片名称 imageNamed 缓存的是您的图像 您失去了对内存的控制 不能保证释放对象会真正释放
  • 通过构造函数参数 0 表达的不满足的依赖关系:没有类型的合格 bean - Spring boot

    我正在使用 Spring boot 来实现 Java 应用程序 其中一个控制器称为HealthCheckerController 定义在application包裹 HealthCheckerController java package a
  • 不可变类型的 ID

    我对可变对象和不可变对象之间的区别有点困惑 我尝试了以下代码块来查找对象的 id tuple1 Object1 Object2 print id tuple1 tuple2 Object1 Object2 print id tuple2 l
  • SQL 数据库项目:根据构建配置构建不同的脚本

    我想解决的问题是根据构建配置构建不同的脚本 假设我们有两个 SQL Server 实例 连接链接服务器的企业版 用于离线开发和单元测试的 LocalDb 版本 当 LocalDB 用本地表替换这些视图时 企业版具有链接服务器的视图 这些链接
  • Three.js:纹理全黑

    我有一个简单的盒子几何形状 我试图用纹理来装饰它 然而 我的盒子根本不显示 或者可能是 100 黑色 当前的这个问题是从这个问题 我已经更新了代码以反映给出的答案gaitat关于原来的问题 我写过另一个简单的测试站点来演示这个新问题 这是该
  • 将“Kendo.Mvc.UI.DataSourceRequest”类型的对象从 jquery 传递到 Mvc Action

    客观的 我想传递一个类型的对象Kendo Mvc UI DataSourceRequest到 Mvc 操作 以便我可以根据应用的排序和过滤从数据库获取结果 问题 障碍 当对象到达操作时 它会变为 null 我的控制器操作 public Ac
  • 如何上传多个文件到BlobStore?

    我正在尝试将表单中的多个文件上传到 BlobStore Form
  • 为 IE 包含 es6-promise 的优雅方式

    Since Promise is 不支持在所有 IE 版本中 我想让 IE 用户下载 HTML 格式的 pollyfill 然而 不支持条件注释在 IE 10 和 11 中 所以上面的代码在 IE 10 和 11 中不起作用 然后 微软提供
  • 如果颁发新的刷新令牌,旧的刷新令牌仍然有效吗?

    我的应用程序使用 Google 刷新令牌 从 Google 获取 access token 我在这里有两个问题 我知道 Google 刷新令牌 6 个月内不会过期 请参阅此处的文档 说我有一个刷新令牌refresh token old1 月
  • 使用后台线程不断从串行端口读取数据

    由于串行端口通信是异步的 我在涉及与 RS 232 设备通信的项目的早期就发现 我必须有一个后台线程不断读取端口接收的数据 现在 我使用 IronPython NET 4 0 因此我可以访问 NET 中内置的灵活 SerialPort 类