下位机 zigbee代码
最近在做基于zigbee的RSSI实时定位系统。这个系统需要我们实时的测量得到每一个位置的rssi值。首先,我需要研究怎么把这个rssi值通过串口传到我们的上位机上。
我们可以看到我们下位机,里面有一个传送数据包的一个东西,在这个数据包里面,我们把每一次传送的rssi的值分了四次传送,这里面涉及到具体的zigbee传送协议以及他们底层硬件的内容。
//主要的串口输出代码
nRssi=(0-(int32)rxStats.rssiSum/32);
strRssi[0]=nRssi/10+'0';
strRssi[1]=nRssi%10+'0';
//UartTX_Send_String(" RSSI:-",strlen(" RSSI:-"));
UartTX_Send_String(strRssi,2);
UartTX_Send_String("\r\n",strlen("\r\n"));/****************************************************************
串口发送字符串函数
****************************************************************/
void UartTX_Send_String(int8 *Data,int len)
{int j;for(j=0;j<len;j++){U0DBUF = *Data++;while(UTX0IF == 0);UTX0IF = 0;}
}
可以看到在串口发送字符串函数里面。我们的数据是通过这个函数进行发送的。然后他只是把我们的数据传到了u0dbuf里面,但是这个u0dbuf具体是什么作用,需要看相关的手册以及相关的协议,才能搞明白,目前我的水平只是会用这些东西,根据通信协议写一个数据包并发送接收这种我水平还达不到。
然后我就通过实验来验证一下来,判断一下他们到底往串口里面发的都是些什么东西。以及我们如何把这些东西传到我的上位机上,如何显示出来数据。
上位机 matlab代码
有现成的串口调试助手,但是串口调试助手呢,他是别人已经写好的,而且呢功能非常局限性,也不能更改什么东西,也不能说时显示我的数据,画图什么的都不行,也不能进行一些深层次数据分析,所以说我们自己写个上位机,自己写一个串口数据处理程序,然后我们亲眼看看这个数据到底是个什么东西。
matlab很简单,而且对于数据的处理也是比较厉害,所以说我们就matlab来做一个串口助手。但是此时此刻我不想再搞一个gui界面,因为我们先把最基本的这些东西搞明白之后,gui界面就好做了。
我现在我们通过Serial搞一个串口对象,然后吗设置这个对象,设置它的波特率呀以及一系列的这个东西,我们的端口儿呢,是因为我这个硬件儿连到电脑上发现他的端口是,Com3口儿,所以我们就把这个串口的对象的设置为,Com3口。
首先我们不知道他读的是什么东西,也不知道他们一次读了是一个几位的数据,也不知道他们这个东西是怎么传的,那么我们就可以把这个东西给输出出来看看。下面看代码:
这里面我加了一个实时绘图,实时显示绘图非常简单。无非就是每次画点坐标是XY。X轴我们设置为时间轴,Y轴我们设置为数据轴。xy点坐标呢,每次Y坐标是通过我们的数据串口读取读取到的,但是x坐标需要我们自己去改变,我们这里把X每次都增加一,一就是就意味着他时间每次增加一,然后Y轴对应的是串口读取到的新的数据,这样的话,我们每次把xy的这个坐标点画到图像上,这么一来他们就成了一个散点图了。
delete(instrfind);
pause(0.1);
s=serial('com3');
set(s,'BaudRate',9600,'DataBits', 8, 'Parity', 'none','StopBits', 1, 'FlowControl', 'none','Terminator','CR');
fopen(s);
x=1;for i=1:4out=fread(s,1,'char'); %一次读出1个字符 fprintf('%c',out); %输出字符plot(x,out,'or' , 'MarkerSize', 5)x=x+1;hold on;pause(0.1);%fprintf(fid,'%c',out); % 写入文件里
endfclose(s);
delete(s);
clear s;
我想搞一个数据实时显示的绘图的一个东西。然后一开始呢,就以为他一次就把我数字都给读出来了。
但是画图的话是每次给我画了四个点,然后四个点来回平移,来回这么上下左右摇摆。这个他这个可能是不是直接给我一个数字不是给我一个int型的,而是给我一个char形的。而且呢,四个char型才组成了一个数字。
那我又验证了一下,然后我就让他循环四次,然后我们看看它到底读的是个什么东西,最后发现四次,每次读取的就是一个字符。比如39,第一次读个三,第二次读个九,第三次第四次分别是\r\n
这时候我们实时数据显示图也可以明显的看出来。绝对是一个char型的,因为它的数据呢,阿斯科码对应的十进制呢,字符三对应的十进制刚好就是50,7对应十进制是54.
那么接下来呢,这个串口数据传的是怎么传的都知道了,然后怎么采集的也知道了,怎么画图的也知道了,那么如何把这个数据再处理一下。每次显示的图像上的是一个整体的一个数而不是是四个字符呢。我考虑就是把这个四个数儿给合并一下,单独搞一个for循环合并这四个数儿,然后for循环外面套一个while。for完之后,把这个数输到这个界面上,这就行了。
这样一来,我什么zigbee传输协议不知道。底层也不太清楚,但是照样能够显示出来数据。但是呢,也不能说通过这种推理现象得出结论的方法是好的。因为这样的话,我们对底层的原理不了解,这就没办法更深层次地进行一些创新性的操作。目前只是把这些代码在逻辑结构上加加减减,进行适合我想要的实验结果的操作,但是这样的话。没办法从新建一个文件开始写出来整个文件,而只能通过修改已有的文件来达到这些效果。这样很显然就是非常浅层次的学习,而不算是更加深入地,更加有创造性的学习。
目前所学甚浅,我也意识到了很多地方我只是看似会,但其实只知其大概,以后还是少去拼凑代码了,好好学学底层的原理,继续深造,弄一个完全属于自己的东西出来。工程师和科学家侧重点不一样。有的老师喜欢把原理搞得特别懂,然后创造一个新原理。有的老师喜欢把已有的东西拼凑出一个更加完美的东西,而不注重他究竟是怎么实现的。每个人的态度都不一样。