C# serialPort.ReadExisting()接收数据出错,但serialPort.Read(buf, 0, length)接收数据正常

ali_ila 2018-09-08 10:43:24
在VS2015中使用C#的serialPort进行串口通信,接收运动传感器的数据。

根据传感器说明书,回传频率10Hz,定义传输数据包为20Byte,数据为十六进制,不是ASCII码。

第1位起始位0x55,第2位标志位0x61,第3位为x轴加速度低8位,第4位为x轴加速度高8位,5-8位为yz轴加速度,其余为角速度和角度。

使用以下代码接收数据

byte[] buf = new byte[20];
serialPort1.Read(buf, 0, 20);//收到的数据为byte
if (buf != null)
{
for (int ib = 0; ib < buf.Length; ib++)
{
datarecstr += buf[ib].ToString("X2");//将数据转为十六进制string显示
}
}

收到数据的一部分为
55613600FDFFFF07EAFF1500120098FF4EFF7A34
556134000000FF07ECFF140011008DFF5BFF9334
55613400FDFF0208EAFF1100110080FF64FFAE34
可以正常解算

使用以下代码接收数据

//已设置ReceivedBytesThreshold=20,使用事件回应接收
private void serialPort1_Datareceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
data = this.serialPort1.ReadExisting();//收到的数据为string
this.Invoke(new EventHandler(DisplayText));
}

private void DisplayText(object sender, EventArgs e)
{
byte[] byteArray = System.Text.Encoding.Default.GetBytes(data);//string转为byte
if (byteArray != null)
{
for (int ib = 0; (ib < byteArray.Length) & (ib < 20); ib++)
{
richTextBox1.Text += byteArray[ib].ToString("X2");//将数据转为十六进制string显示
}
}
}


收到数据的一部分为
5561683F3F3F3F3F123F3F013F124E3F023F7C38
55613F3F3F010406370A3F10253F1F3F113F3F34
556170143F063F183F3F3F3F3F045A3F753F3F2A
起始位和标志位正常,之后出现很多3F项,解算得到的加速度超过70m/s^2,不符合实际情况。

请问有谁知道该如何改正?
...全文
3064 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lihongfang16 2019-04-17
  • 打赏
  • 举报
回复 1
Encoding.GetEncoding("iso-8859-1").GetBytes(serialPort1.ReadExisting()) 编码字符集的问题,ReadExisting 读取的是字符串,这时字节序列中的一些在Ascii中没有对应的就被转换了,再转回来就有问题了
lihongfang16 2019-04-17
  • 打赏
  • 举报
回复 1
还需要 serialport1.Encoding = Encoding.GetEncoding("iso-8859-1");
LaiLai_Fido 2018-12-23
  • 打赏
  • 举报
回复
引用 楼主 ali_ila 的回复:
在VS2015中使用C#的serialPort进行串口通信,接收运动传感器的数据。 根据传感器说明书,回传频率10Hz,定义传输数据包为20Byte,数据为十六进制,不是ASCII码。 第1位起始位0x55,第2位标志位0x61,第3位为x轴加速度低8位,第4位为x轴加速度高8位,5-8位为yz轴加速度,其余为角速度和角度。 使用以下代码接收数据

                byte[] buf = new byte[20];
                serialPort1.Read(buf, 0, 20);//收到的数据为byte
                if (buf != null)
                {
                    for (int ib = 0; ib < buf.Length; ib++)
                    {
                        datarecstr += buf[ib].ToString("X2");//将数据转为十六进制string显示
                    }
                }
收到数据的一部分为 55613600FDFFFF07EAFF1500120098FF4EFF7A34 556134000000FF07ECFF140011008DFF5BFF9334 55613400FDFF0208EAFF1100110080FF64FFAE34 可以正常解算 使用以下代码接收数据

    //已设置ReceivedBytesThreshold=20,使用事件回应接收
    private void serialPort1_Datareceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
        data = this.serialPort1.ReadExisting();//收到的数据为string
        this.Invoke(new EventHandler(DisplayText));
    }

    private void DisplayText(object sender, EventArgs e)
    {
        byte[] byteArray = System.Text.Encoding.Default.GetBytes(data);//string转为byte
        if (byteArray != null)
        {
            for (int ib = 0; (ib < byteArray.Length) & (ib < 20); ib++)
            {
                richTextBox1.Text += byteArray[ib].ToString("X2");//将数据转为十六进制string显示
            }
        }
    }
收到数据的一部分为 5561683F3F3F3F3F123F3F013F124E3F023F7C38 55613F3F3F010406370A3F10253F1F3F113F3F34 556170143F063F183F3F3F3F3F045A3F753F3F2A 起始位和标志位正常,之后出现很多3F项,解算得到的加速度超过70m/s^2,不符合实际情况。 请问有谁知道该如何改正?
楼主解决问题了嘛? 我想问你把数据处理的函数放在DataReceived函数之后还是之内? 因为我现在也碰到类似的问题,数据处理部分放置在DataReceived之后,好像又不会等待DataReceived处理完后执行;放在DataReceived之内,只能等待完整长度判断后处理,但万一长度不对或碰到TimeOut怎么办?我设置ReadTimeout好像不起效果
ali_ila 2018-09-09
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
在你的应用场合,只能用 serialPort1.Read 读取,而不能用 serialPort1.ReadExisting 读取
这是因为该传感器是以二进制方式传送数据的,若读取成字符串,就会因为字符集问题丢失数据(你看到的那些 3F项)
0x3F 是 ? 的内码
何况按照说明:第3位为x轴加速度低8位,第4位为x轴加速度高8位,5-8位为yz轴加速度
x、y、z 都是 16位整数,可从 byte[] 中直接获取,并无转换成字符串的必要


非常感谢!我去学习一下字符集方面的知识,以后一定注意!
xuzuning 2018-09-09
  • 打赏
  • 举报
回复 1
在你的应用场合,只能用 serialPort1.Read 读取,而不能用 serialPort1.ReadExisting 读取
这是因为该传感器是以二进制方式传送数据的,若读取成字符串,就会因为字符集问题丢失数据(你看到的那些 3F项)
0x3F 是 ? 的内码
何况按照说明:第3位为x轴加速度低8位,第4位为x轴加速度高8位,5-8位为yz轴加速度
x、y、z 都是 16位整数,可从 byte[] 中直接获取,并无转换成字符串的必要

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧