标题: 单片机串口数据接收程序问题 [打印本页]

作者: YXLlll    时间: 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;


作者: chenbingjy    时间: 2023-1-21 20:11
你的程序不完整。而且发送的程序不要在中,有可能造成数据没发送完又收到新的数据,会丢数据。
中断只负责把数据送人缓冲区,其他处理在主函数。
作者: Hephaestus    时间: 2023-1-23 11:18
代码不全无法分析,i怎么定义的,代码后面如何处理i的?
作者: 名字不是重点    时间: 2023-1-26 18:01
Sbuf[i++],,这个i是全局变量,该不会是被其它函数修改了吧?
全局变量最好能起个有意义的、个性的名字,不然有可能会被误操作,我看用rxd_count就不错
接收数据的数组Sbuf,尽量不要用系统关键字SBUF,虽然KEIL大小写不一样,你无法保证会不会被误操作,你看rxd_arr[]如何?
起名字是个学问~~好听、好拼写、还要有意义,英文简写或汉语拼音都可以啊。不用这么懒吧?
作者: Y_G_G    时间: 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;                                                        //接收完一个字节数据,重新计时                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
                }
        //───────────────────────────────────────────────────────────                                                       
}






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