惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Latest news
Latest news
T
Troy Hunt's Blog
V
Vulnerabilities – Threatpost
L
LINUX DO - 热门话题
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Simon Willison's Weblog
Simon Willison's Weblog
V
V2EX
博客园 - 司徒正美
B
Blog RSS Feed
AWS News Blog
AWS News Blog
MyScale Blog
MyScale Blog
Scott Helme
Scott Helme
Cisco Talos Blog
Cisco Talos Blog
Last Week in AI
Last Week in AI
NISL@THU
NISL@THU
博客园 - Franky
P
Proofpoint News Feed
博客园_首页
C
CERT Recently Published Vulnerability Notes
雷峰网
雷峰网
S
Schneier on Security
P
Proofpoint News Feed
Hugging Face - Blog
Hugging Face - Blog
G
GRAHAM CLULEY
博客园 - 三生石上(FineUI控件)
月光博客
月光博客
WordPress大学
WordPress大学
The Hacker News
The Hacker News
T
Threatpost
阮一峰的网络日志
阮一峰的网络日志
A
Arctic Wolf
Microsoft Azure Blog
Microsoft Azure Blog
T
The Exploit Database - CXSecurity.com
Engineering at Meta
Engineering at Meta
罗磊的独立博客
T
The Blog of Author Tim Ferriss
D
Darknet – Hacking Tools, Hacker News & Cyber Security
I
Intezer
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
K
Kaspersky official blog
SecWiki News
SecWiki News
云风的 BLOG
云风的 BLOG
美团技术团队
C
Cybersecurity and Infrastructure Security Agency CISA
博客园 - 【当耐特】
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Security Latest
Security Latest
C
Cyber Attacks, Cyber Crime and Cyber Security
B
Blog
S
Security Affairs

博客园 - hu晓峰

记winform程序异常排查 记一次wpf 背景图的坑点 【Unity踩坑】Unity项目管理员权限问题(Unity is running as administrator ) 依赖注入 微服务聚合查询 libmodbus编译为64位动态库 一文读懂Modbus协议:工业设备的“普通话“通信指南 Mysql union与union all有什么区别? 理解Systemd服务重启策略:on-failure vs always Redis分布式锁正确的实现方法 字典Dictionary.Add不是把新的元素插入到字典最后面 c# Avalonia 架构开发跨平台应用 ‌索引基数 MySQL InnoDB损坏修复:使用innodb_force_recovery 整数取低字节 C#汉字-区位码相互转化类 avalonia在linux下运行出现Default font family name can't be null or empty问题的解决 ICMP timestamp请求响应漏洞CVE-1999-0524解决方法 详解mysql的for update 使用Redis的SETNX命令实现分布式锁 ASP.NET Core中如何对不同类型的用户进行区别限流
C# 解决串口通讯中,返回数据不完整
hu晓峰 · 2025-02-10 · via 博客园 - hu晓峰
 
博客园 | 首页 | 新随笔 | 联系 | 订阅 订阅 | 管理

从网上搜索,解决这个问题有两个方式:

  解决办法有两种,
  一个是在DataReceived事件里加入
  System.Threading.Thread.Sleep(600); 
  byte[] buffer=new byte[commPlc.BytesToRead];
  这样可以等待缓冲区的数据缓冲好,一次接收数据,也就是只触发一次DataReceived事件

  方法二:
  将instr定义成全局变量,删除事件里的instr="";这样可以保证每次触发的时候不会清空instr

方法一的缺点是代码量大,而且是明明可以等待若干毫秒后,接收缓存区会自动填满。这这时再去取值。就无需自动建立“缓存区”。这个方法属于重复建立缓存区。

方法二的缺点也很明显。由于数据量不同,固定等待时间天然存在bug和浪费时间。

笔者尝试了一种新的方式,克服上面两种方式的缺点。

 这样,不管数据多长,最多浪费20ms

而且从缓冲区取到的数值就是自己需要的数值。

测试结果如下:

  

 

 整个测试下来,读取25个bytes,有些时候只需要等待1次,大多数情况等待2次或3次。即测试成功!

发表于 2025-02-10 09:30  hu晓峰  阅读(486)  评论(0)    收藏  举报