代码生活之使用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(objectsender, SerialDataReceivedEventArgse)//接收数据,翻译为十进制数值,存储到字符串数组
{
string strReceive;
string PLCCode=null;
string[] data =null;
代码生活之使用ReadExisting()读取缓冲区内PLC响应的完整代码 缓冲区溢出攻击
try
{
comport.ReceivedBytesThreshold =comport.ReadBufferSize;
while (true)
{
strReceive = comport.ReadExisting();
if (string.Equals(strReceive, string.Empty))
{
break;
}
else
{
PLCCode += strReceive;
Application.DoEvents();
Thread.Sleep(100);
}
}
PLCCode = PLCCode.Replace("",string.Empty);//去除非法符号,本例可以不要。
PLCCode = PLCCode.Replace("rn", string.Empty);
PLCCode = PLCCode.Replace("r", string.Empty);
PLCCode = PLCCode.Replace("n", string.Empty);

//if (!this.bIsHandleCom)//后台进程处理数据,需要学习
//{
//this.bIsHandleCom = true;
//mReceiveData = strCollect;
// if(ReceiveDataParserEvent != null)
//ReceiveDataParserEvent(mReceiveData);
// if(ThreadReceiveParser != null &&!ThreadReceiveParser.IsAlive)
// {
//ThreadReceiveParser.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);// 显示所有信息

  

爱华网本文地址 » http://www.413yy.cn/a/25101014/209044.html

更多阅读

matlab的使用:8 如何画不同类型的三维图像

matlab的使用:[8]如何画不同类型的三维图像——简介这是本系列经验的第八篇,主要介绍用matlab软件画三维图像的一些相关函数,使用这些函数可以很方便的画出想要的图形,非常直观好用。matlab的使用:[8]如何画不同类型的三维图像——工具/

台达plc编程软件使用方法 精 台达plc编程实例

台达plc编程软件使用方法 精——简介 PLC,Programmable Logic Controller,可编程逻辑控制器,可以通过数字或模拟式输入、输出控制各种类型的机械或生产过程。下面我们就简单的共同探讨一下台达的PLC编程软件的使用方法。台达plc编程软

生活中如何预防老年痴呆 预防老年痴呆的药物

生活中如何预防老年痴呆——简介随着人口的老年化进程不断加快,老年痴呆症的发病率日趋增高,该病总是在人不知不觉中起病,呈持续进行性智能衰退,智能直线下降,病程一般是5至12年,该病已成为现代社会老年人的主要致死疾病之一。所以掌握预

声明:《代码生活之使用ReadExisting()读取缓冲区内PLC响应的完整代码 缓冲区溢出攻击》为网友噌俓與伱儚分享!如侵犯到您的合法权益请联系我们删除