C#通过串口接收到的地磅数据解析问题

时间:2021-05-28 01:00:01
接收到的内容如下:
  02 31 30 20 20 20 20 20 20 30 20 20 20 20 20 30 0D 
  02 31 30 20 20 20 20 20 20 30 20 20 20 20 20 30 0D 
  02 31 30 20 20 20 20 20 20 30 20 20 20 20 20 30 0D 

官方文档给出的协议格式如下:
  C#通过串口接收到的地磅数据解析问题

请问我代码该如何校验,获取小数点位置,本人小白(刚接触C#没多久),还请大神给思路,或者贴一下代码,万分感激。

21 个解决方案

#2


31是状态A,转换成二进制是00110001,看前三位来确定你的小数点位置

#3





引用 2 楼 qq_38588710 的回复:
31是状态A,转换成二进制是00110001,看前三位来确定你的小数点位置


多谢大神,请问能在给点提示或者示例代码一类的吗,本人小白一只,,到现在只是调通了与地磅的通信 C#通过串口接收到的地磅数据解析问题

#4


02 31 30 20 20 20 20 20 20 30 20 20 20 20 20 30 0D 
这段数据02是起始符,固定的
31 30 20对应状态字ABC,从状态字A的二进制码前三位来读取你的小数位,同理利用状态字B的二进制位来读其他数据。你的开发文档里很清楚
两段20 20 20 20 30是你要读的数据,具体怎么定义的要自己去破解
0D为校验和
我说的还不够明白么

#5


引用 4 楼 qq_38588710 的回复:
02 31 30 20 20 20 20 20 20 30 20 20 20 20 20 30 0D 
这段数据02是起始符,固定的
31 30 20对应状态字ABC,从状态字A的二进制码前三位来读取你的小数位,同理利用状态字B的二进制位来读其他数据。你的开发文档里很清楚
两段20 20 20 20 30是你要读的数据,具体怎么定义的要自己去破解
0D为校验和
我说的还不够明白么

这里有点错误 数据X20 20 20 20 20 20 和数据Y 30 20 20 20 20 20是不同的皮重毛重我不清楚,看你怎么理解了

#6


协议中数据长18字节
而你给的数据长 17字节(02 31 30 20 20 20 20 20 20 30 20 20 20 20 20 30 0D)
显然没有校验和(协议中也说校验和是可选的)
第二个字节(31)是状态字A 前3个二进制位表示小数点位置 00110001
但协议说 00110 001 bit5恒为1 bit5恒为0,显然你的不是
可见你收到的数据是错误的

#7


引用 6 楼 xuzuning 的回复:
协议中数据长18字节
而你给的数据长 17字节(02 31 30 20 20 20 20 20 20 30 20 20 20 20 20 30 0D)
显然没有校验和(协议中也说校验和是可选的)
第二个字节(31)是状态字A 前3个二进制位表示小数点位置 00110001
但协议说 00110 001 bit5恒为1 bit5恒为0,显然你的不是
可见你收到的数据是错误的

补充了不少我的错误,但状态A这里00110001这是从低位开始读的,前三位是100

#8


是吗?你确定是倒过来读的?

#9


难道不是么,bit0难道不是最低位,我接触单片机比较多,I/O寄存器中就是这样的

#10


接收的数据明显不对,地磅的设置有问题。
一般设置成功的数据都是这样,如8.62 Kg的数据格式:
=26.8000=26.8000=26.8000=26.8000
如果没秤东西,串口连接成功,则接收的数据一般是 =00.0000

#11


引用 10 楼 cyg17173 的回复:
接收的数据明显不对,地磅的设置有问题。
一般设置成功的数据都是这样,如8.62 Kg的数据格式:
=26.8000=26.8000=26.8000=26.8000
如果没秤东西,串口连接成功,则接收的数据一般是 =00.0000

呃,你这是自己解析后的数据吧,20 20 20 20 30这段数据怎么解

#12


引用 11 楼 qq_38588710 的回复:
Quote: 引用 10 楼 cyg17173 的回复:

接收的数据明显不对,地磅的设置有问题。
一般设置成功的数据都是这样,如8.62 Kg的数据格式:
=26.8000=26.8000=26.8000=26.8000
如果没秤东西,串口连接成功,则接收的数据一般是 =00.0000

呃,你这是自己解析后的数据吧,20 20 20 20 30这段数据怎么解

串口发送的都是ASCII , 查看ASCII 对照表,20是空格,30是0,31是1。
你现在配置不成功,所以接收的都是20 20 20 20 30这样的数据。
我当初花了1个月研究这个呢,当时手边没有电子秤,都是远程协助人家开发的。

#13


引用 12 楼 cyg17173 的回复:
Quote: 引用 11 楼 qq_38588710 的回复:

Quote: 引用 10 楼 cyg17173 的回复:

接收的数据明显不对,地磅的设置有问题。
一般设置成功的数据都是这样,如8.62 Kg的数据格式:
=26.8000=26.8000=26.8000=26.8000
如果没秤东西,串口连接成功,则接收的数据一般是 =00.0000

呃,你这是自己解析后的数据吧,20 20 20 20 30这段数据怎么解

串口发送的都是ASCII , 查看ASCII 对照表,20是空格,30是0,31是1。
你现在配置不成功,所以接收的都是20 20 20 20 30这样的数据。
我当初花了1个月研究这个呢,当时手边没有电子秤,都是远程协助人家开发的。


那就是说 我现在接收到的数据就是有问题的了? 那设置正确的情况下返回的该是什么呢?

#14


引用 13 楼 qq_17275555 的回复:
Quote: 引用 12 楼 cyg17173 的回复:

Quote: 引用 11 楼 qq_38588710 的回复:

Quote: 引用 10 楼 cyg17173 的回复:

接收的数据明显不对,地磅的设置有问题。
一般设置成功的数据都是这样,如8.62 Kg的数据格式:
=26.8000=26.8000=26.8000=26.8000
如果没秤东西,串口连接成功,则接收的数据一般是 =00.0000

呃,你这是自己解析后的数据吧,20 20 20 20 30这段数据怎么解

串口发送的都是ASCII , 查看ASCII 对照表,20是空格,30是0,31是1。
你现在配置不成功,所以接收的都是20 20 20 20 30这样的数据。
我当初花了1个月研究这个呢,当时手边没有电子秤,都是远程协助人家开发的。


那就是说 我现在接收到的数据就是有问题的了? 那设置正确的情况下返回的该是什么呢?

=00.0000
现在的电子秤,如 上海耀华,一些知名的品牌,都是这样的数据格式。

#15


有趣,楼主你查下ASCII码表,意思是00.0000对应的数据是30 30 30 30 30

#16


引用 14 楼 cyg17173 的回复:
Quote: 引用 13 楼 qq_17275555 的回复:

Quote: 引用 12 楼 cyg17173 的回复:

Quote: 引用 11 楼 qq_38588710 的回复:

Quote: 引用 10 楼 cyg17173 的回复:

接收的数据明显不对,地磅的设置有问题。
一般设置成功的数据都是这样,如8.62 Kg的数据格式:
=26.8000=26.8000=26.8000=26.8000
如果没秤东西,串口连接成功,则接收的数据一般是 =00.0000

呃,你这是自己解析后的数据吧,20 20 20 20 30这段数据怎么解

串口发送的都是ASCII , 查看ASCII 对照表,20是空格,30是0,31是1。
你现在配置不成功,所以接收的都是20 20 20 20 30这样的数据。
我当初花了1个月研究这个呢,当时手边没有电子秤,都是远程协助人家开发的。


那就是说 我现在接收到的数据就是有问题的了? 那设置正确的情况下返回的该是什么呢?

=00.0000
现在的电子秤,如 上海耀华,一些知名的品牌,都是这样的数据格式。


我这个是托利多T800,100吨地磅。

#17


引用 15 楼 qq_38588710 的回复:
有趣,楼主你查下ASCII码表,意思是00.0000对应的数据是30 30 30 30 30


按照官方给的文档,我不应该是根据状态码获取小数点位置么,他会直接在数据位上给我小数点? 不还是需要解析么。

#18


引用 17 楼 qq_17275555 的回复:
Quote: 引用 15 楼 qq_38588710 的回复:

有趣,楼主你查下ASCII码表,意思是00.0000对应的数据是30 30 30 30 30


按照官方给的文档,我不应该是根据状态码获取小数点位置么,他会直接在数据位上给我小数点? 不还是需要解析么。

是啊,我只是给你说明下这段数据怎么解,小数点还是看状态字A

#19


用串口调试伴侣 调试下,不称和称重状态,对比一下就出来了。
如果一直是 02 31 30 20 20 20 20 20 20 30 20 20 20 20 20 30 0D ,肯定就错了。
现在的电子秤都不用做太多的数据解析,发送的时候16进制,带有分割符=,serialPort1_DataReceived 接收到的就是已经解析好的
00.0000,然后反转数据就得到结果了。

#20


引用 19 楼 cyg17173 的回复:
用串口调试伴侣 调试下,不称和称重状态,对比一下就出来了。
如果一直是 02 31 30 20 20 20 20 20 20 30 20 20 20 20 20 30 0D ,肯定就错了。
现在的电子秤都不用做太多的数据解析,发送的时候16进制,带有分割符=,serialPort1_DataReceived 接收到的就是已经解析好的
00.0000,然后反转数据就得到结果了。


恩,这个东西是需要多测试,,谢了。

#21


重量数据转成Ascii码,再看下。20是空格,30是0。给出的重量数据的毛重和净重都是0。

#1


#2


31是状态A,转换成二进制是00110001,看前三位来确定你的小数点位置

#3





引用 2 楼 qq_38588710 的回复:
31是状态A,转换成二进制是00110001,看前三位来确定你的小数点位置


多谢大神,请问能在给点提示或者示例代码一类的吗,本人小白一只,,到现在只是调通了与地磅的通信 C#通过串口接收到的地磅数据解析问题

#4


02 31 30 20 20 20 20 20 20 30 20 20 20 20 20 30 0D 
这段数据02是起始符,固定的
31 30 20对应状态字ABC,从状态字A的二进制码前三位来读取你的小数位,同理利用状态字B的二进制位来读其他数据。你的开发文档里很清楚
两段20 20 20 20 30是你要读的数据,具体怎么定义的要自己去破解
0D为校验和
我说的还不够明白么

#5


引用 4 楼 qq_38588710 的回复:
02 31 30 20 20 20 20 20 20 30 20 20 20 20 20 30 0D 
这段数据02是起始符,固定的
31 30 20对应状态字ABC,从状态字A的二进制码前三位来读取你的小数位,同理利用状态字B的二进制位来读其他数据。你的开发文档里很清楚
两段20 20 20 20 30是你要读的数据,具体怎么定义的要自己去破解
0D为校验和
我说的还不够明白么

这里有点错误 数据X20 20 20 20 20 20 和数据Y 30 20 20 20 20 20是不同的皮重毛重我不清楚,看你怎么理解了

#6


协议中数据长18字节
而你给的数据长 17字节(02 31 30 20 20 20 20 20 20 30 20 20 20 20 20 30 0D)
显然没有校验和(协议中也说校验和是可选的)
第二个字节(31)是状态字A 前3个二进制位表示小数点位置 00110001
但协议说 00110 001 bit5恒为1 bit5恒为0,显然你的不是
可见你收到的数据是错误的

#7


引用 6 楼 xuzuning 的回复:
协议中数据长18字节
而你给的数据长 17字节(02 31 30 20 20 20 20 20 20 30 20 20 20 20 20 30 0D)
显然没有校验和(协议中也说校验和是可选的)
第二个字节(31)是状态字A 前3个二进制位表示小数点位置 00110001
但协议说 00110 001 bit5恒为1 bit5恒为0,显然你的不是
可见你收到的数据是错误的

补充了不少我的错误,但状态A这里00110001这是从低位开始读的,前三位是100

#8


是吗?你确定是倒过来读的?

#9


难道不是么,bit0难道不是最低位,我接触单片机比较多,I/O寄存器中就是这样的

#10


接收的数据明显不对,地磅的设置有问题。
一般设置成功的数据都是这样,如8.62 Kg的数据格式:
=26.8000=26.8000=26.8000=26.8000
如果没秤东西,串口连接成功,则接收的数据一般是 =00.0000

#11


引用 10 楼 cyg17173 的回复:
接收的数据明显不对,地磅的设置有问题。
一般设置成功的数据都是这样,如8.62 Kg的数据格式:
=26.8000=26.8000=26.8000=26.8000
如果没秤东西,串口连接成功,则接收的数据一般是 =00.0000

呃,你这是自己解析后的数据吧,20 20 20 20 30这段数据怎么解

#12


引用 11 楼 qq_38588710 的回复:
Quote: 引用 10 楼 cyg17173 的回复:

接收的数据明显不对,地磅的设置有问题。
一般设置成功的数据都是这样,如8.62 Kg的数据格式:
=26.8000=26.8000=26.8000=26.8000
如果没秤东西,串口连接成功,则接收的数据一般是 =00.0000

呃,你这是自己解析后的数据吧,20 20 20 20 30这段数据怎么解

串口发送的都是ASCII , 查看ASCII 对照表,20是空格,30是0,31是1。
你现在配置不成功,所以接收的都是20 20 20 20 30这样的数据。
我当初花了1个月研究这个呢,当时手边没有电子秤,都是远程协助人家开发的。

#13


引用 12 楼 cyg17173 的回复:
Quote: 引用 11 楼 qq_38588710 的回复:

Quote: 引用 10 楼 cyg17173 的回复:

接收的数据明显不对,地磅的设置有问题。
一般设置成功的数据都是这样,如8.62 Kg的数据格式:
=26.8000=26.8000=26.8000=26.8000
如果没秤东西,串口连接成功,则接收的数据一般是 =00.0000

呃,你这是自己解析后的数据吧,20 20 20 20 30这段数据怎么解

串口发送的都是ASCII , 查看ASCII 对照表,20是空格,30是0,31是1。
你现在配置不成功,所以接收的都是20 20 20 20 30这样的数据。
我当初花了1个月研究这个呢,当时手边没有电子秤,都是远程协助人家开发的。


那就是说 我现在接收到的数据就是有问题的了? 那设置正确的情况下返回的该是什么呢?

#14


引用 13 楼 qq_17275555 的回复:
Quote: 引用 12 楼 cyg17173 的回复:

Quote: 引用 11 楼 qq_38588710 的回复:

Quote: 引用 10 楼 cyg17173 的回复:

接收的数据明显不对,地磅的设置有问题。
一般设置成功的数据都是这样,如8.62 Kg的数据格式:
=26.8000=26.8000=26.8000=26.8000
如果没秤东西,串口连接成功,则接收的数据一般是 =00.0000

呃,你这是自己解析后的数据吧,20 20 20 20 30这段数据怎么解

串口发送的都是ASCII , 查看ASCII 对照表,20是空格,30是0,31是1。
你现在配置不成功,所以接收的都是20 20 20 20 30这样的数据。
我当初花了1个月研究这个呢,当时手边没有电子秤,都是远程协助人家开发的。


那就是说 我现在接收到的数据就是有问题的了? 那设置正确的情况下返回的该是什么呢?

=00.0000
现在的电子秤,如 上海耀华,一些知名的品牌,都是这样的数据格式。

#15


有趣,楼主你查下ASCII码表,意思是00.0000对应的数据是30 30 30 30 30

#16


引用 14 楼 cyg17173 的回复:
Quote: 引用 13 楼 qq_17275555 的回复:

Quote: 引用 12 楼 cyg17173 的回复:

Quote: 引用 11 楼 qq_38588710 的回复:

Quote: 引用 10 楼 cyg17173 的回复:

接收的数据明显不对,地磅的设置有问题。
一般设置成功的数据都是这样,如8.62 Kg的数据格式:
=26.8000=26.8000=26.8000=26.8000
如果没秤东西,串口连接成功,则接收的数据一般是 =00.0000

呃,你这是自己解析后的数据吧,20 20 20 20 30这段数据怎么解

串口发送的都是ASCII , 查看ASCII 对照表,20是空格,30是0,31是1。
你现在配置不成功,所以接收的都是20 20 20 20 30这样的数据。
我当初花了1个月研究这个呢,当时手边没有电子秤,都是远程协助人家开发的。


那就是说 我现在接收到的数据就是有问题的了? 那设置正确的情况下返回的该是什么呢?

=00.0000
现在的电子秤,如 上海耀华,一些知名的品牌,都是这样的数据格式。


我这个是托利多T800,100吨地磅。

#17


引用 15 楼 qq_38588710 的回复:
有趣,楼主你查下ASCII码表,意思是00.0000对应的数据是30 30 30 30 30


按照官方给的文档,我不应该是根据状态码获取小数点位置么,他会直接在数据位上给我小数点? 不还是需要解析么。

#18


引用 17 楼 qq_17275555 的回复:
Quote: 引用 15 楼 qq_38588710 的回复:

有趣,楼主你查下ASCII码表,意思是00.0000对应的数据是30 30 30 30 30


按照官方给的文档,我不应该是根据状态码获取小数点位置么,他会直接在数据位上给我小数点? 不还是需要解析么。

是啊,我只是给你说明下这段数据怎么解,小数点还是看状态字A

#19


用串口调试伴侣 调试下,不称和称重状态,对比一下就出来了。
如果一直是 02 31 30 20 20 20 20 20 20 30 20 20 20 20 20 30 0D ,肯定就错了。
现在的电子秤都不用做太多的数据解析,发送的时候16进制,带有分割符=,serialPort1_DataReceived 接收到的就是已经解析好的
00.0000,然后反转数据就得到结果了。

#20


引用 19 楼 cyg17173 的回复:
用串口调试伴侣 调试下,不称和称重状态,对比一下就出来了。
如果一直是 02 31 30 20 20 20 20 20 20 30 20 20 20 20 20 30 0D ,肯定就错了。
现在的电子秤都不用做太多的数据解析,发送的时候16进制,带有分割符=,serialPort1_DataReceived 接收到的就是已经解析好的
00.0000,然后反转数据就得到结果了。


恩,这个东西是需要多测试,,谢了。

#21


重量数据转成Ascii码,再看下。20是空格,30是0。给出的重量数据的毛重和净重都是0。