注:本文记录在编写串口过程中遇到的问题及其解决方法,还有在仿照参考文档进行编写过程中对于程序的优化升级。
目录
2.上述代码中,实际运行时,如果isHex为false,没有将文本显示在文本框中
1.Thread.Sleep()导致程序运行时卡住
原因分析:
System.Threading.Thread.Sleep(100);
//表示当前线程挂起100毫秒,即暂停程序的执行。在程序中使用Thread.Sleep()方法可能会导致程序出现阻塞或卡顿的情况,因为线程暂停后无法执行任何代码,如果在主线程中使用Thread.Sleep()方法,就会导致UI界面无响应。
因此,除非有特殊的需求,一般不建议在程序中使用Thread.Sleep()方法。如果需要在程序中暂停一段时间,可以使用定时器、异步操作等方式来实现,以避免阻塞或卡顿的情况。
代码优化:
private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (isHex == false)
{
string data = sp.ReadLine();
this.Invoke((MethodInvoker)delegate
{
tbxRecv.AppendText(data);
});
}
else
{
int bytesToRead = sp.BytesToRead;
byte[] buffer = new byte[bytesToRead];
sp.Read(buffer, 0, bytesToRead);
string hexData = BitConverter.ToString(buffer).Replace('-', ' ');
this.Invoke((MethodInvoker)delegate
{
tbxRecv.AppendText(hexData);
});
}
sp.DiscardInBuffer();
}
优化后的代码将Thread.Sleep()方法替换为直接从串口读取数据,并使用Invoke()方法将文本框的操作委托到UI线程执行。此外,为了提高性能,优化后的代码将ReadLine()方法替换为Read()方法,避免了在串口接收缓冲区中等待换行符的情况。最后,使用AppendText()方法替换了直接赋值的方式,可以提高文本框操作的效率。
2.上述代码中,实际运行时,如果isHex为false,没有将文本显示在文本框中
原因分析:
如果isHex为false,没有将文本显示在文本框中可能是因为在串口接收缓冲区中没有读取到换行符。在这种情况下,使用ReadLine()方法会一直等待换行符的出现,导致程序无法继续执行。为了解决这个问题,可以使用Read()方法读取指定长度的数据,然后使用AppendText()方法将其追加到文本框中。
代码优化:
if (isHex == false)
{
int bytesToRead = sp.BytesToRead;
byte[] buffer = new byte[bytesToRead];
sp.Read(buffer, 0, bytesToRead);
string data = Encoding.Default.GetString(buffer);
this.Invoke((MethodInvoker)delegate
{
tbxRecv.AppendText(data);
});
}
这段代码将BytesToRead属性获取串口接收缓冲区中的字节数,然后使用Read()方法读取指定长度的数据,并使用Encoding.Default.GetString()方法将字节数组转换为字符串。最后,使用AppendText()方法将字符串追加到文本框中。这样即使串口接收缓冲区中没有换行符,也可以将接收到的数据显示在文本框中。
3.接收的数据格式和内容出错的可能原因
- 串口通信参数不匹配:如果发送方和接收方的串口通信参数不匹配,比如波特率、数据位、停止位、校验位等设置不一致,会导致接收到的数据出现乱码或者符号等异常情况。
- 发送方发送的数据格式不正确:如果发送方发送的数据格式不正确,比如发送的是二进制数据,但是接收方使用的是文本模式接收,也会导致接收到的数据出现异常情况。
- 串口接收缓冲区溢出:如果接收方处理数据的速度跟不上发送方发送数据的速度,会导致串口接收缓冲区溢出,从而丢失部分或全部数据,或者出现乱码或符号等异常情况。 针对以上可能的原因,可以进行如下排查和解决:
- 确认发送方和接收方的串口通信参数设置是否一致,并按照同样的方式进行设置。
- 确认发送方发送的数据格式是否正确,并使用相应的方式进行接收。
- 在接收数据时,尽量及时处理数据,避免串口接收缓冲区溢出,或者增加缓冲区大小等措施。
参考文档:
C#及Visual Studio 2019写一个简单的串口助手_c#串口助手_king of the world hh的博客-CSDN博客