古人来者_昌 发表于 2024-9-25 21:33:09

AI8H8K64U上电过程中,串口接收不明数据

本帖最后由 DebugLab 于 2024-9-26 09:42 编辑

吐槽下, AI8H8K64U上电过程中,串口接收到不明数据, 需要软件避开此时间段,具体代码如下:

void UART1_int (void) interrupt 4
{
      u8 DataTemp;
      
    if( RI )                                                      //接收数据中断被置位,接收数据
            {      
                  DataTemp = SBUF;
                                                
                  if( (ReceiveUartCMDStructure.ReceivedCMDDataLength == 0) && (DataTemp == DATA_START))      //一帧数据开始                        
                        ReceiveUartCMDStructure.StartReceiveDataTimeCountEnable = ENABLE;      
               
                if( ReceiveUartCMDStructure.StartReceiveDataTimeCountEnable == ENABLE )               
                           ReceiveUartCMDStructure.ReceivedCMDDataBuffer = DataTemp;
                              
                ReceiveUartCMDStructure.ReceivedDataTimeCount = 0;
                RI = 0;                                                //清除串口接收中断标记      
            }

    if( TI )                                                      //发送数据中断被置位,发送数据完成
            {      
               TI = 0;                                                //清除串口发送中断完成标记                              
                Bit_TXD1_Busy = 0;                        //串口空闲标记置位
            }      
}



避开上电期间部分代码:


      if((ReceiveUartCMDStructure.ReceivedCMDDataBuffer != DATA_START ) ||                              //核对数据起始和结束是否正确
                (ReceiveUartCMDStructure.ReceivedCMDDataBuffer != DATA_END ))
                        {
                              if( PowerOnTimeDelay == ERROR )                //上电期间不发送数据
                                        {
                                                InitReceiveUartCMDStructure();
                                                return;
                                        }
                              Uart_SendBytes(DataInvalidError, sizeof(DataInvalidError));                              //返回无效数据               
                              //Uart1_Send8Bit(0xAA);
                              //Uart_SendBytes(ReceiveUartCMDStructure.ReceivedCMDDataBuffer,DataLength);
                              InitReceiveUartCMDStructure();                              
                              return ;
                        }


有些芯片有这个问题,有些芯片没有,并且同一个芯片也不是每次都会收到数据,有一定的概率。

晓飛飛 发表于 2024-9-25 22:51:40

本质是硬件设计问题或代码严谨性的问题,与单片机无关,比如串口初始化和IO初始化的先后顺序不合理,比如串口通信双方的上电不同步,都会产生一个伪起始位,接收侧的表现就是收到一个不伦不类的单字节误码。

王昱顺 发表于 2024-9-25 23:19:06

启动的时候串口接收标志位暂时不打开,等全部启动完整再打开就好了。
初始化的手提前打开容易被IO口操作或者高阻态随机电平影响

jwd 发表于 2024-9-26 06:29:20

我一般上电后开始的一段时间啥也不干

xxkj2010 发表于 2024-9-26 08:56:56

延时一点时间后再开中断,不知道行不行

晓飛飛 发表于 2024-9-26 11:27:58

xxkj2010 发表于 2024-9-26 08:56
延时一点时间后再开中断,不知道行不行

只有电源特别孱弱的时候才需要考虑这个,只要初始化外设的流程比较严谨,都不会出现这样那样的问题,另外,串口通信一般不会用单字节去传输什么重要信息,都需要编帧传输的,虽然不是必须像MODBUS一样搞CRC校验,起码帧头帧尾之类的是肯定要做的,接收端只对完整的帧数据敏感,其它的都应该过滤掉,这样才是一个稳健的传输

古人来者_昌 发表于 2024-9-27 05:54:43

xxkj2010 发表于 2024-9-26 08:56
延时一点时间后再开中断,不知道行不行

试过在进入while(1)前开中断,还是会收到数据。在初始化前加入delay(),大概1s,那么接收的数据也会延迟相应的时间。

乘风飞扬 发表于 2024-9-27 10:12:02

古人来者_昌 发表于 2024-9-27 05:54
试过在进入while(1)前开中断,还是会收到数据。在初始化前加入delay(),大概1s,那么接收的数据也会延迟 ...

开中断前清一下中断标志:RI = 0;
页: [1]
查看完整版本: AI8H8K64U上电过程中,串口接收不明数据