OpenEdv-开源电子网

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

关于数组接收请教!!!!!!!有个问题,实在是不懂了!!!

[复制链接]

17

主题

76

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-6-14
在线时间
30 小时
发表于 2016-11-3 19:31:50 | 显示全部楼层 |阅读模式
22金钱
串口3 接ZigBee,一共4个传感器数据发过来,输出格式开头是FF的9个元素的数组,但是我写的程序数据经常不对,比如臭氧,有时是7,有时经常是49,这个数传感器没输出过这么大的。第一部分:串口3接收部分
u8 Rx3Buffer[9]; // 3usart  缓存数组
u8 Count3;     //计数

#if  EN_USART3_RX   //如果使能
void USART3_IRQHandler()
{
        u8 Receive3;
        if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//是否产生中断
        {
                 USART_ClearITPendingBit(USART3,USART_IT_RXNE); //清中断
                 Receive3=USART_ReceiveData(USART3);      //接收
                 Rx3Buffer[Count3++] = Receive3;
                 if(Count3>8)Count3=0;    //清零
                }                       
}
#endif

主函数部分

extern u8 Rx3Buffer[9]; // 3usart
extern u8 Count3;

char  PM2_5[4];            
char  PM10[4];
char  HCHO[4];            
char  O3[4];
char  NO2[4];
char  CO[4];               //CO
char  SO2[4];


//***********ZIGBEE*******************************//

void getZigBee(void)
{
                if(Rx3Buffer[0]==0xff)     //0XFF
        {
                if(Rx3Buffer[1]==0x2a)
                {
                        O3[0] = Rx3Buffer[4]*256+Rx3Buffer[5];
                }
                if(Rx3Buffer[1]==0x2b)
                {
                        SO2[0] = Rx3Buffer[4]*256+Rx3Buffer[5];
                }
                if(Rx3Buffer[1]==0x2c)
                {
                        NO2[0] = Rx3Buffer[4]*256+Rx3Buffer[5];
                }
                if(Rx3Buffer[1]==0x04)
                {
                        COL[0] = Rx3Buffer[4]*256+Rx3Buffer[5];
                }
        }       
        Count3=0;        //从新计数
}


/***************************display***********************/
void display(void)
{
          printf("HCHO is %5.3f mg/m3\r\n",((float)HCHO[0])/1000);
                printf("pm25 is %d ug/m3\r\n",PM2_5[0]);
          printf("pm10 is %d ug/m3\r\n",PM10[0]);
                printf("03 is %d ppb\r\n",O3[0]);
                printf("co is %f  ppb\r\n",COL[0]);
        //        printf("so2 is %d ppb\r\n",SO2[0]);
                printf("no2 is %f ug\r\n",(NO2[0]*2.054));
//  printf("SO2 is %f ug/m3\r\n",((float)SO2[0])*2.854);
}


最佳答案

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

出现这个现象说明你的接收那里串位了。接收的时候判断下接收的内容比如包头,如果不对,就要放弃掉重新接收,直到收到正确的数据。 比如你单个传感器发过来的9个字节,第一个0XFF,第二个是0X2A,第三个。。第九个是DATA。那么你必须要判断第一个和第二个,这样才能保证后面的数据是对的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

290

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1130
金钱
1130
注册时间
2015-8-4
在线时间
107 小时
发表于 2016-11-3 19:31:51 | 显示全部楼层
出现这个现象说明你的接收那里串位了。接收的时候判断下接收的内容比如包头,如果不对,就要放弃掉重新接收,直到收到正确的数据。
比如你单个传感器发过来的9个字节,第一个0XFF,第二个是0X2A,第三个。。第九个是DATA。那么你必须要判断第一个和第二个,这样才能保证后面的数据是对的。
活到老,学到老。
回复

使用道具 举报

17

主题

76

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-6-14
在线时间
30 小时
 楼主| 发表于 2016-11-3 19:32:10 | 显示全部楼层
请大家指点一下
回复

使用道具 举报

17

主题

76

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-6-14
在线时间
30 小时
 楼主| 发表于 2016-11-3 20:35:02 | 显示全部楼层
跪谢了55555
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11537
金钱
11537
注册时间
2014-4-1
在线时间
1314 小时
发表于 2016-11-3 20:47:08 | 显示全部楼层

有时是7,有时经常是49,   这情况是哪里看到的?
目测你是打印显示出来的,。

分析下物理过程:   收到数据  -> 保存  -> 处理  ->打印显示
后面三个过程有一步出错,你的结论就是错的。

所以,要先抛开后面三个过程,直接在接收数据那里观察。

回复

使用道具 举报

17

主题

76

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-6-14
在线时间
30 小时
 楼主| 发表于 2016-11-3 21:05:16 来自手机 | 显示全部楼层
xuande 发表于 2016-11-3 20:47
有时是7,有时经常是49,   这情况是哪里看到的?
目测你是打印显示出来的,。


是,下边的那个display函数打印,在电脑上看的,感觉没错呀
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11537
金钱
11537
注册时间
2014-4-1
在线时间
1314 小时
发表于 2016-11-3 21:31:28 | 显示全部楼层
1066570234 发表于 2016-11-3 21:05
是,下边的那个display函数打印,在电脑上看的,感觉没错呀


不想打击你的感觉。


回复

使用道具 举报

17

主题

76

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-6-14
在线时间
30 小时
 楼主| 发表于 2016-11-3 22:05:11 来自手机 | 显示全部楼层
xuande 发表于 2016-11-3 21:31
不想打击你的感觉。

我是真不会了,求教
回复

使用道具 举报

17

主题

76

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-6-14
在线时间
30 小时
 楼主| 发表于 2016-11-3 22:20:37 来自手机 | 显示全部楼层
谁能帮助我一下啊,解决了发红包
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-11-3 22:30:07 | 显示全部楼层
接收数据不处理,直接打印出来外面计算看看对不对,多简单,一步步排除,不过一看你的代码就是复制粘贴改的,感觉你自己都是一知半解
回复

使用道具 举报

17

主题

76

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-6-14
在线时间
30 小时
 楼主| 发表于 2016-11-3 22:50:39 来自手机 | 显示全部楼层
憨厚诚实大叔 发表于 2016-11-3 22:30
接收数据不处理,直接打印出来外面计算看看对不对,多简单,一步步排除,不过一看你的代码就是复制粘贴改的 ...

自己写的啊
回复

使用道具 举报

17

主题

76

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-6-14
在线时间
30 小时
 楼主| 发表于 2016-11-3 23:29:06 来自手机 | 显示全部楼层
一共四个传感器,每个传感器每隔一秒往外发数据。发送出来的数据一共占了9个数组元素。这样stm32总结点接收那4
回复

使用道具 举报

17

主题

76

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-6-14
在线时间
30 小时
 楼主| 发表于 2016-11-3 23:29:32 来自手机 | 显示全部楼层
1066570234 发表于 2016-11-3 23:29
一共四个传感器,每个传感器每隔一秒往外发数据。发送出来的数据一共占了9个数组元素。这样stm32总结点接收 ...

接收那4组数据。
回复

使用道具 举报

58

主题

359

帖子

0

精华

高级会员

Rank: 4

积分
987
金钱
987
注册时间
2014-9-29
在线时间
261 小时
发表于 2016-11-4 08:25:17 | 显示全部楼层
数据包不加校验也不计时的?只计数接收不出错就不正常了
回复

使用道具 举报

17

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2013-12-14
在线时间
567 小时
发表于 2016-11-4 09:28:12 | 显示全部楼层
4楼说的对,直接看一下接收到的数据,是什么,如果还不正常,就说明有干扰了。
半导体->模拟电路->数字电路->单片机->汇编->C->操作系统->java
回复

使用道具 举报

16

主题

197

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2012-4-20
在线时间
91 小时
发表于 2016-11-4 09:37:32 | 显示全部楼层
我也是一知半解冒昧作答:

我看您 O3[0] = Rx3Buffer[4]*256+Rx3Buffer[5];但是又声明了char  O3[4];感觉单就这点就有问题啊?前面赋值明摆着可能超出char的范围。
回复

使用道具 举报

17

主题

76

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-6-14
在线时间
30 小时
 楼主| 发表于 2016-11-4 09:47:17 来自手机 | 显示全部楼层
ba5rw 发表于 2016-11-4 09:37
我也是一知半解冒昧作答:

我看您 O3[0] = Rx3Buffer[4]*256+Rx3Buffer[5];但是又声明了char  O3[4];感 ...

那个是因为o3的rx3buffer4是零,只有buffer5有数据,定义成char型是因为上传云平台用的strcopy,函数
回复

使用道具 举报

16

主题

197

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2012-4-20
在线时间
91 小时
发表于 2016-11-4 09:49:39 | 显示全部楼层
1066570234 发表于 2016-11-4 09:47
那个是因为o3的rx3buffer4是零,只有buffer5有数据,定义成char型是因为上传云平台用的strcopy,函数

既然buffer4是0,为何要加这一位?不是多此一举吗?
回复

使用道具 举报

17

主题

76

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-6-14
在线时间
30 小时
 楼主| 发表于 2016-11-4 09:53:14 来自手机 | 显示全部楼层
kingnike 发表于 2016-11-4 09:28
出现这个现象说明你的接收那里串位了。接收的时候判断下接收的内容比如包头,如果不对,就要放弃掉重新接收 ...

是的,我在想有时候不对是串位了,因为有的时候对有的时候不对,传感器有4个点,每个都不断往总节点发数据,默认的间隔是一秒。数据发送的频率会非常大。第一位是包头,ff,第二位是气体类型,2c是代表no2,2a是so2等,第三位就是单位类型,第四位是有无小数点,第五第六高低位,第七第八检验位
回复

使用道具 举报

17

主题

76

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-6-14
在线时间
30 小时
 楼主| 发表于 2016-11-4 09:57:12 来自手机 | 显示全部楼层
ba5rw 发表于 2016-11-4 09:49
既然buffer4是0,为何要加这一位?不是多此一举吗?

是,统一这么写的。确实没用
回复

使用道具 举报

16

主题

197

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2012-4-20
在线时间
91 小时
发表于 2016-11-4 10:02:23 | 显示全部楼层
按我的理解,你那串口数据的格式第一个byte起始位准备发送传感器数据的代码FF,接着第二个byte是传感器的型号,一共四种,接收一个轮回后清计数器 Count3。但是问题来了,这计数器怎么对应你的数组序列?
你的9个元素格式是怎么设置的?因为这涉及到后面保证rx3buffer5是装对应传感器数值的啊。
回复

使用道具 举报

16

主题

197

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2012-4-20
在线时间
91 小时
发表于 2016-11-4 10:06:07 | 显示全部楼层
1066570234 发表于 2016-11-4 09:53
是的,我在想有时候不对是串位了,因为有的时候对有的时候不对,传感器有4个点,每个都不断往总节点发数 ...

一秒·一个传感器发送怎么会串位啊?
回复

使用道具 举报

17

主题

76

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-6-14
在线时间
30 小时
 楼主| 发表于 2016-11-4 10:14:57 来自手机 | 显示全部楼层
ba5rw 发表于 2016-11-4 10:02
按我的理解,你那串口数据的格式第一个byte起始位准备发送传感器数据的代码FF,接着第二个byte是传感器的型 ...

就是定义了9个元素大小的数组,中断来了先存储起来又判断的第一位是不是ff,然后看第二位是哪个气体。
回复

使用道具 举报

17

主题

76

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-6-14
在线时间
30 小时
 楼主| 发表于 2016-11-4 10:18:05 来自手机 | 显示全部楼层
ba5rw 发表于 2016-11-4 10:06
一秒·一个传感器发送怎么会串位啊?

这个程序写法肯定是有问题的
回复

使用道具 举报

16

主题

197

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2012-4-20
在线时间
91 小时
发表于 2016-11-4 10:23:50 | 显示全部楼层
本帖最后由 ba5rw 于 2016-11-4 10:26 编辑

我刚好也在做一个串口应答的实验项目,我的写法非常简单,给传感器发送一个串口指令,它就返回一串数据,跟你一样,数据中第几位是传感器数值,没有出现什么问题。建议如果能做成应答格式是最可靠的。
而你这个是一秒钟一次轮回发送的话理论上是没有什么问题的,我的是毫秒级的轮询都没问题的。所以建议还是推演一下你的串口和缓冲数组之间关系是否在存在错位什么的。
而且你气体数组完全没有必要啊,建议还是先从简单开始调试,能不用数组就不用。
回复

使用道具 举报

17

主题

76

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-6-14
在线时间
30 小时
 楼主| 发表于 2016-11-4 10:37:37 来自手机 | 显示全部楼层
ba5rw 发表于 2016-11-4 10:23
我刚好也在做一个串口应答的实验项目,我的写法非常简单,给传感器发送一个串口指令,它就返回一串数据,跟 ...

嗯,气体那我不用数组试试。能留个扣扣啥的吗?我请教下您
回复

使用道具 举报

16

主题

197

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2012-4-20
在线时间
91 小时
发表于 2016-11-4 10:46:13 | 显示全部楼层
1066570234 发表于 2016-11-4 10:37
嗯,气体那我不用数组试试。能留个扣扣啥的吗?我请教下您

我不聊QQ,免得没有及时回复得罪人。我也是初学者,共勉!

另外建议你使用简单的排查方法查错会更好。首先从串口通信开始查看单次接收的数据对不对,然后再逐个通信看看出错的情况,有些问题非常低级错误,但是高手都不一定能一眼看穿的,哈!
回复

使用道具 举报

17

主题

76

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-6-14
在线时间
30 小时
 楼主| 发表于 2016-11-4 10:53:16 来自手机 | 显示全部楼层
ba5rw 发表于 2016-11-4 10:46
我不聊QQ,免得没有及时回复得罪人。我也是初学者,共勉!

另外建议你使用简单的排查方法查错会更好。 ...

奥奥,你的接收也是这样写的吗?还是先判断头啥的再接收的
回复

使用道具 举报

16

主题

197

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2012-4-20
在线时间
91 小时
发表于 2016-11-4 11:06:10 | 显示全部楼层
本帖最后由 ba5rw 于 2016-11-4 11:13 编辑
1066570234 发表于 2016-11-4 10:53
奥奥,你的接收也是这样写的吗?还是先判断头啥的再接收的

我是应答的,所以压根就不需要判断包头的。
然后我的不需要  if(Count3>8)Count3=0;    //清零,我是在声明处Count3=0;
每次进入中断Count直接是清0的


还有清中断最好放在最后一行
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 21:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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