51单片机如何进行多字节串口接收?!!!

比如:通过串口助手发送三位数据,让数码管显示对应的三位数据。听说这个要制定串口通信协议,那么如何制定协议,又如何去编程呢?
大神求赐教!
当然,给出基于51单片机的程序,让串口上发送三位数据,对应的数码管显示相应的数字最好不过了

串口的收发可以用查询和中断两个办法来实现。
1、查询方法更适合于半双工机制,编写的思路简单,程序结构简单,在全双工通信中易出问题。
2、中断方法则更高效。你的程序把两种方法混搭使用,容易出错。

以你的程序为例,一旦收到首个23H字符,就停止在中断服务中for循环里面等待5个剩余字符。假设传感器只发了3个字符,你的程序就停止在for循环里面。
以你的程序为例改进,在中断服务接收中,每次接收中断只收1个字符,完成后退出。
void uart_interrupt(void) interrupt 4 using 0
{
static unsigned char i=0;
unsigned char buf;
if(RI==1)
{
buf=SBUF;
switch(i)
{
case 0:
if(buf==0x23)i=1;
break;
case 1:
case 2:
case 3:
case 4:
case 5:
buffer[i-1]=buf;
i++;
if(buf==0x23)
i=1;
if(i==5)
{
do_something_here(buffer);
i=0;
}
break;
default: i=0;break;
}
RI = 0; //RI清零
}
if(TI==1) TI=0; //TI清零
}
这样改符合你的思维习惯吗?实际串口协议解析与协议密切相关,用状态机做比较好。程序中i把它变成状态机的状态,思考一下,改改程序更佳。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-11-15
应该是是上位机发送字符串到单片机。单片机接收一个字符就会进入串口中断,定义个TextBuf数组用来接收字符串,每次接收的字符都加到TextBuf,直到接收到'\0'代表一个字符串接收完毕。本回答被网友采纳
第2个回答  2015-11-15
看数据量和数据速度,如果数据量小,间隔大。那么完全可以单独接收和显示。如果是间隔时间小,可以在接收到开始标志之后,把需要的数据存在数组中,在收到结束标志之后慢慢解析数据包
相似回答