文件系统保存串口接收的数据出现极个别的错误

2019-07-20 05:24发布

本帖最后由 伦理君 于 2018-10-22 18:49 编辑

大佬们,求助一个问题。
本人在探索者F4提供的例程——实验39 FATFS实验上进行了修改,读取串口的数据,再保存在CSV中。
但是在运行的时候出现了个问题,在串口传输的数据量低的时候,保存的数据会出现极个别的错误,大概几千组数据错误一个;在串口传输的数据量较大的时候,会出现近乎周期性的错误,11个数据错误一个。另一块板子发出的串口的数据是正确的。
数据量较大的时候——36Kb/s
数据量较小的时候——3.6Kb/s
这是为什么呀?


下面是我更改的地方
void USART1_IRQHandler(void)                        //串口1中断服务程序
{
        u16 Res=0;
#if SYSTEM_SUPPORT_OS                 //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
        OSIntEnter();   
#endif
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
                {
                Res =USART_ReceiveData(USART1);        //读取接收到的数据
               
                if((USART_RX_STA&0x8000)==0)//接收未完成
                        {
                        if(USART_RX_STA&0x4000)//接收到了0x0d
                                {
                                if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
                                else
                {
                    USART_RX_STA|=0x8000;
                }//接收完成了
                                }
                        else //还没收到0X0D
                                {        
                    if(Res==0x0d)
                    {
                        USART_RX_STA|=0x4000;
                        LED1=~LED1;
                    }
                    else
                    {
                        if((USART_RX_STA%2)==0)
                        {
                            aRx_Buffer[USART_RX_STA/2]&=0x00FF;
                            aRx_Buffer[USART_RX_STA/2]|=(Res&0x00FF)<<8;
                        }
                        if((USART_RX_STA%2)==1)
                        {
                            aRx_Buffer[USART_RX_STA/2]&=0xFF00;
                            aRx_Buffer[USART_RX_STA/2]|=Res&0x00FF;
                        }
                        USART_RX_STA++;
                        if(USART_RX_STA>(USART_REC_LEN-1)) USART_RX_STA=0;//接收数据错误,重新开始接收         
                    }                 
                                }
                        }                    
     }
#if SYSTEM_SUPPORT_OS         //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
        OSIntExit();                                                                                          
#endif
}




主函数的while循环

while(1)
    {
        if (f_mount(fs[0],"", 1) ==FR_OK)
        {
            if(f_open (&fil,"TempLog.csv", FA_OPEN_ALWAYS | FA_READ | FA_WRITE) ==FR_OK)
            {
                result = f_size(&fil);
                res = f_lseek(&fil,result);
                while(KEY0_FLAG)     //开启保存
                {
                    if(USART_RX_STA&0x8000)  //串口接收完成判断
                    {
                        for(i=0;i<17;i++)
                        {
                            res= f_printf(&fil, "%d",aRx_Buffer ); //写入一个数据
                            res= f_write(&fil, &dh,1, (void *)&br);//写入逗号
//                            printf("%d ",aRx_Buffer);
                        }
                        res= f_write(&fil, &hh,1, (void *)&br);//写入换行
                        USART_RX_STA=0;//串口接收标志置0
                        LED0 =!LED0;
                     }
                }
            }
            f_close(&fil);
        }
        f_mount(fs[0], "",1);
    }





数据


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。