ruanyirun 2013-10-17 15:10 采纳率: 0%
浏览 1510

C#串口数据读取问题求助

用C#中的一个serialport类读取cc2431传感器通过usb(com口)传来的数据,程序代码如下
void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
int n = comm.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致
byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据
received_count += n;//增加接收计数
comm.Read(buf, 0, n);//读取缓冲数据
builder.Clear();//清除字符串构造器的内容
//因为要访问ui资源,所以需要使用invoke方式同步ui。
this.Invoke((EventHandler)(delegate
{
//判断是否是显示为16禁止
if (checkBoxHexView.Checked)
{
//依次的拼接出16进制字符串
foreach (byte b in buf)
{
builder.Append(b.ToString("X2") + " ");
}
}
else
{
//直接按ASCII规则转换成字符串
builder.Append(Encoding.ASCII.GetString(buf));
}
//追加的形式添加到文本框末端,并滚动到最后。
this.txGet.AppendText(builder.ToString());
//修改接收计数
labelGetCount.Text = "Get:" + received_count.ToString();
}));
}
会读取到如下数据71 09 FC 08 00 F1,而实际上用配套的串口调试助手得到的一串数据时这样的:04 C0 E0 D8 27 3B 03 23 4D 80 03 B0 02 00 4C 00 40 7F C0 4C 32 32 00 42 24 FF

不知道程序哪里应该改动,才能得到同串口调试助手一样的数据

  • 写回答

1条回答

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-08-20 16:52
    关注

    该回答引用ChatGPT-3.5,仅为您供参考,不保证完全正确
    根据你提供的代码,从串口读取数据的部分似乎没有明显的问题。问题可能出在数据的解析和显示上,以及串口参数的配置。以下是一些可能需要检查和调整的方面:

    1. 串口参数设置: 确保你的串口参数(如波特率、数据位、停止位、校验位等)与传感器的通信要求一致。如果参数不匹配,你可能无法正确地读取和解析数据。

    2. 数据解析方式: 你的代码中,当 checkBoxHexView.Checked 为 true 时,使用了十六进制的方式显示数据。但是你描述的配套串口调试助手输出的是一串十六进制字节,而不是以空格分隔的十六进制字符串。你需要根据实际情况,确定数据是以什么格式发送的,然后进行相应的解析。

    3. 数据解析逻辑: 如果数据是以十六进制字节流的形式发送的,那么你需要修改数据解析的方式。可以修改代码中 foreach (byte b in buf) 部分,将字节直接转换成十六进制字符串,并拼接在一起,而不是以空格分隔。类似于 builder.Append(b.ToString("X2"));

    下面是修改后的代码示例,假设数据是以十六进制字节流发送的:

    void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        int n = comm.BytesToRead;
        byte[] buf = new byte[n];
        received_count += n;
        comm.Read(buf, 0, n);
        builder.Clear();
    
        this.Invoke((EventHandler)(delegate
        {
            foreach (byte b in buf)
            {
                builder.Append(b.ToString("X2")); // Convert byte to two-digit hexadecimal
            }
    
            this.txGet.AppendText(builder.ToString());
            labelGetCount.Text = "Get:" + received_count.ToString();
        }));
    }
    
    1. 异常处理: 在串口通信中,可能会遇到超时、数据错误等异常情况。确保在你的代码中有适当的异常处理机制,以捕获并处理可能出现的异常,以免影响程序的稳定性。

    最终,要根据你的传感器和数据格式的实际情况进行调整。如果问题仍然存在,你可能需要更多地了解传感器的通信协议和数据格式,以确保正确地解析和显示数据。


    该回答引用NewBing,仅为您供参考,不保证完全正确
    根据我搜索的结果,你可能遇到的问题是:

    • 你的串口数据接收事件触发时,可能没有读取到完整的数据包,而只是读取了缓冲区中的一部分数据。这可能导致你的数据解析出错或不一致。¹²
    • 你的串口数据格式可能和你的串口调试助手的格式不匹配,导致你无法正确解析数据。你需要检查你的串口数据是否有特殊的终止符或分隔符,以及你的串口编码是否正确。¹³

    为了解决这些问题,你可以尝试以下方法:

    • 使用SerialPort.ReadLine ()方法代替SerialPort.ReadExisting ()方法,这样可以根据SerialPort.NewLine属性设置的终止符来读取一行完整的数据。¹
    • 使用SerialPort.ReadByte ()方法来逐字节地读取数据,然后根据你的数据协议来解析数据包的长度和内容。⁴
    • 检查你的串口配置参数,如波特率,奇偶校验,停止位,流控制等,是否和你的串口调试助手一致。³
    • 检查你的串口数据是否使用了16进制或其他非ASCII编码,如果是的话,你需要使用相应的转换方法来解码数据。²

    源: 与必应的对话, 2023/8/20
    (1) Problem with serial port data receive in C# - Stack Overflow. https://stackoverflow.com/questions/3944094/problem-with-serial-port-data-receive-in-c-sharp.
    (2) c# serialport read functions not reading data - Stack Overflow. https://stackoverflow.com/questions/44280993/c-sharp-serialport-read-functions-not-reading-data.
    (3) HELP....serial port data reading C#. https://social.msdn.microsoft.com/Forums/sqlserver/en-US/96ff8717-b432-4f41-9305-e61573ad3f41/helpserial-port-data-reading-c?forum=Vsexpressvcs.
    (4) [Solved]-Serial port not reading all data-C# - AppsLoveWorld Technologies. https://www.appsloveworld.com/csharp/100/1095/serial-port-not-reading-all-data.

    评论

报告相同问题?

悬赏问题

  • ¥15 服务器一块硬盘重启过程中安装后,硬盘不识别了怎么修复?
  • ¥15 微信红包不拆包 知道红包金额
  • ¥15 0基础学机器人运动控制要多久?
  • ¥15 .net core 怎么进行中英文转换
  • ¥15 数学的三元一次方程求解
  • ¥20 iqoo11 如何下载安装工程模式
  • ¥15 本题的答案是不是有问题
  • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?