目前在使用C#编写上位机串口通讯界面,需要实现对下位机的通知
在处理接收数据时,现在遇到的一些,请各位多多指导一下
问题1.我在根据自定义协议里面的内容,已经实现数据的接收,在处理数据时,不知道如何设置发送间断判断
我一帧数据是64位字节,该怎么实现:到达指定长度,将整包数据交给下一级处理,然后重新开始包头的查找
问题2。我程序一运行,上位机界面在接收到数据后就卡顿,无法对界面进行操作,发现是我接收函数设计的是一边读数据,一边写数据,所以卡顿,想问该怎么设置读与写分开操作
代码如下: 图片中为数据处理内容,框框中是问题1缺少的内容
private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
while(true)
{
if (!sp.IsOpen)
{
System.Threading.Thread.Sleep(200);
sp.DiscardInBuffer();//丢弃接收缓冲区数据
}
else
{
try
{
Thread.Sleep(20);
Listening = true;
this.Invoke((EventHandler)(async delegate
{
byte[] readbuff = null;
int readBuffer = sp.BytesToRead;//实际接收到的字节数
if (readBuffer == 0)
{
return;
}
byte[] buf = new byte[readBuffer]; //创建临时接收字节数组
string RecvDataText = null; //显示字符存储
sp.Read(buf, 0, readBuffer); //读取所有接收到的数据
resetEvent.Set();
recv_count += readBuffer;
if (isHex == false)//如果接收模式为字符模式
{
String decodedString = Encoding.Default.GetString(buf); //设置编码格式,显示汉字
tbxRecvData.Text += decodedString + " "; //接收框显示,追加数据
}
else//如果接收模式为HEX数值模式
{
for (int i = 0; i < readBuffer; i++)
{
RecvDataText += ("0x" + buf[i].ToString("X2") + " "); //显示前缀0x
}
tbxRecvData.Text += RecvDataText;
}
//缓存数据
buffer.AddRange(buf);
int index = 0;
//完整性判断
while (buffer.Count >= 64)//完整一帧数据;
{//查找数据头
if (buffer[index] == 0xAA && buffer[index+1] == 0x55)//传输数据有帧头,用于判断
{
index = buffer[index+3];
if (buffer.Count < index + 64)
{//数据未接收完整跳出循环
break;
}
readbuff = new byte[index + 64];
//得到完整的数据,复制到readbuff中
buffer.CopyTo(0, readbuff, 0, index + 64);
//从缓冲区中清除
buffer.RemoveRange(0, index + 64);
HandData?.Invoke(readbuff);
Thread.Sleep(20);
}
else//开始标记或版本号不正确时清除
{
buffer.RemoveAt(0);
return;
}
}
await Task.Delay(20);
}));
}
finally
{
recv_count = 0;
Listening = false;//我用完了,ui可以关闭串口了。
}
}
}
}