OpenEdv-开源电子网

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

求大神帮帮忙 谢谢

[复制链接]

22

主题

271

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
405
金钱
405
注册时间
2019-3-21
在线时间
107 小时
发表于 2019-4-3 14:06:26 | 显示全部楼层 |阅读模式
10金钱
QQ截图20190403140318.png 这是我读到的CO2传感器数据,不过顺序不对,哪位大神可以指点一下,正确顺序应该是 42 4d 然后往下排,一共12个字节

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

使用道具 举报

22

主题

271

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
405
金钱
405
注册时间
2019-3-21
在线时间
107 小时
 楼主| 发表于 2019-4-3 14:08:52 | 显示全部楼层
void CO2_unpack(void)
{
  for (int i = 0; i < 12; i++)
  {
    if (CO2.data_buf[i] == 0x42 && CO2.data_buf[(i+1)%12] == 0x4D)
    {
      CO2.ppm = (uint8_t)CO2.data_buf[(i+4)%12]*256+CO2.data_buf[(i+5)%12];
    }
    co2_data_anl();
  }
}

这是部分代码 ,我已经判断数组一二号是不是42 4d了, 为什么输出顺序还是不对,已经搞了几天了,头疼,找不到问题
回复

使用道具 举报

9

主题

87

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1435
金钱
1435
注册时间
2015-5-19
在线时间
132 小时
发表于 2019-4-3 17:24:12 | 显示全部楼层
没看懂具体意思,哪里是读取的数据,上面就看到发送数据了,截图右边的数据如何得到的?
回复

使用道具 举报

13

主题

116

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
372
金钱
372
注册时间
2018-1-22
在线时间
118 小时
发表于 2019-4-3 21:00:48 | 显示全部楼层
42 4D 应该是攀藤的二氧化碳传感器吧,问题就出在你的串口接收中断没有加协议
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-4-3 22:00:05 | 显示全部楼层
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-4-3 22:58:14 | 显示全部楼层
本帖最后由 edmund1234 于 2019-4-3 22:59 编辑

CO2.ppm = (uint8_t)CO2.data_buf[(i+4)%12]*256+CO2.data_buf[(i+5)%12];
这不应该是uint8_t, 你的CO2.ppm是uint8_t?否则这里的类型应该是CO2.ppm的类型


if (CO2.data_buf == 0x42 && CO2.data_buf[(i+1)%12] == 0x4D)
    {
      CO2.ppm = (uint8_t)CO2.data_buf[(i+4)%12]*256+CO2.data_buf[(i+5)%12];
      co2_data_anl();
    }
//    co2_data_anl();
应该是这样吧

回复

使用道具 举报

22

主题

271

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
405
金钱
405
注册时间
2019-3-21
在线时间
107 小时
 楼主| 发表于 2019-4-4 08:28:35 | 显示全部楼层
胖子阳 发表于 2019-4-3 17:24
没看懂具体意思,哪里是读取的数据,上面就看到发送数据了,截图右边的数据如何得到的?

发的那个是指令,livewatch中是读到的CO2传感器的数据
回复

使用道具 举报

22

主题

271

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
405
金钱
405
注册时间
2019-3-21
在线时间
107 小时
 楼主| 发表于 2019-4-4 08:31:56 | 显示全部楼层
edmund1234 发表于 2019-4-3 22:58
CO2.ppm = (uint8_t)CO2.data_buf[(i+4)%12]*256+CO2.data_buf[(i+5)%12];
这不应该是uint8_t, 你的CO2.p ...

我定义的ppm是uint8_t类型的,这里是强制转换类型
回复

使用道具 举报

22

主题

271

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
405
金钱
405
注册时间
2019-3-21
在线时间
107 小时
 楼主| 发表于 2019-4-4 08:34:06 | 显示全部楼层
lvb 发表于 2019-4-3 21:00
42 4D 应该是攀藤的二氧化碳传感器吧,问题就出在你的串口接收中断没有加协议

对的,DS-CO2-20,

void CO2_unpack(void)
{
  for (int i = 0; i < 12; i++)
  {
    if (CO2.data_buf == 0x42 && CO2.data_buf[(i+1)%12] == 0x4D)
    {
      CO2.ppm = (uint8_t)CO2.data_buf[(i+4)%12]*256+CO2.data_buf[(i+5)%12];
    }
    co2_data_anl();
  }
}


这个就是协议啊,buf0 和1 是 42和4d  ,co2的数据是第五位*256加上第六位
回复

使用道具 举报

22

主题

271

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
405
金钱
405
注册时间
2019-3-21
在线时间
107 小时
 楼主| 发表于 2019-4-4 08:39:00 | 显示全部楼层
lvb 发表于 2019-4-3 21:00
42 4D 应该是攀藤的二氧化碳传感器吧,问题就出在你的串口接收中断没有加协议

CO2传感器中文说明书V2.1.pdf (899.08 KB, 下载次数: 3)
回复

使用道具 举报

17

主题

587

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4467
金钱
4467
注册时间
2013-6-27
在线时间
565 小时
发表于 2019-4-4 09:02:24 | 显示全部楼层
if(CO2.counter > 11)
   CO2.counter = 0;
这个写法有可能导致数据偏移,比如上电串口接收到几个乱码;

可用在串口中断接收判断42 4D两个连续字节
* 如果连续接收的是这两个固定就启动开始接收,否则清零接收状态;
* 接收完成标记接收完成,如果接收处理来不及还得拷贝接收的数据,保证还没来得及处理被二次接收覆盖
* 其他读取接收完成标志位解析数据
让我们的思维驾驭在电的速度之上!
回复

使用道具 举报

22

主题

271

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
405
金钱
405
注册时间
2019-3-21
在线时间
107 小时
 楼主| 发表于 2019-4-4 09:04:30 | 显示全部楼层
DongInker 发表于 2019-4-4 09:02
if(CO2.counter > 11)
   CO2.counter = 0;
这个写法有可能导致数据偏移,比如上电串口接收到几个乱码;
...

那该怎么该呢?  求帮帮忙
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-4-4 11:25:11 | 显示全部楼层
本帖最后由 edmund1234 于 2019-4-4 11:27 编辑
1599064432 发表于 2019-4-4 08:31
我定义的ppm是uint8_t类型的,这里是强制转换类型

你把1个uint8_t类型的变量, 其值x256 再加 另一uint8_t的变量的值, 放回一个uint8类型的变量去

随便拿两个数试试, 0x12 * 256 + 0x23 , 这答案uint8_t有可能放得下?


这是什么算法? 有可能不错?
回复

使用道具 举报

22

主题

271

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
405
金钱
405
注册时间
2019-3-21
在线时间
107 小时
 楼主| 发表于 2019-4-4 11:32:35 | 显示全部楼层
edmund1234 发表于 2019-4-4 11:25
你把1个uint8_t类型的变量, 其值x256 再加 另一uint8_t的变量的值, 放回一个uint8类型的变量去

随便 ...

我把这个改成int类型了,还是有问题
回复

使用道具 举报

13

主题

116

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
372
金钱
372
注册时间
2018-1-22
在线时间
118 小时
发表于 2019-4-5 17:05:23 | 显示全部楼层
1599064432 发表于 2019-4-4 08:34
对的,DS-CO2-20,

void CO2_unpack(void)

你这个不叫协议  参考一下正点原子串口例程 接收中断里面那个才叫协议,你需要接到42 4d才存入数组里,不是存完再判断
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-23 06:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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