[C#] 纯文本查看 复制代码
/// <summary>
/// 串口接收数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void SpDataReceived(object sender, SerialDataReceivedEventArgs e)
{
//根据不同协议更改协议长度和针头针尾数据
//这里以FF FE XX XX XX XX XX AA为例
//针头为:FF FE,针尾为:AA
try
{
int n = MySerialPort.BytesToRead; //记录缓存数据的长度
byte[] buf = new byte[n]; //声明一个临时数组存储当前来的串口数据
MySerialPort.Read(buf, 0, n); //读取缓冲数据
BufferList.AddRange(buf);//将本次接收到的缓存数据添加到BufferList列表数据中
//当BufferList缓存列表数据大于或等于协议数据长度时开始处理数据
while (BufferList.Count >= 8)
{
//查找数据头(重要,防止数据丢失或不全)
if (BufferList[0] != 0xFF || BufferList[1] != 0xFE || BufferList[7] != 0xAA)
{
//若针头针尾没有达到协议标准则移除BufferList第一位,继续下一轮判断
BufferList.RemoveAt(0);
continue;
}
//若前面数据验证成功则将数据取出
StringBuilder myStringBuilder = new StringBuilder(MySerialPort.ReadBufferSize*2);
for (int i = 0; i < 8; i++)
{
myStringBuilder.Append(String.Format("{0:X2}", Convert.ToInt32(BufferList[i])) + " ");
}
//移除BufferList列表中已处理的数据
BufferList.RemoveRange(0, 8); //从缓存中删除错误数据
Invoke(new ShowDataCallback(ShowData), myStringBuilder.ToString());
}
}
catch (Exception ex)
{
//最好写日志文件,保存起来
//MessageBox.Show(ex.Message);
}
}