C#弹窗事件点击后影响了什么? 50
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
CheckForIllegalCrossThreadCalls = false; // 检查是否允许跨线程调用控件,这里为了简化代码直接禁用了该功能
int bytesToRead = serialPort1.BytesToRead; // 读取所有可用字节数
byte[] receiveBuffer = new byte[bytesToRead]; //用于存储接收到的数据
serialPort1.Read(receiveBuffer, 0, bytesToRead); //从串口读取数据
buffer.AddRange(receiveBuffer); //写入缓存中
if (buffer.Count > 0 && buffer[0] == 0x68) //判断缓存中的数据
{
if(buffer.Count>=10) //判断缓存中的数据
{
if (buffer[5] ==0x02)
{
byte[] data = buffer.GetRange(0, 10).ToArray(); // 讲缓存中的数据存入列表内
receivedString = BitConverter.ToString(data).Replace("-", ""); // 转换为字符串
textBox1.AppendText(receivedString); //输出到textBox
string timeStr = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); // 时间
StreamWriter sw = new StreamWriter(@"C:\Users\guoxiaoru\Desktop\ACVB.txt", true); //写入文件夹
sw.WriteLine(timeStr + " " + receivedString, "\n");
sw.Close();
buffer.RemoveRange(0, 10);
}
else {
MessageBox.Show("此时buffer[5] ==0x02不成立");
buffer.Clear();
}
}
}
else { buffer.Clear(); }
} 展开
这段代码的功能和逻辑。参考以下解释:
- 这段代码是一个事件处理函数,用于处理串口接收到数据的事件
- 在函数中,首先禁用了跨线程调用控件的检查,以便在后面直接操作textBox1控件
- 然后,获取串口中可读取的字节数,并创建一个相同大小的字节数组receiveBuffer
- 接着,调用serialPort1.Read()方法,将串口中的数据读取到receiveBuffer中
- 然后,将receiveBuffer中的数据追加到一个全局变量buffer中,buffer是一个字节列表,用于缓存接收到的数据
- 接着,判断buffer中是否有数据,并且第一个字节是否为0x68,如果是,说明是一个有效的数据帧的开始
- 然后,判断buffer中是否有至少10个字节,如果是,说明是一个完整的数据帧
- 接着,判断buffer中第6个字节是否为0x02,如果是,说明是一个特定类型的数据帧
- 然后,将buffer中前10个字节复制到一个新的字节数组data中,并将data转换为16进制字符串receivedString
- 接着,将receivedString追加到textBox1控件中,并获取当前时间字符串timeStr
- 然后,创建一个StreamWriter对象sw,并打开一个文本文件ACVB.txt,将timeStr和receivedString写入文件中,并关闭文件
- 最后,将buffer中前10个字节删除,以便处理下一个数据帧
- 如果在判断过程中有任何条件不满足,则清空buffer,并弹出提示框
为什么不加MessageBox.Show(“此时buffer[5] ==0x02不成立”);就无法继续运行的原因:
在你的代码中,当buffer[5]不等于0x02时,你只是清空了buffer,没有做其他的处理
这样的话,如果串口继续接收到数据,buffer会再次被填充,但是如果buffer[5]还是不等于0x02,就会再次清空buffer,造成一个死循环
这个死循环会占用大量的CPU资源,导致程序无响应或崩溃
当你加上MessageBox.Show(“此时buffer[5] ==0x02不成立”);时,你相当于在死循环中加了一个暂停,让程序有机会处理其他的事件,比如用户点击关闭按钮或调试器中断
这样的话,程序就不会无法继续运行,但是这并不是一个好的解决办法,因为你还是没有处理好数据帧的逻辑
你应该在清空buffer之前,判断是否有其他类型的数据帧,并进行相应的处理,或者直接跳过无效的数据帧,而不是一味地清空buffer