怎么同时读取多个树莓派读取传感器数据的数据并发送到串口

##背景描述##
& &基于zigbee的温室大棚
& &一个协调器连接电脑,并接收多个zigbee终端发过来的数据 & &
& &##目的:
& &1.编写上位机(MFC)
& &2.想把串口接收到的多个传感器的数据分别在不同的编辑框输出
& &解决方案:
& & 1.发送过来的数据打包(必须)
& & & & &*详情可以百度&谷歌
& & 2.MFC串口控件缓冲区必须设定一个数值(触发OnComm函数)
& & & & &*关键代码如下:
& & & & &m_ctrlComm.SetSettings(&115200,n,8,1&);//打开软件时端口设置默认为波特率9115200,无校验位,8位数据,1位停止位 &&
m_ctrlComm.SetInputMode(1);&
//1:表示以二进制方式检取数据&
m_ctrlComm.SetRThreshold(12);&
//参数12表示每当串口接收缓冲区中有12个字符时将引发一个接收数据的OnComm事件&
m_ctrlComm.SetInputLen(12);//设置当前接收区数据长度为12&
m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据 &
& & & 注:我这里设置的是 12 ,是和我发过来的数据包的字节大小是一直的。
& & & 3.直接上我的OnComm() 函数:
void CSmart_ZIGBEE_FLYDlg::OnComm()&
& & & VARIANT variant_//定义一个VARIANT类对象
& &COleSafeArray safearray_//定义一个COleSafeArray对象
& &LONG len,k;&
&o++;
&BYTE rxdata[1024]; //设置BYTE数组 AN 8—intterthat is not signed.
////////////////////////////////////
& & & & & & & & //每次清屏
////////////////////////////
if(o&30) & & //定量清除 编辑框数据
& & & & m_strRXData = _T(&&);
m_strRXData2= _T(&&);
& & & & m_strRXData3 = _T(&&);
& &m_strRXData4= _T(&&);
m_strRXData5 = _T(&&); &
&if (m_ctrlComm.GetCommEvent()==2)//事件值为2表示接收缓冲区内有数据&
&//OnSave();
&///以下你可以根据自己的通信协议加入处理代码 &
&variant_inp=m_ctrlComm.GetInput();//读缓冲区 &&
&safearray_inp=variant_ & &//VARIANT型变量转换为ColeSafeArray型变量&
&len=safearray_inp.GetOneDimSize(); //读取到的缓存区数据的长度 &//得到有效数据长度
& & & & &&
&for(k=0;k&k++)
&safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组 &
&for(k=0;k&1;k++)//将数组转换为Cstring型变量 & &
& & BYTE bt=*(char*)(rxdata+k);//字符型首先取得(rxdata+k),它是一个BYTE型的指针,
//然后强制转换为char型,然后逆向引用求出其中的内容
& & & & & & & & &
& & & & & & & & &
& & & & & & strtemp.Format(&%c&,bt);//将字符送入临时变量strtemp存放 &
& & & & & & & &
//备注:我一共有四个终端同时向协调器发送数据,
//每个终端的数据都进行了打包,然后设置一个标志位
//通过判别标志位,来进行调用不同的 编辑框进行输出
& &if(strtemp =='#')//温度
& & if (strtemp =='@')//光强
if (strtemp =='*')//湿度
& & if (strtemp =='$')// co2二氧化碳
if(strtemp =='&')// 烟雾
& & & & & & & & & for(k=1;k&k++)//将数组转换为Cstring型变量 & &
&BYTE bt=*(char*)(rxdata+k);//字符型首先取得(rxdata+k),它是一个BYTE型的指针,
//然后强制转换为char型,然后逆向引用求出其中的内容
& & & & & & & & &
& & & & & & strtemp.Format(&%c&,bt);//将字符送入临时变量strtemp存放 &
& & & & & & m_strRXData+=
& & & & & & & &
&}OnSave();//这是我数据保存函数(也是保存到不同的文本的)
& & & & & & &case 1:
& & & & & & & & & &for(k=1;k&k++)//将数组转换为Cstring型变量 & &
&BYTE bt=*(char*)(rxdata+k);//字符型首先取得(rxdata+k),它是一个BYTE型的指针,
//然后强制转换为char型,然后逆向引用求出其中的内容
& & & & & & strtemp.Format(&%c&,bt);//将字符送入临时变量strtemp存放 &
& & & & & & m_strRXData2+=
& } OnSave_1();
& & & & & & & case 2:&
& & & & & & & & & &for(k=1;k&k++)//将数组转换为Cstring型变量 & &
& & & BYTE bt=*(char*)(rxdata+k);//字符型首先取得(rxdata+k),它是一个BYTE型的指针,
//然后强制转换为char型,然后逆向引用求出其中的内容
& & & & & & & &strtemp.Format(&%c&,bt);//将字符送入临时变量strtemp存放 &
& & & & & & & &m_strRXData3+=
& } OnSave2();
& & & & & & & & & &for(k=1;k&k++)//将数组转换为Cstring型变量 & &
& & &BYTE bt=*(char*)(rxdata+k);//字符型首先取得(rxdata+k),它是一个BYTE型的指针,
//然后强制转换为char型,然后逆向引用求出其中的内容
& & & & & & &strtemp.Format(&%c&,bt);//将字符送入临时变量strtemp存放 &
& & & & & & &m_strRXData4+=
& }OnSave3();
& & & & & & & & & &for(k=1;k&k++)//将数组转换为Cstring型变量 & &
& & & &BYTE bt=*(char*)(rxdata+k);//字符型首先取得(rxdata+k),它是一个BYTE型的指针,
//然后强制转换为char型,然后逆向引用求出其中的内容
& & & & & & & &strtemp.Format(&%c&,bt);//将字符送入临时变量strtemp存放 &
& & & & & & & &m_strRXData5+=
& } OnSave4();
& & & & & UpdateData(FALSE);//更新编辑框内容(主要是接收编辑框中的
这样就可以实现多个编辑框输出了
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:51031次
积分:1757
积分:1757
排名:第18480名
原创:115篇
转载:31篇
评论:23条
文章:21篇
阅读:14455查看: 3941|回复: 21
传感器不停地发送多个数据,单片机接受的问题
主题帖子精华
初级会员, 积分 78, 距离下一级还需 122 积分
在线时间0 小时
原子哥,我最近自己在做一些要玩意儿,现在遇到一个问题,求指导!
我用串口给传感器发送命令,查询当前的一些信息,传感器接收到这个信息后,会给我发送4个字节的信息(HEX),传感器是连续发送的,我中断函数会不会来不及接受啊?
我做了一下几个试验:
1.我用串口调试助手,来充当传感器,也就是单片机和上位机相连,然后用JTAG在线调试,单片机发出了命令,然后我用串口调试助手模拟发出相应的4个字节,此时我是发送一个字节,然后按F10,单步执行的。执行完第一个接受中断服务函数后,再发下一个字节,一共发了4个,符合我的要求
我一下子在串口调试助手上写了四个字节,然后点击发送,只能进入中断服务函数一次,就跟仅仅发第一个字节的效果一样,单片机只接收到一个字节,这是为什么?
2.我用串口调试助手和传感器相连,给传感器发送命令,传感器给串口调试助手一下子出来了四个字节,为什么会是一下出来四个呢?这说明传感器是连续发送返回数据,如果用串口调试助手一定能跟得上,如果用mini STM32能不能跟得上?
我是这样想的啊,如果波特率是9600的话,差不多一个位0.1ms,0.1ms能对于STM32来讲时间还是比较长的,只要中断服务函数不是特别长,就没事。
我之前用串口调试助手代替传感器,与单片机相连,然后用传感器代替单片机和串口调试助手相连,这两个试验的结果就如上面所说,我用单片机和传感器相连时,居然得不到数据,波特率设置没有问题啊
感谢原子哥莅临指导!
主题帖子精华
金牌会员, 积分 2401, 距离下一级还需 599 积分
在线时间268 小时
STM32串口中断就是一个字节中断一次,在中断函数里把收到的数据可以暂时放到一个Buffer里,可以等4个字节数据全部收完后再去处理啊。
主题帖子精华
初级会员, 积分 78, 距离下一级还需 122 积分
在线时间0 小时
回复【2楼】augustedward:
---------------------------------
我的中断服务函数,就只有将DR寄存器中的数值赋给BUFFER
主题帖子精华
金牌会员, 积分 2401, 距离下一级还需 599 积分
在线时间268 小时
回复【3楼】guanandzhang:
---------------------------------
那给了Buffer以后,有没有buffer++;?也就是说定义一个buffer[64]数组,收到的第一个数放到buffer[0],第二个放到buffer[1]...,等4个收完以后,再进行数据处理?
主题帖子精华
初级会员, 积分 78, 距离下一级还需 122 积分
在线时间0 小时
a722afaff5c36f112b875a_768.png (0 Bytes, 下载次数: 0)
22:54 上传
主题帖子精华
初级会员, 积分 78, 距离下一级还需 122 积分
在线时间0 小时
3fca337cff_661.png (0 Bytes, 下载次数: 0)
22:54 上传
主题帖子精华
初级会员, 积分 78, 距离下一级还需 122 积分
在线时间0 小时
我对四个字节的数据处理是放在主函数中的,再说了,传一个字节的数据大概是1ms,时间上执行很多指令了啊
主题帖子精华
金牌会员, 积分 2401, 距离下一级还需 599 积分
在线时间268 小时
回复【5楼】guanandzhang:
---------------------------------
中断没问题啊!
主题帖子精华
在线时间510 小时
中断看你用的是我的代码,接收4个字节是完全没压力的。
怀疑你处理方式有问题。
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
初级会员, 积分 78, 距离下一级还需 122 积分
在线时间0 小时
我想的是,是不是传感器发送4个字节时,发送完第一个字节到开始发送第二个字节中间的间隙时间很短,根本来不及走中断,也就是说,&传感器发送完第一个字节,单片机接收到第一个字节,然后到中断服务函数,在执行中断服务函数时,第二字节就已经开始发送,由于在执行中断服务函数,所以第二个字节单片机根本就没有接收到啊?
主题帖子精华
初级会员, 积分 78, 距离下一级还需 122 积分
在线时间0 小时
原子哥,请你帮忙看一看啊
20:43 上传
点击文件名下载附件
1.08 MB, 下载次数: 203
主题帖子精华
金牌会员, 积分 2401, 距离下一级还需 599 积分
在线时间268 小时
回复【10楼】guanandzhang:
---------------------------------
不用担心中断来不及,波特率才9600,STM32有充足的时间来进入中断并完成中断。
USART_RX_BUF[],为什么判断4.5.6.7呢,怎么不从0开始?,还有就是数据处理完后,要把USART_RX_STA清0。
主题帖子精华
初级会员, 积分 78, 距离下一级还需 122 积分
在线时间0 小时
这一部分我以前想的是,因为每次返还的数据是四个字节,我直接在每一次执行时,buffer中的i都加上4,这样不就行了吗
主题帖子精华
初级会员, 积分 78, 距离下一级还需 122 积分
在线时间0 小时
我现在只想如果我在线调试第一次能够成功,下面我再改写buffer里面的变量,我可以用指针
主题帖子精华
在线时间0 小时
回复【13楼】guanandzhang:
---------------------------------
用FIFO吧,4byte一组,一个个byte进Queue,4byte出来
很喜爱电子行业
主题帖子精华
在线时间510 小时
回复【13楼】guanandzhang:
---------------------------------
最好是直接清零USART_RX_STA变量。
另外,我不知道你的的传感器发送数据是不是自动的,如果是,你串口接收里面还必须做接收完成处理,也就是不能让第二次数据覆盖第一次的数据。
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
初级会员, 积分 78, 距离下一级还需 122 积分
在线时间0 小时
原子哥,你可以帮我看看我写的代码有问题吗,怎么就是实现不了呢
主题帖子精华
初级会员, 积分 78, 距离下一级还需 122 积分
在线时间0 小时
我的传感器发送数据是自动的,因为我用串口调试助手,完全可以实现
主题帖子精华
初级会员, 积分 78, 距离下一级还需 122 积分
在线时间0 小时
那我把&代码中的63&变成3不就可以了吗?
我想,即使覆盖了,我在线调试的第一次串口通信了,我单片机也该接收到传感器发送的数据才是啊
主题帖子精华
初级会员, 积分 51, 距离下一级还需 149 积分
在线时间2 小时
回复【楼主位】guanandzhang:
---------------------------------
你好,我也遇到和你相同的问题,就是单独测试,传感器和上位机的串口调试相连,发送询问指令时传感器可以返回数据。用单片机和上位机串口调试助手通讯,调试助手可以收到正确的指令但是把单片机和传感器连接就收不到数据,请问你是怎么解决的?
主题帖子精华
初级会员, 积分 51, 距离下一级还需 149 积分
在线时间2 小时
回复【16楼】正点原子:
回复【13楼】guanandzhang:
---------------------------------
最好是直接清零USART_RX_STA变量。
另外,我不知道你的的传感器发送数据是不是自动的,如果是,你串口接收里面还必须做接收完成处理,也就是不能让第二次数据覆盖第一次的数据。
---------------------------------
原子哥,我也遇到相同的问题,就是单独测试,传感器和上位机的串口调试相连,发送询问指令时传感器可以返回数据。用单片机和上位机串口调试助手通讯,调试助手可以收到正确的指令但是把单片机和传感器连接就收不到数据,请问怎么解决?
主题帖子精华
在线时间510 小时
回复【21楼】haoyun1243:
---------------------------------
检查你单片机的代码。
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
Powered by2012年12月 .NET技术大版内专家分月排行榜第三
2015年3月 总版技术专家分月排行榜第二2014年12月 总版技术专家分月排行榜第二2014年9月 总版技术专家分月排行榜第二
2015年3月 .NET技术大版内专家分月排行榜第一2015年2月 .NET技术大版内专家分月排行榜第一2015年1月 .NET技术大版内专家分月排行榜第一2014年12月 .NET技术大版内专家分月排行榜第一2014年11月 .NET技术大版内专家分月排行榜第一
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。

我要回帖

更多关于 树莓派读取传感器数据 的文章

 

随机推荐