OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5481|回复: 2

10HZ,每条数据7000字节的串口数据如何用stm32F7接收并存SD卡

[复制链接]

8

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2020-7-15
在线时间
47 小时
发表于 2021-9-15 20:38:14 | 显示全部楼层 |阅读模式
10金钱
采用的STM32F7,使用UCOS,设了两个任务,一个任务接收串口数据,然后存FIFO,第二个任务从FIFO中取数据并存SD卡,两个任务优先级一样,这样的结果是,程序一直在第一个串口接收的任务中执行,第二个任务的能执行的时间特别少。
下面是两个任务的代码
void gnssreceive_task(void *p_arg){
      u8 num=0;
    u16 i=0;
      CPU_SR_ALLOC();
      u8 res_gnss_nmea,res_gnss_oem,res_ub482_oem;
      u16 rxlen;
        OS_ERR err;
      u8 receive[8000];
      UB482Buffer ub482write;

    while (1)
  {
        if((USART1_RX_STA&0X8000))        //接收到一次数据了
        {
            OS_CRITICAL_ENTER();
            rxlen=USART1_RX_STA&0X7FFF;    //得到数据长度
            for(i=0;i<rxlen;i++) ub482write.RANGEA=USART1_RX_BUF;      
             USART1_RX_STA=0;               //启动下一次接收
            ub482write.RANGEA=0;            //自动添加结束符
            //printf("%s",ub482write.RANGEA);
            OS_CRITICAL_ENTER();
            res_ub482_oem = Write_RingBuff_UB482_OEM(ub482write);
            OS_CRITICAL_EXIT();
            printf("%d",ringBuffub482oem.Lenght);
            if(res_gnss_oem == 0)
                 printf("write ub482 range  data ok******************************\n\r");
            memset(ub482write.RANGEA,0,8000);
            
    }
        OSSchedRoundRobinYield(&err);
    }
}





void gnsssave_task(void *p_arg){
    printf("save start ----------------------\n\r");
    u8 fru,fr1u,fr2u,fr3u;//存ub482-的文件相关返回值
  OS_ERR err;
    CPU_SR_ALLOC();
    fru = f_open(fgnssoem,(const TCHAR*)"0:/GNSS_OEM_UB482.dat",FA_READ|FA_WRITE);//先不加创建选项
          if(fru == FR_NO_FILE)                                            //当返回无文件时,再进行创建文件
                f_open(fgnssoem,(const TCHAR*)"0:/GNSS_OEM_UB482.dat",FA_READ|FA_WRITE|FA_CREATE_NEW);
    while(1){
     if(ringBuffub482oem.Lenght>=1){
         printf("save ----------------------\n\r");
         OS_CRITICAL_ENTER();
      fr1u = f_lseek(fgnssoem, f_size(fgnssoem));
      fr2u = f_write(fgnssoem,&(ringBuffub482oem.Ring_Buff_UB482_Oem[ringBuffub482oem.Head]),strlen(ringBuffub482oem.Ring_Buff_UB482_Oem[ringBuffub482oem.Head].RANGEA),&bw);
        ringBuffub482oem.Head = (ringBuffub482oem.Head+1)%RINGBUFF_LEN;//防止越界非法访问
    ringBuffub482oem.Lenght--;
        fr3u = f_sync(fgnssoem);
         OS_CRITICAL_EXIT();
        if(fr1u==0&&fr2u==0&&fr3u==0){
           printf("save gnss ub482 oem data ok&&&&&&&&&&&&&&&&&&&&&%d-%d-%d\n\r",fr1u,fr2u,fr3u);
           LED0_Toggle;
             }
        else{
             printf("gnss data ub482 save error!!!!!!!!!!!!!--%d-%d-%d\n\r",fr1u,fr2u,fr3u);   
           }
     }
     OSSchedRoundRobinYield(&err);
}
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2020-7-15
在线时间
47 小时
 楼主| 发表于 2021-9-15 20:43:09 | 显示全部楼层
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2021-9-16 02:14:52 | 显示全部楼层
说明你串口数据太快了,用DMA接收试试
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 22:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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