我需要一个程序,51单片机串口接受到一帧数据并把这一帧数据赋值到一个数组中。

谢谢了,真的没有财富值值了
2024-11-01 12:33:44
有2个网友回答
网友(1):

你这串口接收子程序,只要接收到第一个字节的数据就一直在中断子程序中,然后等待接收其它数据了,
while(!RI); 这就是在等待接收其它数据了,接收完了以后又在中断子程序连续发送了。这么写程序是有很大弊病的,一旦进入中断程序,到最后发送结束,都一直在中断子程序中,那这个期间单片机是不能再做其它工作的,也就是不能再执行主程序了。
while(!RI);这就是查询方式等待接收数据,那又何必写成中断程序呢,不如直接写成查询程序了,同样下面的, while(!TI);这也明明是在查询方式发送,就不必要写在中断程序中了。
既然采用中断的方式,就是当接收到一个数据后才响应一次中断,保存这个数据,然后就立即从中断返回,这样,继续执行主程序,这样,接收数据和发送数据才不影响主程序。
同理,在中断程序发送一个字节的数据就立即从中断返回执行主程序,也不影响主程序的执行。
另外,更重要的一点就是while(!RI);,等待接收数据,如果不能收到数据就永远等待下去,假如通信线有故障,或者发送方有问题,不能发送数据了,那么将永远等待下去,这就相当于死机了,多可怕,写程序就怕这个事情发生的。

网友(2):

这不就是串口接收吗,你看下STC有资料的,可以用中断也可以用查询方法来接收,这么说还不会的话,哦。。。多看下资料了,只能这么说。这么的,贴一点我自己的代码你参考看下吧:
void sCom1Main() interrupt 4{
if(RI){
RI = 0;
if(biComE232RxFlg==0 ){// 解析后再读第2次
if(ucE232RxCnt < 8){//8个数据 解析一次
ucE232RxBuf[ucE232RxCnt] = SBUF;//存放数组
ucE232RxCnt++;
if(ucE232RxCnt ==8){//8个数据 解析一次
biComE232RxFlg = 1;//设置解析标志
}
}
}
}
}