文泰 发表于 2025-5-9 13:43:26

AI8G单片机串口一直在接收数据时,出现接收不到数据现象

MCU端串口一直接收数据,上一次接收的数据还没接收完,就又收到新的数据,然后单片机端一直不执行反馈信息给串口助手端,这个问题是啥情况呀?正常代码是mcu端每接收完一次数据先返回一个数给PC串口助手端,现在就mcu还没返回信息给串口助手端,MCU就又接到新的数据。导致后面都不在返回数据了,而且也MCU也收不到数据了。代码串口是中断方式。下面是串口的中断函数和main函数部分代码
main()
{
.........
....

   while(1) {
                unsigned char *p = ReadUart();      //½ÓÊÕ»º³åÇøµÄÊý¾Ý
                #if 1
               
                lock_buf = p;                //Ö¡Í·
                lock_buf = p;                //½âÎö»º³åÇøÊý¾Ý,µÚ¼¸¸ö°å¿¨
                lock_buf = p;                //½âÎö»º³åÇøÊý¾Ý£¬µÚ¼¸¸öËø
                delay_ms(50);

                if(lock_buf == 0xAA){
                        if(lock_buf == 1)                //
                        {
                              lock_buf_test = 0xbb;                //Ö¡Í·
                              lock_buf_test = lock_buf;                //½âÎö»º³åÇøÊý¾Ý,µÚ¼¸¸ö°å¿¨
                              lock_buf_test = lock_buf;                //½âÎö»º³åÇøÊý¾Ý£¬µÚ¼¸¸öËø
                              WriteUart(lock_buf_test,3);
                              Lock_open_conctrl(lock_buf,1);
                              delay_ms(50);
                              Lock_open_conctrl(lock_buf,0);                                                      
                        }else{
                                                COMD485=0xee;
                                                WriteUart(COMD485,3);
                        }
                        memset(lock_buf,0,3);
                        memset(p,0,3);
                        delay_ms(50);
                }
                #endif
    }

.....
.....
}



//========================================================================
// 函数: void UART1_int (void) interrupt UART1_VECTOR
// 描述: UART1中断函数
// 参数: none
// 返回: none
// 备注:
//========================================================================
void UART1_int (void) interrupt 4
{
      /*
      在模式0,当串口接收数据第8位结束时,由硬件自动将RI置1,并向主机请求中断,响应中断后,需要主动将RI清零
      在其他模式,串行接收到停止为的中间时刻由硬件自动将RI置1,向CPU发中断申请,响应中断后RI必须由软件清零。
      */
      //if(RI)
      if((SCON & 1) != 0)
    {
      SCON &= ~1;    //Clear Rx flag
                        //RI = 0;//Clear Rx flag
      RX1_Buffer = SBUF;
      if(++RX1_Cnt >= 3){
                                        RX1_Cnt = 0;
                                        //RI = 0;//Clear Rx flag
                                        RS485_TX();
                              }
    }
                /*
                在模式0,当串口发送数据第8位结束时,由硬件自动将TI置1,并向主机请求中断,响应中断后,需要主动将TI清零
                在其他模式,则在停止位开始发送时由硬件自动将TI置1,向CPU发中断申请,响应中断后TI必须由软件清零。
                */
    //if(TI)
                if((SCON & 2) != 0)      
    {
                         SCON &= ~2;    //Clear Tx flag
                         //TI = 0;//Clear Rx flag
                         if(++TX1_Cnt >= SendLength){
                                        B_TX1_Busy = 0;
                                 RS485_RX();
                                  return;
                         }else{
                                        SBUF = *(pSendData + TX1_Cnt);
                              }
    }
}


ercircle 发表于 2025-5-9 14:03:08

建议打包上传工程,缺失关键代码
ReadUart
RS485_TX
RS485_RX

DebugLab 发表于 2025-5-9 15:25:13

串口收发程序参考:
https://www.stcaimcu.com/thread-16321-1-1.html
https://www.stcaimcu.com/thread-4598-1-1.html

文泰 发表于 2025-5-9 16:51:34

你好,工程上傳了,在附件,請下載分析,謝謝

文泰 发表于 2025-5-9 16:54:30

你好,已经上传工程文件,请下载分析,谢谢

梁工 发表于 2025-5-12 15:55:01

上一次接收的数据还没接收完,就又收到新的数据,这是设计协作不合理造成,发送方必须等一包数据发送完毕,才能发送下一包数据。
页: [1]
查看完整版本: AI8G单片机串口一直在接收数据时,出现接收不到数据现象