51单片机如何进行多字节串口接收?!!! 15
比如:通过串口助手发送三位数据,让数码管显示对应的三位数据。听说这个要制定串口通信协议,那么如何制定协议,又如何去编程呢?大神求赐教!当然,给出基于51单片机的程序,让串...
比如:通过串口助手发送三位数据,让数码管显示对应的三位数据。听说这个要制定串口通信协议,那么如何制定协议,又如何去编程呢?
大神求赐教!
当然,给出基于51单片机的程序,让串口上发送三位数据,对应的数码管显示相应的数字最好不过了 展开
大神求赐教!
当然,给出基于51单片机的程序,让串口上发送三位数据,对应的数码管显示相应的数字最好不过了 展开
3个回答
展开全部
串口的收发可以用查询和中断两个办法来实现。
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、查询方法更适合于半双工机制,编写的思路简单,程序结构简单,在全双工通信中易出问题。
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把它变成状态机的状态,思考一下,改改程序更佳。
2015-11-15
展开全部
应该是是上位机发送字符串到单片机。单片机接收一个字符就会进入串口中断,定义个TextBuf数组用来接收字符串,每次接收的字符都加到TextBuf,直到接收到'\0'代表一个字符串接收完毕。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2015-11-15
展开全部
看数据量和数据速度,如果数据量小,间隔大。那么完全可以单独接收和显示。如果是间隔时间小,可以在接收到开始标志之后,把需要的数据存在数组中,在收到结束标志之后慢慢解析数据包
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |