请问51单片机如何解决多字节串口接收问题

发布网友 发布时间:2022-04-24 09:06

我来回答

4个回答

热心网友 时间:2022-06-18 09:21

串口的收发可以用查询和中断两个办法来实现。
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把它变成状态机的状态,思考一下,改改程序更佳。

热心网友 时间:2022-06-18 09:21

程序编写的,思路不对。
接收,每次中断,只能收一个字节。

楼主的程序,在中断里面,循环接收,这是收不到什么结果的。
你的这次中断,不结束,下次中断就进不来。

第一个字节为0x23,需要判断出来。

当收到了第一个字节为0x23,之后的每次中断,再顺序存放收到的数据。

热心网友 时间:2022-06-18 09:22

你好!串口接收,不是采用for循环,要顺序接收,然后存入数组

热心网友 时间:2022-06-18 09:22

这是我最近毕设写的用于计算机与单片机通信的   如接收到上位机命令则发送三个字节  接收用中断方法  发送用查询方法   仅供参考

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com