OpenEdv-开源电子网

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

传感器不停地发送多个数据,单片机接受的问题

[复制链接]

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2012-6-15
在线时间
0 小时
发表于 2013-3-23 19:08:59 | 显示全部楼层 |阅读模式
原子哥,我最近自己在做一些要玩意儿,现在遇到一个问题,求指导!

我用串口给传感器发送命令,查询当前的一些信息,传感器接收到这个信息后,会给我发送4个字节的信息(HEX),传感器是连续发送的,我中断函数会不会来不及接受啊?
我做了一下几个试验:
1.我用串口调试助手,来充当传感器,也就是单片机和上位机相连,然后用JTAG在线调试,单片机发出了命令,然后我用串口调试助手模拟发出相应的4个字节,此时我是发送一个字节,然后按F10,单步执行的。执行完第一个接受中断服务函数后,再发下一个字节,一共发了4个,符合我的要求
我一下子在串口调试助手上写了四个字节,然后点击发送,只能进入中断服务函数一次,就跟仅仅发第一个字节的效果一样,单片机只接收到一个字节,这是为什么?
2.我用串口调试助手和传感器相连,给传感器发送命令,传感器给串口调试助手一下子出来了四个字节,为什么会是一下出来四个呢?这说明传感器是连续发送返回数据,如果用串口调试助手一定能跟得上,如果用mini STM32能不能跟得上?
我是这样想的啊,如果波特率是9600的话,差不多一个位0.1ms,0.1ms能对于STM32来讲时间还是比较长的,只要中断服务函数不是特别长,就没事。


附:
我之前用串口调试助手代替传感器,与单片机相连,然后用传感器代替单片机和串口调试助手相连,这两个试验的结果就如上面所说,我用单片机和传感器相连时,居然得不到数据,波特率设置没有问题啊

感谢原子哥莅临指导!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

1385

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
12211
金钱
12211
注册时间
2013-3-8
在线时间
1296 小时
发表于 2013-3-23 20:08:49 | 显示全部楼层
STM32串口中断就是一个字节中断一次,在中断函数里把收到的数据可以暂时放到一个Buffer里,可以等4个字节数据全部收完后再去处理啊。
回复 支持 1 反对 0

使用道具 举报

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2012-6-15
在线时间
0 小时
 楼主| 发表于 2013-3-23 20:14:15 | 显示全部楼层
回复【2楼】augustedward:
---------------------------------
我的中断服务函数,就只有将DR寄存器中的数值赋给BUFFER
回复 支持 反对

使用道具 举报

9

主题

1385

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
12211
金钱
12211
注册时间
2013-3-8
在线时间
1296 小时
发表于 2013-3-23 20:18:37 | 显示全部楼层
回复【3楼】guanandzhang:
---------------------------------
那给了Buffer以后,有没有buffer++;?也就是说定义一个buffer[64]数组,收到的第一个数放到buffer[0],第二个放到buffer[1]...,等4个收完以后,再进行数据处理?
回复 支持 反对

使用道具 举报

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2012-6-15
在线时间
0 小时
 楼主| 发表于 2013-3-23 20:26:30 | 显示全部楼层
 












回复 支持 反对

使用道具 举报

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2012-6-15
在线时间
0 小时
 楼主| 发表于 2013-3-23 20:27:59 | 显示全部楼层


 
回复 支持 反对

使用道具 举报

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2012-6-15
在线时间
0 小时
 楼主| 发表于 2013-3-23 20:29:21 | 显示全部楼层
我对四个字节的数据处理是放在主函数中的,再说了,传一个字节的数据大概是1ms,时间上执行很多指令了啊
回复 支持 反对

使用道具 举报

9

主题

1385

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
12211
金钱
12211
注册时间
2013-3-8
在线时间
1296 小时
发表于 2013-3-23 20:33:28 | 显示全部楼层
回复【5楼】guanandzhang:
---------------------------------
中断没问题啊!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-23 20:41:05 | 显示全部楼层
中断看你用的是我的代码,接收4个字节是完全没压力的。
怀疑你处理方式有问题。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2012-6-15
在线时间
0 小时
 楼主| 发表于 2013-3-23 20:41:12 | 显示全部楼层
我想的是,是不是传感器发送4个字节时,发送完第一个字节到开始发送第二个字节中间的间隙时间很短,根本来不及走中断,也就是说, 传感器发送完第一个字节,单片机接收到第一个字节,然后到中断服务函数,在执行中断服务函数时,第二字节就已经开始发送,由于在执行中断服务函数,所以第二个字节单片机根本就没有接收到啊?
回复 支持 反对

使用道具 举报

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2012-6-15
在线时间
0 小时
 楼主| 发表于 2013-3-23 20:43:35 | 显示全部楼层
原子哥,请你帮忙看一看啊

2013.03.21.zip

1.08 MB, 下载次数: 625

回复 支持 反对

使用道具 举报

9

主题

1385

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
12211
金钱
12211
注册时间
2013-3-8
在线时间
1296 小时
发表于 2013-3-23 20:46:23 | 显示全部楼层
回复【10楼】guanandzhang:
---------------------------------
不用担心中断来不及,波特率才9600,STM32有充足的时间来进入中断并完成中断。
USART_RX_BUF[],为什么判断4.5.6.7呢,怎么不从0开始?,还有就是数据处理完后,要把USART_RX_STA清0。
回复 支持 反对

使用道具 举报

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2012-6-15
在线时间
0 小时
 楼主| 发表于 2013-3-23 20:48:50 | 显示全部楼层
这一部分我以前想的是,因为每次返还的数据是四个字节,我直接在每一次执行时,buffer中的i都加上4,这样不就行了吗
回复 支持 反对

使用道具 举报

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2012-6-15
在线时间
0 小时
 楼主| 发表于 2013-3-23 20:50:56 | 显示全部楼层
我现在只想如果我在线调试第一次能够成功,下面我再改写buffer里面的变量,我可以用指针
回复 支持 反对

使用道具 举报

57

主题

431

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
886
金钱
886
注册时间
2011-12-25
在线时间
12 小时
发表于 2013-3-23 20:53:06 | 显示全部楼层
回复【13楼】guanandzhang:
---------------------------------
用FIFO吧,4byte一组,一个个byte进Queue,4byte出来
很喜爱电子行业
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-23 20:53:27 | 显示全部楼层
回复【13楼】guanandzhang:
---------------------------------
最好是直接清零USART_RX_STA变量。
另外,我不知道你的的传感器发送数据是不是自动的,如果是,你串口接收里面还必须做接收完成处理,也就是不能让第二次数据覆盖第一次的数据。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2012-6-15
在线时间
0 小时
 楼主| 发表于 2013-3-23 20:58:24 | 显示全部楼层
原子哥,你可以帮我看看我写的代码有问题吗,怎么就是实现不了呢
回复 支持 反对

使用道具 举报

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2012-6-15
在线时间
0 小时
 楼主| 发表于 2013-3-23 20:59:58 | 显示全部楼层
我的传感器发送数据是自动的,因为我用串口调试助手,完全可以实现
回复 支持 反对

使用道具 举报

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2012-6-15
在线时间
0 小时
 楼主| 发表于 2013-3-23 21:05:11 | 显示全部楼层
那我把 代码中的63 变成3不就可以了吗?
我想,即使覆盖了,我在线调试的第一次串口通信了,我单片机也该接收到传感器发送的数据才是啊
回复 支持 反对

使用道具 举报

3

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2013-11-28
在线时间
2 小时
发表于 2014-4-9 17:29:55 | 显示全部楼层
回复【楼主位】guanandzhang:
---------------------------------
你好,我也遇到和你相同的问题,就是单独测试,传感器和上位机的串口调试相连,发送询问指令时传感器可以返回数据。用单片机和上位机串口调试助手通讯,调试助手可以收到正确的指令但是把单片机和传感器连接就收不到数据,请问你是怎么解决的?
回复 支持 反对

使用道具 举报

3

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2013-11-28
在线时间
2 小时
发表于 2014-4-9 17:32:57 | 显示全部楼层
回复【16楼】正点原子:

回复【13楼】guanandzhang:
---------------------------------
最好是直接清零USART_RX_STA变量。
另外,我不知道你的的传感器发送数据是不是自动的,如果是,你串口接收里面还必须做接收完成处理,也就是不能让第二次数据覆盖第一次的数据。

---------------------------------
原子哥,我也遇到相同的问题,就是单独测试,传感器和上位机的串口调试相连,发送询问指令时传感器可以返回数据。用单片机和上位机串口调试助手通讯,调试助手可以收到正确的指令但是把单片机和传感器连接就收不到数据,请问怎么解决?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-4-9 17:48:05 | 显示全部楼层
回复【21楼】haoyun1243:
---------------------------------
检查你单片机的代码。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2016-11-22
在线时间
19 小时
发表于 2017-6-14 16:36:08 | 显示全部楼层
guanandzhang 发表于 2013-3-23 20:59
我的传感器发送数据是自动的,因为我用串口调试助手,完全可以实现

您好!能把传感器自动发送数据,用串口接收的代码给我参考下吗?我现在自动发送速度太快,接收的数一直是原始值。非常感谢
回复 支持 反对

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2016-11-22
在线时间
19 小时
发表于 2017-6-14 16:36:50 | 显示全部楼层
immydestiny 发表于 2017-6-14 16:36
您好!能把传感器自动发送数据,用串口接收的代码给我参考下吗?我现在自动发送速度太快,接收的数一直是 ...

我现在也是这种情况,求教
回复 支持 反对

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2017-6-14 16:46:26 | 显示全部楼层
immydestiny 发表于 2017-6-14 16:36
我现在也是这种情况,求教

最简单粗暴的方式,传感器的时钟是谁给的?如果是MCU控制那还不简单啊,如果不是,那让MCU时钟速度远大于传感器,怎么可能接不到
回复 支持 反对

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2016-11-22
在线时间
19 小时
发表于 2017-6-14 17:26:17 | 显示全部楼层
聚东风 发表于 2017-6-14 16:46
最简单粗暴的方式,传感器的时钟是谁给的?如果是MCU控制那还不简单啊,如果不是,那让MCU时钟速度远大于传感 ...

传感器用软件IIC  传感器Data
on the I2C-bus can be transferred at a rate up to 100 kbit/s in
the standard-mode, or up to 400 kbit/s in the fast-mode
我软件IIC设置的GPIO速度是25-100Mhz ,  传感器是数字输出,一秒能输出2000个,而我一秒需要采集250 个数,用串口的时候,显示接收字节数超级快。
我没太明白您说的意思
回复 支持 反对

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2017-6-15 07:31:29 | 显示全部楼层
immydestiny 发表于 2017-6-14 17:26
传感器用软件IIC  传感器Data
on the I2C-bus can be transferred at a rate up to 100 kbit/s in
the  ...

一秒需要采集250 个数,这么慢..
回复 支持 反对

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2016-11-22
在线时间
19 小时
发表于 2017-6-15 08:53:24 | 显示全部楼层
聚东风 发表于 2017-6-15 07:31
一秒需要采集250 个数,这么慢..

500个也行,可是传感器自己的采样率是2000Kz,太快,我设置了延时,串口接收字节数还是很快,读到的数都是初始值
回复 支持 反对

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2017-6-15 11:21:41 | 显示全部楼层
SDA(串行数据线)和SCL(串行时钟线)都是双向I/O线,接口电路为开漏输出.需通过上拉电阻接电源VCC.当总线空闲时.两根线都是高电平,连接总线的外同器件都是CMOS器件,输出级也是开漏电路
看下这个做了没,而且采样频率跟输出是两码事,我虽然没用,但是我敢肯定没哪个傻逼传感器就自顾自的发数据而不管主机的
回复 支持 反对

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2017-6-15 11:29:12 | 显示全部楼层
immydestiny 发表于 2017-6-15 08:53
500个也行,可是传感器自己的采样率是2000Kz,太快,我设置了延时,串口接收字节数还是很快,读到的数都是 ...

发送到SDA 线上的每个字节必须为8 位,每次传输可以发送的字节数量不受限制。每个字节后必须跟一个响应位。首先传输的是数据的最高位(MSB),如果从机要完成一些其他功能后(例如一个内部中断服务程序)才能接收或发送下一个完整的数据字节,可以使时钟线SCL 保持低电平,迫使主机进入等待状态,当从机准备好接收下一个数据字节并释放时钟线SCL 后数据传输继续

假设它真的自顾自的发,你看网上不也都有让它屈服的办法吗?




回复 支持 反对

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2016-11-22
在线时间
19 小时
发表于 2017-6-16 20:06:18 | 显示全部楼层
聚东风 发表于 2017-6-15 11:21
SDA(串行数据线)和SCL(串行时钟线)都是双向I/O线,接口电路为开漏输出.需通过上拉电阻接电源VCC.当总 ...

非常感谢,我试一下
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-18 04:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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