前面在写用SerialPort与串口进行交互的时候,发现指令返回结果过长或者指令返回结果时间有点长的话会导致获取的结果不完整,需要重写DataReceived事件,以获取完整的结果。
代码如下:
这部分代码与C#实现串口通信(SerialPort)_c#串口代码_小橘是橘子的博客-CSDN博客相比增加了设置串口接收与发送的缓冲区,最后部分sp.DataReceived则是设置重写后的DataReceived事件部分。
string[] ports = System.IO.Ports.SerialPort.GetPortNames();
InputSimulator simulator = new InputSimulator();
if (ports.Length == 0)
{
MessageBox.Show("本机没有串口!");
}
Array.Sort(ports);
sp.PortName = ports[1];//串口号COM3,根据自己串口选择
sp.BaudRate = 115200;//波特率
sp.DataBits = 8;//数据位
//sp.StopBits = System.IO.Ports.StopBits.One; //停止位(没用到就先注释掉了)
sp.WriteTimeout = 3000; //串口发送的超时时间
sp.ReadTimeout = 18000;//读取数据的超时时间
sp.Encoding = System.Text.Encoding.GetEncoding("GB2312");//此行非常重要,解决接收中文乱码的问题
sp.ReadBufferSize = 1024 * 1024; //串口接收缓冲区大小
sp.WriteBufferSize = 1024 * 1024; //串口发送缓冲区大小
sp.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(com_DataReceived);
重写DataReceived事件代码:
private void com_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
Thread.Sleep(500);//这个延时非常重要
System.IO.Ports.SerialPort comPort = (System.IO.Ports.SerialPort)sender;
Thread.Sleep(500);
int nRead = sp.BytesToRead; //指令返回值大小
Thread.Sleep(500);
comPort.ReceivedBytesThreshold = comPort.ReadBufferSize; //设置输入缓冲区的字节数与指令返回字节数一样大小
Thread.Sleep(500);
if (nRead > 0)
{
byte[] data = new byte[nRead];
sp.Read(data, 0, nRead);
}
}
这里加了休眠,不知道为什么,我这里得加休眠才能获取到完整返回值。。。。
我在这里写的sp.DataRecevied在最前面,但是我在项目中是在发送指令的类中设置的,因为我的指令只有三条是获取不到完整返回值,所以我就在发送指令的时候判断了一下,如果是那几条指令就设置一下,如下图:
各位根据自己不同的需求设置就好了。