找回密码
 立即注册
查看: 450|回复: 7

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

[复制链接]
  • 打卡等级:常住居民II
  • 打卡总天数:87
  • 最近打卡:2025-04-27 06:53:22

12

主题

54

回帖

611

积分

高级会员

积分
611
发表于 2024-9-25 21:33:09 | 显示全部楼层 |阅读模式
本帖最后由 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[ReceiveUartCMDStructure.ReceivedCMDDataLength++] = DataTemp;
                                
                ReceiveUartCMDStructure.ReceivedDataTimeCount = 0;
                RI = 0;                                                //清除串口接收中断标记        
            }

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



避开上电期间部分代码:


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


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

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2024-9-25 22:51:40 | 显示全部楼层
本质是硬件设计问题或代码严谨性的问题,与单片机无关,比如串口初始化和IO初始化的先后顺序不合理,比如串口通信双方的上电不同步,都会产生一个伪起始位,接收侧的表现就是收到一个不伦不类的单字节误码。
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2219

回帖

5452

积分

版主

积分
5452
发表于 2024-9-25 23:19:06 | 显示全部楼层
启动的时候串口接收标志位暂时不打开,等全部启动完整再打开就好了。
初始化的手提前打开容易被IO口操作或者高阻态随机电平影响
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:518
  • 最近打卡:2025-05-01 05:52:49
已绑定手机

46

主题

1694

回帖

2540

积分

金牌会员

积分
2540
发表于 2024-9-26 06:29:20 | 显示全部楼层
我一般上电后开始的一段时间啥也不干
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

积分
5204
发表于 2024-9-26 08:56:56 | 显示全部楼层
延时一点时间后再开中断,不知道行不行

点评

只有电源特别孱弱的时候才需要考虑这个,只要初始化外设的流程比较严谨,都不会出现这样那样的问题,另外,串口通信一般不会用单字节去传输什么重要信息,都需要编帧传输的,虽然不是必须像MODBUS一样搞CRC校验,起  详情 回复 发表于 2024-9-26 11:27
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2024-9-26 11:27:58 | 显示全部楼层
xxkj*** 发表于 2024-9-26 08:56
延时一点时间后再开中断,不知道行不行

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

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:87
  • 最近打卡:2025-04-27 06:53:22

12

主题

54

回帖

611

积分

高级会员

积分
611
发表于 2024-9-27 05:54:43 | 显示全部楼层
xxkj*** 发表于 2024-9-26 08:56
延时一点时间后再开中断,不知道行不行

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2024-9-27 10:12:02 | 显示全部楼层
古人来*** 发表于 2024-9-27 05:54
试过在进入while(1)前开中断,还是会收到数据。在初始化前加入delay(),大概1s,那么接收的数据也会延迟 ...

开中断前清一下中断标志:RI = 0;
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 01:47 , Processed in 0.125946 second(s), 98 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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