OpenEdv-开源电子网

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

串口解析指令

[复制链接]

17

主题

76

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-6-14
在线时间
30 小时
发表于 2016-7-22 12:20:14 | 显示全部楼层 |阅读模式
8金钱
感觉对了啊,得出的结果是0.
        if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)//êÇ·ñ2úéúÖD¶Ï
        {       
               
                 USART_ClearITPendingBit(UART4,USART_IT_RXNE); //Çå3yÖD¶Ï±êÖ¾
                 temp=USART_ReceiveData(UART4);      //½óêÕêy¾Y
                 Rx4Buffer[RxCount++] = temp;
                 if ( (Rx4Buffer[0]==0x42)&&(Rx4Buffer[1]==0x4D) )
                        {  
                                 PM1_0 = (Rx4Buffer[4]<<8)+(Rx4Buffer[5]);
                                 PM2_5 = (Rx4Buffer[6]<<8)+(Rx4Buffer[7]);
                                 PM10 = (Rx4Buffer[14]<<8)+(Rx4Buffer[15]);
                       
                                 um0_3Count = (Rx4Buffer[16]<<8)+(Rx4Buffer[17]);
                                 um0_5Count = (Rx4Buffer[18]<<8)+(Rx4Buffer[19]);
                                 um1_0Count = (Rx4Buffer[20]<<8)+(Rx4Buffer[21]);
                                 um2_5Count = (Rx4Buffer[22]<<8)+(Rx4Buffer[23]);
                                 um5_0Count = (Rx4Buffer[24]<<8)+(Rx4Buffer[25]);
                                 um10Count  = (Rx4Buffer[26]<<8)+(Rx4Buffer[27]);
                        }
                else  {RxCount = 0;}
                if(RxCount > 31)
                 {         
                                 RxCount = 0;
           }       

pm.jpg

最佳答案

查看完整内容[请看2#楼]

传感器输出是0,哪里解析错了?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

76

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-6-14
在线时间
30 小时
 楼主| 发表于 2016-7-22 12:20:15 | 显示全部楼层
传感器输出是0,哪里解析错了?
回复

使用道具 举报

15

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1276
金钱
1276
注册时间
2016-5-31
在线时间
499 小时
发表于 2016-7-22 12:43:09 | 显示全部楼层
接收一个字节,RxCount++;

刚开始:RxCount=0;

假设接收正确: Rx4Buffer[0]=0x42;
然后RxCount++; 接下来就开始你的条件判断:

if ( (Rx4Buffer[0]==0x42)&&(Rx4Buffer[1]==0x4D) )

由于这时Rx4Buffer[1]的数据,应该是0,假设你初始化的时候,清零的话。

这个条件,永远也不会成立!!!!!

所以程序就一直跳转到   else  {RxCount = 0;} 这条语句执行。

所以永远也到不了你的:解析指令的 代码部分!!!!


回复

使用道具 举报

15

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1276
金钱
1276
注册时间
2016-5-31
在线时间
499 小时
发表于 2016-7-22 12:47:34 | 显示全部楼层
你把 else  {RxCount = 0;} 这条语句,删掉就可以了。
回复

使用道具 举报

17

主题

76

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-6-14
在线时间
30 小时
 楼主| 发表于 2016-7-22 12:57:55 | 显示全部楼层
xfcjava3 发表于 2016-7-22 12:47
你把 else  {RxCount = 0;} 这条语句,删掉就可以了。

是的,把这个删了就好了
回复

使用道具 举报

17

主题

76

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-6-14
在线时间
30 小时
 楼主| 发表于 2016-7-22 12:59:26 | 显示全部楼层
xfcjava3 发表于 2016-7-22 12:43
接收一个字节,RxCount++;

刚开始:RxCount=0;

初始化时候RxCount = 0,为什么Rx4Buffer【1】是0?
回复

使用道具 举报

15

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1276
金钱
1276
注册时间
2016-5-31
在线时间
499 小时
发表于 2016-7-22 13:07:44 | 显示全部楼层
你申请的是Rx4Buffer[ ],是数组,编译器编译的时候,默认的是初始化数组的值为0
回复

使用道具 举报

17

主题

76

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-6-14
在线时间
30 小时
 楼主| 发表于 2016-7-22 13:08:01 | 显示全部楼层
1066570234 发表于 2016-7-22 12:57
是的,把这个删了就好了

我这样写为什么还是0啊
#if  EN_UART4_RX   
void UART4_IRQHandler(void)
{
u8 RxCount = 0;
u8 state = 0;
       
        if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)//ê&#199;·&#241;2úéú&#214;D&#182;&#207;
        {       
               
                 USART_ClearITPendingBit(UART4,USART_IT_RXNE); //&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;
                 temp=USART_ReceiveData(UART4);      //&#189;óê&#213;êy&#190;Y
                 if(temp == 0x42) {state = 1;}
                 if(temp == 0x4D&&state ==1){state = 2;RxCount = 0;}
                 Rx4Buffer[RxCount] = temp;
                 RxCount++;
                 if(RxCount == 32)
                         {    PM1_0 = (Rx4Buffer[10]<<8)+(Rx4Buffer[11]);  //1.0
                                                PM2_5 = (Rx4Buffer[12]<<8)+(Rx4Buffer[13]);  //2.5
                                                PM10 = (Rx4Buffer[14]<<8)+(Rx4Buffer[15]);   //10
                       
                                                um0_3Count = (Rx4Buffer[16]<<8)+(Rx4Buffer[17]); //
                                                um0_5Count = (Rx4Buffer[18]<<8)+(Rx4Buffer[19]);
                                                um1_0Count = (Rx4Buffer[20]<<8)+(Rx4Buffer[21]);
                                                um2_5Count = (Rx4Buffer[22]<<8)+(Rx4Buffer[23]);
                                                um5_0Count = (Rx4Buffer[24]<<8)+(Rx4Buffer[25]);
                                          um10Count  = (Rx4Buffer[26]<<8)+(Rx4Buffer[27]);
                                 
                         }
回复

使用道具 举报

15

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1276
金钱
1276
注册时间
2016-5-31
在线时间
499 小时
发表于 2016-7-22 13:08:39 | 显示全部楼层
都给你解决了不是吗!
回复

使用道具 举报

17

主题

76

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-6-14
在线时间
30 小时
 楼主| 发表于 2016-7-22 13:09:52 | 显示全部楼层
xfcjava3 发表于 2016-7-22 13:07
你申请的是Rx4Buffer[ ],是数组,编译器编译的时候,默认的是初始化数组的值为0

是不是因为是数组,接收时候一个一个的填充,++后还没有值给下一个元素赋值,所以是0
回复

使用道具 举报

17

主题

76

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-6-14
在线时间
30 小时
 楼主| 发表于 2016-7-22 13:10:55 | 显示全部楼层
xfcjava3 发表于 2016-7-22 13:08
都给你解决了不是吗!

您看一下,我重新写了的。谢谢您了
回复

使用道具 举报

15

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1276
金钱
1276
注册时间
2016-5-31
在线时间
499 小时
发表于 2016-7-22 13:13:28 | 显示全部楼层
你用  刚开始发的程序,把 else  {RxCount = 0;} 这条语句,删掉就可以了。

其他的程序语句,不用改动!
回复

使用道具 举报

17

主题

76

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-6-14
在线时间
30 小时
 楼主| 发表于 2016-7-22 13:14:51 | 显示全部楼层
xfcjava3 发表于 2016-7-22 13:13
你用  刚开始发的程序,把 else  {RxCount = 0;} 这条语句,删掉就可以了。

其他的程序语句,不用改动!

恩恩,刚开始那个感觉不太好,都是先判断再存储的。但是我先判断后存储了输出是0了,
回复

使用道具 举报

15

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1276
金钱
1276
注册时间
2016-5-31
在线时间
499 小时
发表于 2016-7-22 13:16:12 | 显示全部楼层
你新改动的程序,

u8 RxCount = 0;
u8 state = 0;  这2个变量定义:

应该改写成:
  static  u8 RxCount = 0;   
   static  u8 state = 0;  
就可以了
回复

使用道具 举报

15

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1276
金钱
1276
注册时间
2016-5-31
在线时间
499 小时
发表于 2016-7-22 13:17:58 | 显示全部楼层
你回去好好复习一下吧,C语言中有关个变量的部分!!!
回复

使用道具 举报

15

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1276
金钱
1276
注册时间
2016-5-31
在线时间
499 小时
发表于 2016-7-22 13:19:14 | 显示全部楼层
静态变量,临时变量 的区别!!!
回复

使用道具 举报

15

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1276
金钱
1276
注册时间
2016-5-31
在线时间
499 小时
发表于 2016-7-22 13:22:49 | 显示全部楼层
你应该修改一下你的标题了吧,问题不是已经解决了吧,就不要再显示“未解决”!
回复

使用道具 举报

17

主题

76

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-6-14
在线时间
30 小时
 楼主| 发表于 2016-7-22 13:29:55 | 显示全部楼层
xfcjava3 发表于 2016-7-22 13:22
你应该修改一下你的标题了吧,问题不是已经解决了吧,就不要再显示“未解决”!

恩恩,马上改,刚看看程序,输出还是0,改成静态变量了
回复

使用道具 举报

15

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1276
金钱
1276
注册时间
2016-5-31
在线时间
499 小时
发表于 2016-7-22 13:39:03 | 显示全部楼层
你这儿又错了:
if(temp == 0x4D&&state ==1){state = 2;RxCount = 0;}
回复

使用道具 举报

15

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1276
金钱
1276
注册时间
2016-5-31
在线时间
499 小时
发表于 2016-7-22 13:39:51 | 显示全部楼层
你这儿又错了:
if(temp == 0x4D&&state ==1){state = 2;RxCount = 0;}

RxCount又清零了!!!
回复

使用道具 举报

15

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1276
金钱
1276
注册时间
2016-5-31
在线时间
499 小时
发表于 2016-7-22 13:41:12 | 显示全部楼层
还是最开始的那个程序,比较好,不乱;
你新修改的程序,很乱,效率很低。
回复

使用道具 举报

15

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1276
金钱
1276
注册时间
2016-5-31
在线时间
499 小时
发表于 2016-7-22 13:42:29 | 显示全部楼层
噢,看到了,你一开始发的那些程序,还有其他的问题
回复

使用道具 举报

17

主题

76

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-6-14
在线时间
30 小时
 楼主| 发表于 2016-7-22 13:44:32 | 显示全部楼层
xfcjava3 发表于 2016-7-22 13:42
噢,看到了,你一开始发的那些程序,还有其他的问题

我看串口都是一位位解析,刚开始那样不太好
回复

使用道具 举报

17

主题

76

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-6-14
在线时间
30 小时
 楼主| 发表于 2016-7-22 13:54:13 | 显示全部楼层
xfcjava3 发表于 2016-7-22 13:41
还是最开始的那个程序,比较好,不乱;
你新修改的程序,很乱,效率很低。

新改的还是不行啊求助
回复

使用道具 举报

17

主题

76

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-6-14
在线时间
30 小时
 楼主| 发表于 2016-7-22 14:51:53 | 显示全部楼层
xfcjava3 发表于 2016-7-22 13:42
噢,看到了,你一开始发的那些程序,还有其他的问题

一开始的有什么问题呢
回复

使用道具 举报

15

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1276
金钱
1276
注册时间
2016-5-31
在线时间
499 小时
发表于 2016-7-22 16:39:44 | 显示全部楼层
一开始你发的程序片段,有如下问题:
当正确接收到[0],[1]两个数据包头字节后,就开始解析命令,是不对的!!!
if ( (Rx4Buffer[0]==0x42)&&(Rx4Buffer[1]==0x4D) )
{

  .......
}

应该在接收完数据包后,看你的代码片段,应该是在【  if(RxCount > 31)   】
才可以开始解析数据包,所包含的命令数据。

我说的就是这个意思.
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 08:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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