C# 串口接收的优化处理
引言
在VS中实用串口接收通讯的时候往往会遇到等待数据或需要解决接收数据效率的问题。这里小结一种比较实用的的方法,其通过线程接收来控制协调,约束时间和数据极限大小来输出处理,大大提高了数据处理的效率。这里为了简要说明,省略了线程部分开启部分。
一段经典的代码往往解决用户实际实用的痛点又能提高代码的效率。
......
namespace app
{
public partial class Form1 : Form
{
private const int UART_COUNT_MAX = 512;
//定义线程
Thread listenThread;
public bool rx_thread_stop_flag = false;//线程停止标志
public Form1()
{
InitializeComponent();
//在这里可以或者其它控件启动接收线程
}
......
/// <summary>
/// 串口数据接收线程循环程序
/// </summary>
public void ReceiveData()
{
//接收线程
int len = 0;
string rx_data = "";
while (_serialPort.IsOpen && !rx_thread_stop_flag)//线程循环
{
len = this._serialPort.BytesToRead;//获取当前的串口数据长度
Thread.Sleep(20);//间隔20ms
//判断数据长度是否有变化//判断数据是否超过最大值
while (len < this._serialPort.BytesToRead && len < UART_COUNT_MAX)
{
//在长度范围内有数据变化就循环累加
len = this._serialPort.BytesToRead;
//时间继续累加
Thread.Sleep(20);
}
if (len > 0)//有数据则接收处理数据
{
SerialPortEventArgs args = new SerialPortEventArgs();
byte[] data = new Byte[len];
try
{
this._serialPort.Read(data, 0, len); //向串口中读取数据
rx_data = System.Text.Encoding.UTF8.GetString(data);
//这里添加数据处理的代码,处理rx_data
}
catch (Exception)//异常处理
{
MessageBox.Show("数据接收失败!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
}
}
}
/// <summary>
/// 接收串口读取数据
/// </summary>
public class SerialPortEventArgs : EventArgs
{
public byte[] receivedBytes = null; // 用来接收串口读取的数据
}
}
}