单片机串口收发字符数据的类型

2019-04-15 19:28发布

  今天在用51单片机进行串口收发数据的时候遇到了这样一个问题,上位机给单片机的字符数据是什么类型的,单片机又是怎样存储的?串口中断如下/* UART中断服务函数 */ void InterruptUART() interrupt 4 { if (RI) //接收到字节 { RI = 0; //手动清零接收中断标志位 table1[j] = SBUF; //接收到的数据保存到接收字节变量中 if(table1[0] == 0x0D) f = 1; else f =0; table1[j] = table1[j]&0x0f; j++; flag1 = 1; } else //字节发送完毕 { TI = 0; //手动清零发送中断标志位 FS_Bit = 0; } } 问题1:单片机将接收到的数据放到SBUF中存储,但这个SBUF只能存储8位数据(1个字节),那么就有了第一个问题:如何接收多位数据?答:我是定义了一个table1[]数组,将每个接收到的8位数据放到数组里,然后指针自加1,在另一个中断里判断一共接收到了几个数据(j起自加和计数作用),然后延时1s后,将接收到的每个元素输出(1s足够接收到几个字节的数据了)。问题2那么table1[]里的数据是什么类型的呢?答:它是一个二进制数据,是接收到字节的二进制ascii码,如果再用SBUF发送出去,也是发送的二进制数据,不过上位机接收的时候自动转换成字节了。问题三如何将接收到的二进制ascii码进行十进制运算呢?答:其实二进制与十进制计算方法、过程、结果都一样。但是用字符类型传给单片机的数字的二进制与对应十进制的二进制是不一样的,比如说上位机字符格式发送过来一个数据2,单片机接收到的二进制ascii码0011 0010,而十进制的2对应的二进制是 0000 0010,所以不能直接对字符格式的数字进行运算,所以我用了table1[j] = table1[j]&0x0f;将高四位都清0,与十进制的2对应起来,然后就可以进行运算了。(但是上位机发送一个大写字母R与字符2是一样的,因为R的ascii码是 0000 0010)