发表于《解码高速GPS》
11个月19天前IP:广东
947675
12楼

尽量不要用delay。。。这不是RTOS

想要好的实时性,所有时基都应该由中断实现

这种东西要用状态机写的,你也没有判断是否存在数据,也没有做校验,都是不可靠的,有一个获取缓冲区有多少byte的函数

然后取一个数据,调用状态机去处理,类似下面我写的寄代码


          while (Serial.available() > 0)  //循环串口是否有数据
          {

void Data_chuli(uint8_t readbit){
  static uint16_t data_len=0,data_readlen=0,data_crc=0;
    switch(uart_ztj){
      case 0:
        if(readbit==0xBE){
          read_data[0]=readbit;
          uart_ztj=1;
        }
        break;
      case 1:
        if(readbit==0xAA){
          read_data[1]=readbit;
          uart_ztj=2;
        }else{
          uart_ztj=0;
        }
        break;
      case 2:
        data_len=readbit;
        read_data[2]=readbit;
        uart_ztj=3;
        break;
      case 3:
        data_len+=readbit<<8;
        read_data[3]=readbit;
        if(data_len<=DATA_BUF+1){
          uart_ztj=4;
        }else{
          uart_ztj=0;
        }
        break;
      case 4:
        data_status=readbit;
        read_data[4]=readbit;
        if(data_len==1){
          uart_ztj=6;
        }else{
          uart_ztj=5;
        }
        data_readlen=1;
        break;
      case 5:
        read_data[data_readlen+4]=readbit;
        data_readlen++;
        if(data_readlen>=data_len){
          uart_ztj=6;
        }
        break;
      case 6:
        data_crc=readbit;
        uart_ztj=7;
        break;
      case 7:
        data_crc+=readbit<<8;
        uart_ztj=8;
        break;
      case 8:
        if(readbit==0xEB){
          uart_ztj=9;
        }else{
          uart_ztj=0;
        }
        break;
      case 9:
        if(readbit==0xAA){
          uart_ztj=0;
          if(CRC16_XMODEN(read_data,data_len+4)==data_crc){//成功接收
            read_en=0;
          }
        }else{
          uart_ztj=0;
        }
        break;
    }
}



评论
文号 / 947675

十步芳草
名片发私信
学术分 0
总主题 9 帖总回复 175 楼拥有证书:进士 机友 笔友
注册于 2017/07/17 16:44:21最后登录 2026/10/30 16:38:41
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:0

个人简介

喜欢研究电子

笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的