标题: 单片机怎样持续接收上位机传来的数据? [打印本页]

作者: 15556751075    时间: 2022-5-7 10:42
标题: 单片机怎样持续接收上位机传来的数据?
单片机程序代码如下,接收到的数在oled上显示,怎么判断接收完成,把count清零
void Usart() interrupt 4
{
        u8 Res;
        if(RI==1)
        {
                RI=0;                        //清除接收中断标志位
                Res = SBUF;                //出去接收到的数据,将接收的的数据存入Res
                Buffer[count] = Res;        
                count++;
                OLED_ShowString(0,2,Buffer);
        }
}        



作者: 人人学会单片机    时间: 2022-5-7 12:12
单片机发送到串口助手,以及串口助手显示到LCD1602
http://www.51hei.com/bbs/dpj-214747-1.html
作者: 人人学会单片机    时间: 2022-5-7 12:12
仅供参考

作者: Y_G_G    时间: 2022-5-7 12:36
首先,你要看上位机有没有协议,比如有结束符之类的,如果有结束符,那就是根据结束符判断
如果是你自己的电脑发送,你可以在命令后面加个结束符,比如 0xff 0xff 0xff
当串口接收到三个0xff之后,就判定为接收结束
count是用限定接收字节数量的,不让接收超过Buffer[] 的长度
而且,每次接收完一个命令之后,Buffer[] 里面的数据要清除

以上是以接收命令的形式处理的
但你的代码并不是,你的代码是接收到一个字节就显示一次的,那就count限定接收数组长度而已,长度到了就清除
作者: Hephaestus    时间: 2022-5-7 13:40
判断接收是否完成需要看具体的上下位机通讯协议,你什么都不说,到网上来问也不可能有答案的。
作者: 15556751075    时间: 2022-5-7 15:13
Hephaestus 发表于 2022-5-7 13:40
判断接收是否完成需要看具体的上下位机通讯协议,你什么都不说,到网上来问也不可能有答案的。

就是想知道51单片机和上位机之间的关系,串口通信连通上位机之后,上位机发送一个数值过来,怎么程序里判断位证明数值接收结束,我现在的程序只能接收一次

作者: wskufo    时间: 2022-5-7 15:18
               RI=0;                        //清除接收中断标志位
                Res = SBUF;                //出去接收到的数据,将接收的的数据存入Res
                Buffer[count] = Res;      
                count++;
                if(count>10)  count= 0;
                OLED_ShowString(0,2,Buffer);
作者: Hephaestus    时间: 2022-5-7 15:20
15556751075 发表于 2022-5-7 15:13
就是想知道51单片机和上位机之间的关系,串口通信连通上位机之后,上位机发送一个数值过来,怎么程序里判 ...

既然已经进了中断而且RI置位证明一个字节接收完毕,至于为什么只能接受一个只能问你自己。
作者: 15556751075    时间: 2022-5-7 20:40
Hephaestus 发表于 2022-5-7 15:20
既然已经进了中断而且RI置位证明一个字节接收完毕,至于为什么只能接受一个只能问你自己。

有人听懂我说啥,有人听不懂,算了,我解决了
作者: hy47566398    时间: 2022-5-8 14:43
供参考:

void Int4Func()                interrupt 4
{
        if(RI)
        {
                RxBuf = SBUF;
                sCommand[i] = SBUF;
                RI = 0;
                i++;
        }
       
        if(TI)
        {
                if(RxBuf!=0)
                {
                        SBUF = RxBuf;
                        RxBuf = 0;
                        TI = 0;
                }       
        }
}

char  sCommand[48]={0}; 接收串口程序中输入的命令,全局变量

main()中:

        while(1)
        {

                if(i!=0)
                {
                        SplitCmd();
                        memset(sCommand, 0x0, sizeof(sCommand));
                        i = 0;
                }
                。。。。。
作者: xiaoyuxinke    时间: 2022-5-8 14:44
发送端发送完成再发送一个结束符或结束标志,接到到这个符号或标志就是本次接收完成
作者: yzwzfyz    时间: 2022-5-9 17:13
1、建立一个缓冲区,并设立一个指针RES_PC
2、当串口收到数据时,会产生串口中断,你在中断服务程序中将收到的数据存入缓冲区中(利用RES_PC,依次存入)。
接下来你可以对缓冲区中数据进行分析处理,想咋弄就咋弄。
作者: laowang123222    时间: 2022-5-10 02:02
不知道你说的意思




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1