1、有时候需要观察单片机检测到的数据曲线,所以需要用到虚拟示波器。目前用过四款虚拟示波器。 山外的;野火的;硬石的;以及datascope;自己也用c#或者Matlab写过串口助手,显示曲线;为了简单,还是用现成的吧。 如果要用具体的数据,做分析,还是用matlab比较好。
关于山外的助手
看别人用来调试智能车,用的比较多;说明还是有可取之处;
~~
关于野火的PID助手
~~ 目前用过的,野火,可以收,也可以发,主要是pid助手,显示电机转速,以及发送pid到单片机中,可以动态修改;还是比较方便的。 但是这个野火的协议库还是比较难懂。需要仔细琢磨如果解码等等;
关于DataScope
有时候仅仅需要显示看曲线。那么用datascope比较方便。
这篇文章主要说DataScope的使用。
首先有两个文件,头文件和c文件;后面附上具体代码。 第一步、在工程中包括头文件,同时添加c文件。 第二步,根据自己的单片机,修改一下大小端的代码,只需要修改宏定义就行了; 第三步,就是具体使用了。 放数据--------------------------- 放A数据到A通道中; B数据到B通道中。 、、、 最多是个通道。
生成协议帧。----------------------------- 这个虚拟示波器,是按照固定的格式发送的。 假如发送一个数据。 以;;帧头 数据字节1,字节2,字节3,字节4,帧尾组成。 数据字节1,字节2,字节3,字节4,的顺序,要看大小端。进行调换。
串口发送帧字节--------------- 这个一个个字节发送,属于串口的最基本内容了。 51有51的代码 32有32的代码。
就可以了。
实验一、发送一个浮点数,虚拟示波器中显示;
实验步骤: 1、添头文件和c文件; 2、根据具体的单片机,进行大小端的修改; 3、写发送的浮点数到通道1中; 4、生成发送包; 5、循环发送包的字节,一个个发出去。
以stm32为例:
1、添头文件和c文件;
找到文件,放进去。
要把头文件的路径添加进去。具体到文件夹中。
2、根据具体的单片机,进行大小端的修改;
注意头文件的文件名。有些人修改过。 选择不同的框。不需要的就注释掉就行了。
3、代码思路,看红色说明
4、具体代码
int main(void)
{
unsigned char i;
unsigned char Send_Count;
float d0,d1,d2,d3,d4,d5,d6,d7,d8,d9;
d0=12.3;
d1=56.3;
d2=35.2;
d3=12.5;
d4=53.3;
d5=5.6;
d6=8.5;
d7=8.5;
d8=95.2;
d9=10.2;
uart_init(72,115200);
while(1)
{
DataScope_Get_Channel_Data( d0 , 1 );
DataScope_Get_Channel_Data( d1 , 2 );
DataScope_Get_Channel_Data( d2 , 3 );
DataScope_Get_Channel_Data( d3 , 4 );
DataScope_Get_Channel_Data( d4 , 5 );
DataScope_Get_Channel_Data( d5 , 6 );
DataScope_Get_Channel_Data( d6 , 7 );
DataScope_Get_Channel_Data( d7, 8 );
DataScope_Get_Channel_Data(d8 , 9 );
DataScope_Get_Channel_Data(d9, 10);
Send_Count = DataScope_Data_Generate(10);
for( i = 0 ; i < Send_Count; i++)
{
while((USART1->SR&0X40)==0);
USART1->DR = DataScope_OutPut_Buffer[i];
}
delay_ms(50);
}
}
具体头文件、C文件:我这里修改了头文件、C文件的名字。
DataScopDP.h
#ifndef __DATA_PRTOCOL_H
#define __DATA_PRTOCOL_H
extern unsigned char DataScope_OutPut_Buffer[42];
extern void DataScope_Get_Channel_Data(float Data,unsigned char Channel);
extern unsigned char DataScope_Data_Generate(unsigned char Channel_Number);
#endif
DataScoDP.c
#include "DataScroDP.h"
unsigned char DataScope_OutPut_Buffer[42];
extern void Float2Byte(float *target,unsigned char *buf,unsigned char beg)
{
unsigned char *point;
point = (unsigned char*)target;
buf[beg] = point[0];
buf[beg+1] = point[1];
buf[beg+2] = point[2];
buf[beg+3] = point[3];
}
extern void DataScope_Get_Channel_Data(float Data,unsigned char Channel)
{
if ( (Channel > 10) || (Channel == 0) )
{
return;
}else
{
switch (Channel)
{
case 1: Float2Byte(&Data,DataScope_OutPut_Buffer,1); break;
case 2: Float2Byte(&Data,DataScope_OutPut_Buffer,5); break;
case 3: Float2Byte(&Data,DataScope_OutPut_Buffer,9); break;
case 4: Float2Byte(&Data,DataScope_OutPut_Buffer,13); break;
case 5: Float2Byte(&Data,DataScope_OutPut_Buffer,17); break;
case 6: Float2Byte(&Data,DataScope_OutPut_Buffer,21); break;
case 7: Float2Byte(&Data,DataScope_OutPut_Buffer,25); break;
case 8: Float2Byte(&Data,DataScope_OutPut_Buffer,29); break;
case 9: Float2Byte(&Data,DataScope_OutPut_Buffer,33); break;
case 10: Float2Byte(&Data,DataScope_OutPut_Buffer,37); break;
}
}
}
extern unsigned char DataScope_Data_Generate(unsigned char Channel_Number)
{
if ( (Channel_Number > 10) || (Channel_Number == 0) )
{
return 0;
}else
{
DataScope_OutPut_Buffer[0] = '$';
switch(Channel_Number)
{
case 1: DataScope_OutPut_Buffer[5] = 5; return 6; break;
case 2: DataScope_OutPut_Buffer[9] = 9; return 10; break;
case 3: DataScope_OutPut_Buffer[13] = 13; return 14; break;
case 4: DataScope_OutPut_Buffer[17] = 17; return 18; break;
case 5: DataScope_OutPut_Buffer[21] = 21; return 22; break;
case 6: DataScope_OutPut_Buffer[25] = 25; return 26; break;
case 7: DataScope_OutPut_Buffer[29] = 29; return 30; break;
case 8: DataScope_OutPut_Buffer[33] = 33; return 34; break;
case 9: DataScope_OutPut_Buffer[37] = 37; return 38; break;
case 10: DataScope_OutPut_Buffer[41] = 41; return 42; break;
}
}
return 0;
}
|