找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 839|回复: 4
收起左侧

单片机串口数据接收程序问题

[复制链接]
ID:1060138 发表于 2023-1-20 17:51 | 显示全部楼层 |阅读模式
想要实现串口从上位机接收到的数据一个一个存入数组中,
但是经过测试,数据只能存到数组的第一位中,而且RI=0所在位置不同,存入内容长短不同


void UART1_Isr() interrupt 4
{
        if(RI==1)
        {
                Data=SBUF;
                if(Data!='\0')
                {Sbuf[i++]=Data;}
               
                uart_send(Sbuf[0]);
                uart_string(Sbuf);RI=0;

回复

使用道具 举报

ID:232462 发表于 2023-1-21 20:11 | 显示全部楼层
你的程序不完整。而且发送的程序不要在中,有可能造成数据没发送完又收到新的数据,会丢数据。
中断只负责把数据送人缓冲区,其他处理在主函数。
回复

使用道具 举报

ID:883242 发表于 2023-1-23 11:18 | 显示全部楼层
代码不全无法分析,i怎么定义的,代码后面如何处理i的?
回复

使用道具 举报

ID:824490 发表于 2023-1-26 18:01 | 显示全部楼层
Sbuf[i++],,这个i是全局变量,该不会是被其它函数修改了吧?
全局变量最好能起个有意义的、个性的名字,不然有可能会被误操作,我看用rxd_count就不错
接收数据的数组Sbuf,尽量不要用系统关键字SBUF,虽然KEIL大小写不一样,你无法保证会不会被误操作,你看rxd_arr[]如何?
起名字是个学问~~好听、好拼写、还要有意义,英文简写或汉语拼音都可以啊。不用这么懒吧?
回复

使用道具 举报

ID:401564 发表于 2023-2-9 23:58 | 显示全部楼层
当初学ModBus的时候写的,代码不怎么好,但也算是正确,你参考一下
void Uart1_Isr() interrupt 4                                                //串口1中断函数
{
        static unsigned RX_Count=0;                                                //接收到的字节数
        if(TI)                                                                                          //发送中断
                   {                          
                         TI=0;                                          
                        busy=0;                  
                }
        //────────────────────────────────────────────────────
        if(RI)                                                                                        //接收中断
                {       
                        RI=0;                                               
                        if((New_Cmd))                                                        //新命令
                           {
                                        New_Cmd=0;                                                //新命令标志位清除       
                                        TR0 = 1;                                                //接收到串口信号后,定时器0开始计时       
                                        RX_Count=0;                                                //重新指定指针位置
                                        Buffer0.cnt_Byte=0;                                //接收字节数清除                                                                       
                                }
                        Buffer0.buf_uart[RX_Count]=SBUF;                //把接收到的数据保存
                        RX_Count++;                                                                //数组指针加1
                        Buffer0.cnt_Byte++;                                                //接收字节数+1
                        T0_1ms_uart=0;                                                        //接收完一个字节数据,重新计时                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
                }
        //───────────────────────────────────────────────────────────                                                       
}

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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