引言:
连接上串口是应用与MCU接发指令的桥梁打通了,那十六进制数据流就是其中重要的信息展示,可是刚开始拿到电控给的一串数据包时也是一头雾水。他们是一个一个字节给的数据,所以这篇文章就是记录一下怎么读懂字节。
MCU为啥一个一个byte发数据?
MCU一般是8位或者16位的,而且它的缓存不会很大一般是(1~3)8个位,所以MCU为防止数据被覆盖基本上都是对数据进行实时操作的,所以平板上接受也是byte流。
以"0xAA"开始
“0x”在java上表示的小写十六进制, “0xAA"表示的二进制是“10 10 10 10”,无符号十进制是“170” 有符号的十进制是“-86”,那当平板是收到“0xAA”字节时是怎么样表示的呢?
是-86,为啥不是170呢?
计算机内二进制都是以补码形式存储的。byte类型的长度为8bit,而int类型为32bit。 一个byte AA转成int的逻辑先将“10 10 10 10” 有符号补位成
11 11 11 11 11 11 11 11 11 11 11 11 10 10 10 10 (补码) 补码转反码:-1
11 11 11 11 11 11 11 11 11 11 11 11 10 10 10 01(反码)反码转源码:除去符号位其他位取反
10 00 00 00 00 00 00 00 00 00 00 00 01 01 01 10(源码-86)
如何得到170呢?
11 11 11 11 11 11 11 11 11 11 11 11 10 10 10 10 & 0xFF
00 00 00 00 00 00 00 00 00 00 00 00 10 10 10 10 (补码)正数的 补码和反码都是本身
00 00 00 00 00 00 00 00 00 00 00 00 10 10 10 10(源码 170)
平板端准备数据
java 上int 是4位byte 所以直接强转去掉前3个字节就可以了 byte a=(byte)
结语
串口通信看不懂的地方就是接受到的字节如果数字是170前的没有符号位的问题,之后到255的数据都需要“& 0xff” 。