[C#上位机学习]串口发送与接收程序
void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { string strData;//用于存取串口的数据 //readLine()方法在进行读取一行时,只有遇到回车(\r)或者换行符(\n)才会返回读取结果 strData = serialPort1.ReadExisting();//串口收到的数据 tb_test.Text = strData; serialPort1.DiscardInBuffer();//清空缓冲区数据,等待下次接收 }
使用缓存机制完成。 首先通过定义一个成员变量List<byte> buffer = new List<byte> (4096); 用来存放所有的数据, 在接收函数里,通过buffer.AddRange()方法不断地将接收到的数据加入到buffer中,并同时对 buffer中的数据进行检验, 如果达到一定的长度并且校验结果正确(校验方法在发送方和接收方一致),再进行处理。 //针对数据协议:head + len + playload + check 类型 private List<byte> buffer = new List<byte>(4096); private void sp_DataReceived(objectsender, EventArgs e) //sp是串口控件 { int n = sp.BytesToRead; byte[] buf = new byte[n]; sp.Read(buf, 0, n); //1.缓存数据 buffer.AddRange(buf); //2.完整性判断 while (buffer.Count >= 4) //至少包含帧头(2字节)、长度(1字节)、校验位(1字节);根据设计不同而不同 { //2.1 查找数据头 if (buffer[0] == 0x01) //传输数据有帧头,用于判断 { int len = buffer[2]; if (buffer.Count < len + 4) //数据区尚未接收完整 { break; } //得到完整的数据,复制到ReceiveBytes中进行校验 byte[] ReceiveBytes = new byte[len + 4]; buffer.CopyTo(0, ReceiveBytes, 0, len + 4); byte jiaoyan; //开始校验---自定义实现 jiaoyan = this.JY(ReceiveBytes);// if (jiaoyan != ReceiveBytes[len+3]) //校验失败,最后一个字节是校验位 { buffer.RemoveRange(0, len + 4); MessageBox.Show("数据包不正确!"); continue; } buffer.RemoveRange(0, len + 4); ///执行对数据进行处理操作RunReceiveDataCallback(ReceiveBytes); } else //帧头不正确时,记得清除 { buffer.RemoveAt(0); } } } //针对协议类型: head + len +cmd + seq+ playload +check + tail; private List<byte> buffer = new List<byte>(4096); private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { try { try { int nCount = serialPort1.BytesToRead; if (nCount == 0) { return; } byte[] btAryBuffer = new byte[nCount]; serialPort1.Read(btAryBuffer, 0, nCount); //缓存数据 buffer.AddRange(btAryBuffer); int index = 1; while (buffer.Count>0x07) //最短协议长度 { if (buffer[0] == 0x01) //协议头 { if (buffer[index] != 0x03) //查询协议尾 { index++; if (index > buffer.Count) //没有接受到帧尾 0x03 { break; //退出继续接收 } } else // 接收到协议尾 得到完整一帧数据 { byte[] ReceiveBytes = new byte[index+1]; buffer.CopyTo(0, ReceiveBytes, 0, index+1); RunReceiveDataCallback(ReceiveBytes); buffer.RemoveRange(0, index); } } else { buffer.RemoveAt(0); } } } catch (System.Exception ex) { } } catch(Exception ex) { MessageBox.Show(ex.Message); } finally { handerListening = false; } }