找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1699|回复: 12
收起左侧

单片机怎样持续接收上位机传来的数据?

[复制链接]
ID:316759 发表于 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);
        }
}        


回复

使用道具 举报

ID:390416 发表于 2022-5-7 12:12 | 显示全部楼层
单片机发送到串口助手,以及串口助手显示到LCD1602
http://www.51hei.com/bbs/dpj-214747-1.html
回复

使用道具 举报

ID:390416 发表于 2022-5-7 12:12 | 显示全部楼层
仅供参考
回复

使用道具 举报

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

以上是以接收命令的形式处理的
但你的代码并不是,你的代码是接收到一个字节就显示一次的,那就count限定接收数组长度而已,长度到了就清除
回复

使用道具 举报

ID:883242 发表于 2022-5-7 13:40 | 显示全部楼层
判断接收是否完成需要看具体的上下位机通讯协议,你什么都不说,到网上来问也不可能有答案的。
回复

使用道具 举报

ID:316759 发表于 2022-5-7 15:13 | 显示全部楼层
Hephaestus 发表于 2022-5-7 13:40
判断接收是否完成需要看具体的上下位机通讯协议,你什么都不说,到网上来问也不可能有答案的。

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

使用道具 举报

ID:960157 发表于 2022-5-7 15:18 | 显示全部楼层
               RI=0;                        //清除接收中断标志位
                Res = SBUF;                //出去接收到的数据,将接收的的数据存入Res
                Buffer[count] = Res;      
                count++;
                if(count>10)  count= 0;
                OLED_ShowString(0,2,Buffer);
回复

使用道具 举报

ID:883242 发表于 2022-5-7 15:20 | 显示全部楼层
15556751075 发表于 2022-5-7 15:13
就是想知道51单片机和上位机之间的关系,串口通信连通上位机之后,上位机发送一个数值过来,怎么程序里判 ...

既然已经进了中断而且RI置位证明一个字节接收完毕,至于为什么只能接受一个只能问你自己。
回复

使用道具 举报

ID:316759 发表于 2022-5-7 20:40 | 显示全部楼层
Hephaestus 发表于 2022-5-7 15:20
既然已经进了中断而且RI置位证明一个字节接收完毕,至于为什么只能接受一个只能问你自己。

有人听懂我说啥,有人听不懂,算了,我解决了
回复

使用道具 举报

ID:1012735 发表于 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;
                }
                。。。。。
回复

使用道具 举报

ID:61140 发表于 2022-5-8 14:44 | 显示全部楼层
发送端发送完成再发送一个结束符或结束标志,接到到这个符号或标志就是本次接收完成
回复

使用道具 举报

ID:123289 发表于 2022-5-9 17:13 | 显示全部楼层
1、建立一个缓冲区,并设立一个指针RES_PC
2、当串口收到数据时,会产生串口中断,你在中断服务程序中将收到的数据存入缓冲区中(利用RES_PC,依次存入)。
接下来你可以对缓冲区中数据进行分析处理,想咋弄就咋弄。
回复

使用道具 举报

ID:1013784 发表于 2022-5-10 02:02 | 显示全部楼层
不知道你说的意思
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表