代码生活之使用ReadExisting()读取缓冲区内PLC响应的完整代码

更新时间:2023-07-13 03:33:31 阅读: 评论:0

代码⽣活之使⽤ReadExisting()读取缓冲区内PLC响应
的完整代码
昨天的comport.ReadExisting()问题困扰着我,如何读取到完整的PLC代码呢?今天终于解决了。我的思路还是对着的,不停地读取缓冲区的数据,直到把完整的代码读完。但是忽略了port_StringDataReceived时间的触发问题,再找到ReceivedBytesThreshold关键词后进⾏了搜索,理解了port_StringDataReceived事件的控制,然后就是写不停地读取缓冲区的数据,直到把完整的代码读完的算法,这⾥要说的是,半路出家很多细节问题要解决,我刚开始只是注意功能的实现,没有注意捕捉程序异常,处理异常,使得程序不能完整的运⾏。再经历了⼀上午的努⼒终于实现了数据的监测,就是速率有点慢。这都是单线程惹的祸,看来还得学习⼀下后台线程的使⽤。
下⾯是我的代码,这⾥要感谢SCDN论坛的 Yali8 ⽹友,他的算法的完整性很⾼,我在他的基础上进⾏了修改,得到了我想要的代码。还要感谢⽹友 剑客QQ:316722224 ,给我的耐⼼解答。下⾯分享⼀下我的成果~
                     图1 监测效果图
ReceivedBytesThreshold只是触发DataReceived事件的⼀个阀值,由于串⼝通讯的实时性,很难说你每次读取的数据长度就是阀值的长度。请参考下⾯的⽅法。
怎么做回锅肉
⼀、技术要点:
(1).⾸先,SerialPort的ReceivedBytesThreshold先设置成1,表⽰只要有1个字符送达端⼝时便触发DataReceived事件
(2).当DataReceived触发时,先把ReceivedBytesThreshold设置成⼀个⽐较⼤的值,达到读取本次端⼝数据时,不再触发DataReceived.
(3).循环读取端⼝中的数据,直⾄读完。
(4).移除读取数据中的⾮法字符。田建明
(5).触发⼀个后台线程处理收到的数据。
(6).在finally中把ReceivedBytesThreshold重置回1
⼆、C# Code
public  void port_StringDataReceived(object nder, SerialDataReceivedEventArgs e)//接收数据,翻译为⼗进制数值,存储到字符串数组    {
string strReceive;
string PLCCode=null;
string[] data =null;
try
{
comport.ReceivedBytesThreshold  = comport.ReadBufferSize;
while (true)
{
strReceive = comport.ReadExisting();
if (string.Equals(strReceive, string.Empty))
{
break;
}
el
{
PLCCode += strReceive;
祝福教学设计Application.DoEvents();
麦片吃法Thread.Sleep(100);
茶水解酒吗}
}
PLCCode = PLCCode.Replace("\0", string.Empty);    //去除⾮法符号,本例可以不要。
PLCCode = PLCCode.Replace("\r\n", string.Empty);
PLCCode = PLCCode.Replace("\r", string.Empty);
PLCCode = PLCCode.Replace("\n", string.Empty);
//if (!this.bIsHandleCom)  //后台进程处理数据,需要学习
//{
//    this.bIsHandleCom = true;
//    mReceiveData = strCollect;
//    if (ReceiveDataParrEvent != null)
关联理论//        ReceiveDataParrEvent(mReceiveData);
//    if (ThreadReceiveParr != null && !ThreadReceiveParr.IsAlive)
//    {
//        ThreadReceiveParr.Start();
/
嘴巴干怎么解决/    }
//}
}
catch (Exception ex)
{
MessageBox.Show(this, ex.ToString(), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);            }
finally
回头望{
comport.ReceivedBytesThreshold = 1;
}
//调⽤将代码翻译为数据的⼦程序,返回值为带符号⼗进制整数
if (PLCCode.Length == 25)
{
data = PLCCodeToStringData(PLCCode);
string LWA = data[0];
string RWA = data[1];
LogMonitoringPage(LWA, RWA);        // 显⽰有效信息到监测界⾯
}
Log(LogMsgType.Incoming, PLCCode);      // 显⽰所有信息

本文发布于:2023-07-13 03:33:31,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1093665.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   处理   代码
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图