最近在工作中,用到了激光位移传感器,其测得数据与单片机通过422进行通信,而数据格式为ASCII码。
大致为 % 0 1 $ R M D - 0 1 2 3 4 5 6 * * CR 这种格式,共18个字节,返回这组数据即代表测得长度为- 12.3456mm。
这就涉及到了一个将ASCII码转换为一个直接可以进行运算的类型的问题。
假设所需要的数为1 2 3 4这四位 ,这四个ASCII码对应的十六进制分别为0x31 0x32 0x33 0x34
先进行如下运算
0x31&0x0f = 0x01; //第一个字节与0x0f 按位与,取低四位
0x01<<4 = 0x10; //左移四位
0x32&0x0f= 0x02; //第二个字节与0x0f 按位与,取低四位
0x10|0x02 = 0x12; //拼成一个字节
后两个字节,进行同样的操作,拼成0x34
这样,1 2 3 4 四个ASCII码就可以用0x12 0x34 两个自己来传递信息,此时单片机将其发送给上位机是比较合适的。
上位机接收到之后,再次进行处理,进行如下运算
(0x12>>4)&0xff=0x01
0x12&0x0f = 0x02
(0x34>>4)&0xff=0x03
0x34&0x0f = 0x04
0x01*1000+0x02*100+0x03*10+0x04=1234
这样就将 1 2 3 4 四个ascii码代表的数字换算了出来,如过原信息中有小数点,再进行相应的除运算。
工作中遇到了,暂且记录一下,如过以后有其他的方法,再加入其中。