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 ;
}
有些芯片有这个问题,有些芯片没有,并且同一个芯片也不是每次都会收到数据,有一定的概率。
本质是硬件设计问题或代码严谨性的问题,与单片机无关,比如串口初始化和IO初始化的先后顺序不合理,比如串口通信双方的上电不同步,都会产生一个伪起始位,接收侧的表现就是收到一个不伦不类的单字节误码。 启动的时候串口接收标志位暂时不打开,等全部启动完整再打开就好了。
初始化的手提前打开容易被IO口操作或者高阻态随机电平影响 我一般上电后开始的一段时间啥也不干 延时一点时间后再开中断,不知道行不行
xxkj2010 发表于 2024-9-26 08:56
延时一点时间后再开中断,不知道行不行
只有电源特别孱弱的时候才需要考虑这个,只要初始化外设的流程比较严谨,都不会出现这样那样的问题,另外,串口通信一般不会用单字节去传输什么重要信息,都需要编帧传输的,虽然不是必须像MODBUS一样搞CRC校验,起码帧头帧尾之类的是肯定要做的,接收端只对完整的帧数据敏感,其它的都应该过滤掉,这样才是一个稳健的传输 xxkj2010 发表于 2024-9-26 08:56
延时一点时间后再开中断,不知道行不行
试过在进入while(1)前开中断,还是会收到数据。在初始化前加入delay(),大概1s,那么接收的数据也会延迟相应的时间。 古人来者_昌 发表于 2024-9-27 05:54
试过在进入while(1)前开中断,还是会收到数据。在初始化前加入delay(),大概1s,那么接收的数据也会延迟 ...
开中断前清一下中断标志:RI = 0;
页:
[1]