C#编写串口助手问题记录(1)

        注:本文记录在编写串口过程中遇到的问题及其解决方法,还有在仿照参考文档进行编写过程中对于程序的优化升级。

目录

1.Thread.Sleep()导致程序运行时卡住

原因分析:

代码优化:

2.上述代码中,实际运行时,如果isHex为false,没有将文本显示在文本框中

原因分析:

代码优化:

3.接收的数据格式和内容出错的可能原因

参考文档:


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.接收的数据格式和内容出错的可能原因

  1. 串口通信参数不匹配:如果发送方和接收方的串口通信参数不匹配,比如波特率、数据位、停止位、校验位等设置不一致,会导致接收到的数据出现乱码或者符号等异常情况。
  2. 发送方发送的数据格式不正确:如果发送方发送的数据格式不正确,比如发送的是二进制数据,但是接收方使用的是文本模式接收,也会导致接收到的数据出现异常情况。
  3. 串口接收缓冲区溢出:如果接收方处理数据的速度跟不上发送方发送数据的速度,会导致串口接收缓冲区溢出,从而丢失部分或全部数据,或者出现乱码或符号等异常情况。 针对以上可能的原因,可以进行如下排查和解决:
  4. 确认发送方和接收方的串口通信参数设置是否一致,并按照同样的方式进行设置。
  5. 确认发送方发送的数据格式是否正确,并使用相应的方式进行接收。
  6. 在接收数据时,尽量及时处理数据,避免串口接收缓冲区溢出,或者增加缓冲区大小等措施。

参考文档:

C#及Visual Studio 2019写一个简单的串口助手_c#串口助手_king of the world hh的博客-CSDN博客

c#串口编程(转) - 廖先生 - 博客园 (cnblogs.com)

C#编写串口助手_this.minimumsize = this.size;_Harry Fu的博客-CSDN博客

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
串口调试助手是一种用于与具有串行通信接口(如RS-232、USB-TTL或UART)的设备进行数据交互的工具。使用它发送消息通常涉及以下几个步骤: 1. **连接设备**: - 确保串口调试助手已正确连接到计算机,并选择正确的串口。这通常可以在设备管理器或调试工具的设置中配置。 2. **设置波特率和校验位**: - 根据目标设备的协议,选择合适的波特率(比如9600, 115200等)和数据位数、停止位以及校验位(如8N1, 8E1等)。 3. **打开串口**: - 在调试助手软件中,打开选定的串口,确保通信通道已经建立。 4. **编写发送数据**: - 准备要发送的数据,通常是字节序列或字符串。如果是字符串,可能需要转换为字节格式,例如在许多语言中,可以使用`\x00`作为字符串结束符。 5. **发送数据**: - 使用调试助手提供的发送命令或者界面,逐个或批量发送数据。确保按发送按钮或使用相应的快捷键。 6. **查看接收**: - 如果有反馈机制,观察设备是否正确接收并处理了发送的消息,可以通过串口监视器查看返回的数据。 7. **调试和错误处理**: - 发送消息后,检查是否有错误,比如接收不到响应或数据不匹配。根据需要调整参数或检查连接。 如果你是新手,可以查阅特定调试助手的文档或教程,因为每款工具的操作可能会略有不同。相关问题如下:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值