关于winform串口程序(三)数据的接收--超时处理

c#入门新手浅陋经验之谈,望见谅。
关于串口C#接受数据,Serialport类里面发布了SerialDataReceivedEventHandler这个委托,并建立了SerialPort.DataReceived事件,我们可以在窗口主程序中进行事件绑定,绑定到我们对数据的函数。可以简单理解为串口一收到数据,就执行我们绑定的函数。才c#委托可以理解为,我做不了的事可以发布一个委托让别人来做,事件就好比你接了这个委托后,我通知你什么时候去做。也可以看作是方法的重载,在别的类(窗体)中定义一个方法,执行时(有参或者无参),在接了委托的类(窗体)中,重定向这个方法,这就提供了一种实现窗体中传值的方法。具体的实现如myserial.DataReceived += new SerialDataReceivedEventHandler(portDataReceived);(myserial为自己开启串口,portDataReceived为串口接收到数据后执行的函数)。

所谓使用超时接收的原因,是你不知道串口传来数据的长度,或者说何时结束,这里很多会设定串口接收数据数组的最低长度,然后找出数据数组中规定的开头字节(协议或者自己设定的),然后读取一定长度为一次完整的数据读取,最后进行UI(winform中控件的使用)的输出或者别的数据操作。超时处理就是串口接收数据时开始定时,多少毫秒内串口无数据传输过来,就视为本次指令接受结束,然后根据协议判断自己接收的数据是否完整,然后在进行数据处理(我们很容易想到,其实判断完整操作在超时接收大多数情况下是多余的)。我所使用的定时为System.Timers.Timer,多任务处理,在大多数情况下会比System.Form.Timer舒服很多。超时处理大致思路为,在绑定的函数中开启定时,自己设定的毫秒内无数据传输就处理当前接收到的数据。

接上篇就知道我使用的协议为Modbus,完整指令包括地址码,功能码,寄存器地址,CRC校验码等,可根据情况对指令进行处理。合并高低8位字节为16位16进制的操作为Convert.ToInt16((list[a].ToString(“X2”) + list[b].ToString(“X2”)), 16)

https://download.csdn.net/download/qq_41549603/11256461
(项目地址,有需要留邮箱什么的)

你可能感兴趣的:(c#)