OpenEdv-开源电子网

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

串口中断接收16进制数据错位,请各位大神帮忙分析下

[复制链接]

2

主题

4

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-6-8
在线时间
4 小时
发表于 2020-3-14 16:28:21 | 显示全部楼层 |阅读模式
2金钱
现有一个甲醛传感器,通过STM32F103串口中断读取数据,向传感器发送气体查询指令,则传感器立即返回相应数据,但在数据读取过程中时常出现数据顺序错乱,导致无法进行甲醛值计算,正常与异常读值状态如下
正常读取的数据
send hcho_voc inquire command:11 1 1 ed    //气体查询指令
HCHO:216.53
VOC:0.00
--->>value16:16 d 1 0 1d 0 0 fe a4 0 0 0 0 0 0 1d    //正常的数据回传格式,标头固定位16 d 1
send hcho_voc inquire command:11 1 1 ed
HCHO:567.47
VOC:0.00
--->>value16:16 d 1 0 4c 0 0 fe a4 0 0 0 0 0 0 ee    //正常的数据回传格式,标头固定位16 d 1


异常读取的数据1
send hcho_voc inquire command:11 1 1 ed
HCHO:0.00
VOC:0.00
--->>value16:0 0 0 0 60 16 d 1 0 0 0 0 2 7a 0 0     //异常的数据回传格式
send hcho_voc inquire command:11 1 1 ed
HCHO:0.00
VOC:0.00
--->>value16:0 0 0 0 60 16 d 1 0 0 0 0 2 7a 0 0


异常读取的数据2
send hcho_voc inquire command:11 1 1 ed
HCHO:0.00
VOC:0.00
--->>value16:0 0 0 2 7a 0 0 0 0 0 0 60 16 d 1 0
send hcho_voc inquire command:11 1 1 ed
HCHO:0.00
VOC:0.00
--->>value16:0 0 0 2 7a 0 0 0 0 0 0 60 16 d 1 0


串口中断处理函数如下
void UART5_IRQHandler(void)
{
        int total;
        while(USART_GetITStatus(UART5,USART_IT_RXNE)!=RESET)
        {               
                USART_ClearFlag(UART5,USART_FLAG_RXNE);
                user_input_hv[tvoc_len] = USART_ReceiveData(UART5);
                tvoc_len++;
        }       
        if(tvoc_len>15)
        {
                        tvoc_len=0;
                        tvoc_open=1;
  }
        if((tvoc_open==1)&&(user_input_hv[0]==0x16)&&(user_input_hv[1]==0x0D))
        {
            tvoc_open=0;
                        total=user_input_hv[0]+user_input_hv[1]\
                        +user_input_hv[2]+user_input_hv[3]\
                        +user_input_hv[4]+user_input_hv[5]\
                        +user_input_hv[6]+user_input_hv[7]\
                        +user_input_hv[8]+user_input_hv[9]\
                        +user_input_hv[10]+user_input_hv[11]\
                        +user_input_hv[12]+user_input_hv[13]\
                        +user_input_hv[14];
//                        printf("temp:%d\r\n",total);
                        total=total&0x00ff;
//                        printf("tempx:%d\r\n",total);
      if(user_input_hv[15]==(256-total))
                        {
                                hcho=(float)(user_input_hv[3]*256+user_input_hv[4])/100;
                                hcho=hcho*(22.4/30)*1000;//ppb
                                voc=(float)(user_input_hv[5]*256+user_input_hv[6])/100;
                                temprature=(user_input_hv[7]*256+user_input_hv[8])/10;
                                relative_temp=(user_input_hv[9]*256+user_input_hv[10])/10;
                        }
        }
}


main()函数中打印处理如下

/******************************************/       
while(1)       
{
                USART_Cmd(UART5, ENABLE);
                USART_ITConfig(UART5, USART_IT_RXNE, ENABLE);
                Send_Hcoc_Voc_Inquire();//查询气体参数指令
                delay_ms(300);
                USART_ITConfig(UART5, USART_IT_RXNE,DISABLE);
                USART_Cmd(UART5, DISABLE);
                HCHO=Read_Hcho();
                VOC=Read_Voc();
                printf("HCHO:%.2f\r\n",HCHO);
                printf("VOC:%.2f\r\n",VOC);
/************/
                printf("--->>value16:");
                for(bx=0;bx<16;bx++)printf("%0x ",user_input_hv[bx]);
                printf("\r\n");

}




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

使用道具 举报

0

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
267
金钱
267
注册时间
2018-7-6
在线时间
133 小时
发表于 2020-3-14 17:59:47 | 显示全部楼层
做个异常处理就行了,串口检测到数据是16 继续检测后两个数据分别为0d 01,则认为本包数据正确,继续接受其他数据,否则丢弃
回复

使用道具 举报

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2020-1-18
在线时间
28 小时
发表于 2020-3-15 08:58:12 | 显示全部楼层
检查一下,串口还发没发其它的
回复

使用道具 举报

2

主题

4

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-6-8
在线时间
4 小时
 楼主| 发表于 2020-3-17 09:23:23 | 显示全部楼层
专注嵌入式 发表于 2020-3-14 17:59
做个异常处理就行了,串口检测到数据是16 继续检测后两个数据分别为0d 01,则认为本包数据正确,继续接受其 ...

试过这种方法,一旦出现数据错位,就会一直错下去,只能一直丢弃
回复

使用道具 举报

2

主题

4

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-6-8
在线时间
4 小时
 楼主| 发表于 2020-3-17 09:29:01 | 显示全部楼层
later 发表于 2020-3-15 08:58
检查一下,串口还发没发其它的

没有,现在是问答式的方式进行数据读取,不发查询指令,不会返回任何数据
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2020-3-17 21:07:45 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-22 18:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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