如何更可靠地使用SerialPort类

2024-02-04

我一直在使用SerialPort在与我设计的一些外部硬件通信的应用程序中学习一段时间。在上述硬件的调试过程中,我发现了一些不可靠的地方,最近我偶然发现this http://www.sparxeng.com/blog/software/must-use-net-system-io-ports-serialport这似乎是有道理的。

我正在尝试将其实现到我的应用程序中,但是我有两个关于接收数据的问题......

因此,在我链接的文章中,作者提到DataReceived事件是有问题的,并显示了如何使用它的典型代码示例......

port.DataReceived += port_DataReceived;

// (later, in DataReceived event)
try {
    byte [] buffer = new byte[port.BytesToRead];
    port.Read(buffer, 0, buffer.Length);
    raiseAppSerialDataEvent(buffer);
}
catch (IOException exc) {
    handleAppSerialError(exc);
}

然后展示了作者认为正确的方法......

byte[] buffer = new byte[blockLimit];
Action kickoffRead = null;

kickoffRead = delegate {
port.BaseStream.BeginRead(buffer, 0, buffer.Length, 
        delegate (IAsyncResult ar) {
            try {
                int actualLength = port.BaseStream.EndRead(ar);
                byte[] received = new byte[actualLength];
                Buffer.BlockCopy(buffer, 0, received, 0, actualLength);
                raiseAppSerialDataEvent(received);
            }
            catch (IOException exc) {
                handleAppSerialError(exc);
            }
            kickoffRead();
        }, null);
    };
    kickoffRead();

我的问题围绕着使用BaseStream.BeginRead;在我的班级中,应该将读取数据的内容放在哪里?我的第一个想法是DataReceived事件,如第一个示例所示,展示如何不使用SerialPort类作者提到代码位于DataReceived评论中的事件,但是对于显示更好方法的示例,作者没有提及代码应该在哪里,所以我认为他仍然指的是DataReceived事件,但随后作者提到DataReceived事件本身就有问题,所以……?这里的任何指导都会很棒,如果很明显的话,我们深表歉意!

如果我没有提到任何对试图回答这个问题的人有益的事情,那么请务必让我知道。 预先感谢您的任何指导和/或反馈!


它是一个递归函数,因此您在打开端口后仅调用此代码一次,并且它将继续重复自身而不会阻止执行(或需要 DataReceived 事件处理程序)。

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

如何更可靠地使用SerialPort类 的相关文章

随机推荐

  • 模拟乘法加法的算法

    如何设计一种算法来模拟乘法加法 输入两个整数 它们可能为零 正数或负数 def multiply a b if a 1 return b elif a 0 return 0 elif a lt 0 return multiply a b e
  • XML 注释和“--”

    偶数个 s 似乎也无效 如果它是一些历史特征 那么它的 专业 部分是什么 反对 部分是无法拥有 在评论中 不以 gt 作为注释结尾并允许在内部添加 从而使注释处理复杂化的原因是什么 也许这对某人有帮助 我遇到了一个问题 我想注释掉 XML
  • 保护 EC2 Amazon Marketplace AMI 上的文件夹安全

    我计划创办一家小型企业并向 Amazon 的 AWS Marketplace 提交 Linux AMI 当我阅读卖家指南时 我看到了这一点 AMI 必须允许操作系统级管理功能 以实现合规性要求 漏洞更新和日志文件访问 对于基于 Linux
  • PHP根据.gitignore过滤文件和路径

    我想使用 PHP 读取 gitignore 配置忽略的所有文件和路径 就像 git 的做法一样 可以重复读取目录并对每个文件使用正则表达式进行过滤 但如果路径中的文件过多 则效果不佳 有什么好的和最有效的方法来读取 gitignore 忽略
  • 登录 SQL Server 时出错

    当我想要连接到 SQL Server 2008 时 我收到以下消息 无法连接到服务器 附加信息 无法打开用户默认数据库 登录失败 用户 sa 登录失败 微软 SQL Server 错误 4064 我该如何解决这个错误 这个错误 Micros
  • 在ormlite android中使用DataType.SERIALIZABLE存储对象列表

    如何在android中使用ORMlite保存ArrayList我的模型如下 class Model DatabaseField public String type DatabaseField public String name Data
  • System.Delegate System.Reflection.MethodInfo.CreateDelegate(System.Type)

    据我所知 这个错误在过去曾发生过 当时 Ninject 和站点包的目标是 4 x 并且彼此不匹配 我检查了我的机器 它们匹配 都是 4 0 我确实花了一些时间更新项目中的所有 Nu Get 包 在此之前 并没有出现过这个错误 我怎样才能消除
  • 为什么我的查询返回的结果很多?

    我有一群候选人 他们都做过一份或多份工作 每个人都有一家公司 使用一些技能 糟糕的 ASCII 艺术如下 candidate 1 candidate 2
  • Dapper 是否支持 SQL 2008 表值参数 2?

    我知道 dapper 可以支持 TVF 但是如何随 TVF 一起发送额外的参数 而不将其添加到 IntDynamicParam 类中 请参阅 Tests cs 中的以下示例 我已修改以添加额外参数 connection Execute CR
  • Angular 13:无法在浏览器中看到 Jasmine 测试

    我有一个新的 Angular 项目 其中每个测试都完成 但它们不会在业力窗口中显示任何内容 我的组件没有 预览 与描述的非常相似在这个问题中 https stackoverflow com questions 55521855 list o
  • 用于命令行构建的 MSBuild 与 devenv

    我想知道 从命令行编译解决方案时使用 msbuild 和 devenv 有什么区别 注意到的一件明显的事情是 msbuild 确实构建了解决方案中未包含的依赖项目 而 devenv 则不然 还有其他的吗 是否有一些特殊标志可以传递给 msb
  • Keras + mnist + 测试自己的图像。错误的预测

    通过测试 mnist 自己的测试图像 它工作得很好 但是一旦我使用来自外部 mnist 的图像 它就会预测错误 我什至尝试从 mnist 数据集中复制其中一张图像 但它仍然无法预测正确的数字 即使在 mnist 数据集中完全相同的图像是可以
  • 如何在 postgresql 中基于 wCTE 的 upsert 中获取表的受影响行数?

    我需要你的帮助 我有一个包含 n 次插入和更新循环操作的查询 我决定使用 UPSERT 因为它不需要循环操作 ex WITH upsert AS UPDATE employee table SET rollno input rollno n
  • didRegisterForRemoteNotificationsWithDeviceToken - 推送通知

    我只是想确认 didRegisterForRemoteNotificationsWithDeviceToken 是指每次应用程序加载时都会调用 并且我的 PHP 服务器或应用程序需要处理是否重新提交以存储在我的数据库中 或者我缺少什么 谢谢
  • 如何改变图像的大小?

    我正在创建一款太空入侵者游戏 我希望所有图像都与屏幕分辨率成比例 这意味着它可以在所有屏幕尺寸上使用 并且所有图像都会缩小或变大 以便适合屏幕 游戏是全屏的 做到这一点最简单的技术是什么 这也是设置所有内容大小的最佳方法吗 你看过吗图像 g
  • Fedora 中的 Arduino 上传错误“stk500_recv(): 程序员没有响应”

    我正在尝试上传库存Blink在 Fedora Core 15 Linux 中使用 Arduino IDE 绘制草图 我收到此错误 avrdude stk500 recv 程序员没有响应 要重现该问题 通过 USB 线插入 Arduino U
  • 在 Task.Run 中使用 CancellationToken 超时不起作用[重复]

    这个问题在这里已经有答案了 好吧 我的问题很简单 为什么这段代码不抛出TaskCancelledException static void Main var v Task Run gt Thread Sleep 1000 return 10
  • Rails 3 Active Admin 将预设值添加到新记录

    我尝试从控制器和活动管理覆盖控制器执行此操作 但无法使其工作 用户创建一个网站 current user 有一个 id 属性 网站有一个 user id 属性 因此 当我创建一个新网站时 我想将 current user id 添加到 we
  • 如何作为用户无法查看的电子表格的“所有者”执行谷歌脚本

    希望这是一个非常简单的问题 我制作了一个 Google 脚本 可以写入单独的工作表 MasterSheet 中的单元格 这里有几个有用的问答帮助 这最终将部署嵌入到我提供给个人用户的多个不同工作表中 当用户对 MasterSheet 具有编
  • 如何更可靠地使用SerialPort类

    我一直在使用SerialPort在与我设计的一些外部硬件通信的应用程序中学习一段时间 在上述硬件的调试过程中 我发现了一些不可靠的地方 最近我偶然发现this http www sparxeng com blog software must