两个优秀的调试上位机附上位机通信协议程序 支持任意调用移植
[复制链接]
两个优秀的调试上位机附上位机通信协议程序 支持任意调用 第一个为匿名四轴上位机,本来这个上位机是调试四轴时用的,它的数据通道多,数据范围广,可以清晰的看出局部范围内的数据变化,是我们日常调试程序必备的有力工具。 匿名四轴的通信协议程序如下: anoflyscope.c文件 #include "anoflyscope.h" #include "usart.h" #include "dma.h" /***********************匿名四轴上位机专区(V2.6版本)*************************************/ /********************************************************************************************** *函数原型:void usart1_send_char(u8 c) *函数功能:串口1发送1个字符 *函数参数:c:要发送的字符 *函数作者:菜菜菜了一批的菜鸟 *完成日期:01.25.2018 **********************************************************************************************/ void usart1_send_char(u8 c) { while((USART1->SR & 0X40) == 0);//等待上一次发送完毕 USART1->DR = c; } /********************************************************************************************** *函数原型:void usart1_niming_report(u8 fun,u8*data,u8 len) *函数功能:传送数据给匿名四轴上位机软件(V2.6版本) *函数参数:fun:功能字. 0XA0~0XAF||data:数据缓存区,最多28字节!!||len:data区有效数据个数 *函数作者:菜菜菜了一批的菜鸟 *完成日期:01.25.2018 **********************************************************************************************/ void usart1_niming_report(u8 fun,u8*data,u8 len) { u8 send_buf[32]; u8 i; if(len > 28)return; //最多28字节数据 send_buf[len + 3] = 0; //校验数置零 send_buf[0] = 0X88; //帧头 send_buf[1] = fun; //功能字 send_buf[2] = len; //数据长度 for(i = 0; i < len; i++)send_buf[3 + i] = data; //复制数据 for(i = 0; i < len + 3; i++)send_buf[len + 3] += send_buf; //计算校验和 for(i = 0; i < len + 4; i++)usart1_send_char(send_buf); //发送数据到串口1 } /********************************************************************************************** *函数原型:void mpu6050_send_data(short aacx,short aacy,short aacz,short gyrox,short gyroy,short gyroz) *函数功能:发送加速度传感器数据和陀螺仪数据 *函数参数:aacx,aacy,aacz:x,y,z三个方向上面的加速度值||gyrox,gyroy,gyroz:x,y,z三个方向上面的陀螺仪值 *函数作者:菜菜菜了一批的菜鸟 *完成日期:01.25.2018 **********************************************************************************************/ void mpu6050_send_data(short aacx,short aacy,short aacz,short gyrox,short gyroy,short gyroz) { u8 tbuf[12]; tbuf[0]=(aacx>>8)&0XFF; tbuf[1]=aacx&0XFF; tbuf[2]=(aacy>>8)&0XFF; tbuf[3]=aacy&0XFF; tbuf[4]=(aacz>>8)&0XFF; tbuf[5]=aacz&0XFF; tbuf[6]=(gyrox>>8)&0XFF; tbuf[7]=gyrox&0XFF; tbuf[8]=(gyroy>>8)&0XFF; tbuf[9]=gyroy&0XFF; tbuf[10]=(gyroz>>8)&0XFF; tbuf[11]=gyroz&0XFF; usart1_niming_report(0XA1,tbuf,12); //自定义帧,0XA1 } /********************************************************************************************** *函数原型:void usart1_report_imu(short aacx,short aacy,short aacz,short gyrox,short gyroy,short gyroz,short roll,short pitch,short yaw) *函数功能:通过串口1上报结算后的姿态数据给电脑 *函数参数:aacx,aacy,aacz:x,y,z三个方向上面的加速度值 gyrox,gyroy,gyroz:x,y,z三个方向上面的陀螺仪值 roll:横滚角.单位0.01度。 -18000 -> 18000 对应 -180.00 -> 180.00度 pitch:俯仰角.单位 0.01度。-9000 - 9000 对应 -90.00 -> 90.00 度 yaw:航向角.单位为0.1度 0 -> 3600 对应 0 -> 360.0度 *函数作者:菜菜菜了一批的菜鸟 *完成日期:01.25.2018 **********************************************************************************************/ void usart1_report_imu(short aacx,short aacy,short aacz,short gyrox,short gyroy,short gyroz,short roll,short pitch,short yaw) { u8 tbuf[28]; u8 i; for(i=0;i<28;i++)tbuf=0;//清0 tbuf[0]=(aacx>>8)&0XFF; tbuf[1]=aacx&0XFF; tbuf[2]=(aacy>>8)&0XFF; tbuf[3]=aacy&0XFF; tbuf[4]=(aacz>>8)&0XFF; tbuf[5]=aacz&0XFF; tbuf[6]=(gyrox>>8)&0XFF; tbuf[7]=gyrox&0XFF; tbuf[8]=(gyroy>>8)&0XFF; tbuf[9]=gyroy&0XFF; tbuf[10]=(gyroz>>8)&0XFF; tbuf[11]=gyroz&0XFF; tbuf[18]=(roll>>8)&0XFF; tbuf[19]=roll&0XFF; tbuf[20]=(pitch>>8)&0XFF; tbuf[21]=pitch&0XFF; tbuf[22]=(yaw>>8)&0XFF; tbuf[23]=yaw&0XFF; usart1_niming_report(0XAF,tbuf,28);//飞控显示帧,0XAF } void ADC_Data2PC(short adcvalue) { u8 tbuf[28]; u8 i; for(i=0;i<28;i++)tbuf=0;//清0 tbuf[0]=(adcvalue>>8)&0XFF; tbuf[1]=adcvalue&0XFF; usart1_niming_report(0XAF,tbuf,2);//飞控显示帧,0XAF } anoflyscope.h文件 #ifndef __ANOFLYSCOPE_H #define __ANOFLYSCOPE_H #include "sys.h" /********************************************************************************************** *函数原型:void usart1_send_char(u8 c) *函数功能:串口1发送1个字符 *函数参数:c:要发送的字符 *函数作者:菜菜菜了一批的菜鸟 *完成日期:01.25.2018 **********************************************************************************************/ void usart1_send_char(u8 c); /********************************************************************************************** *函数原型:void usart1_niming_report(u8 fun,u8*data,u8 len) *函数功能:传送数据给匿名四轴上位机软件(V2.6版本) *函数参数:fun:功能字. 0XA0~0XAF||data:数据缓存区,最多28字节!!||len:data区有效数据个数 *函数作者:菜菜菜了一批的菜鸟 *完成日期:01.25.2018 **********************************************************************************************/ void usart1_niming_report(u8 fun,u8*data,u8 len); void ADC_Data2PC(short adcvalue); #endif 第二个为飞思卡尔上位机,这个上位机是调试飞思卡尔小车时用的,它的数据通道也比较多,可以清晰的看出数据变化,也是我们日常调试程序必备的有力工具。 freecarscope.c文件 #include "freecarscope.h" #include "usart.h" #include "dma.h" /**********************飞思卡尔上位机专区*************************/ u8 uSendBuf[UartDataNum * 2] = {0}; u8 FreeCarsDataNum = UartDataNum * 2; /********************************************************************************************** *函数原型:void USendOneByte(u8 date) *函数功能:发送一个字节 *函数参数:date:数据 *函数作者:菜菜菜了一批的菜鸟 *完成日期:01.25.2018 **********************************************************************************************/ void USendOneByte(u8 date) { USART1->DR = date; while((USART1->SR & 0X40) == 0); } /********************************************************************************************** *函数原型:void SendDataToScope(void) *函数功能:轮询法发送一帧数据消耗时间与数据长度有关不可以放在中断里面周期性调用消耗时间计算看 帮助文档 *函数参数:无 *函数作者:菜菜菜了一批的菜鸟 *完成日期:01.25.2018 **********************************************************************************************/ void SendDataToScope(void) // 数据发送协议 { s8 i,sum = 0; USendOneByte(251); //使用轮询的方式发送数据,当数据未发送,程序停在此处直到发送完成 USendOneByte(109); USendOneByte(37); sum += (251); //全部数据加入校验 sum += (109); sum += (37); for(i = 0; i < FreeCarsDataNum; i++) { USendOneByte(uSendBuf); sum += uSendBuf; //全部数据加入校验 } USendOneByte(sum); } /********************************************************************************************** *函数原型:void Push_Packet(u8 chanel,u16 data) *函数功能:向某个通道缓冲区填充数据 *函数参数:chanel:通道||data:数据 *函数作者:菜菜菜了一批的菜鸟 *完成日期:01.25.2018 **********************************************************************************************/ void Push_Packet(u8 chanel,u16 data) { uSendBuf[chanel * 2] = data >> 8; uSendBuf[chanel * 2 + 1] = data % 256; } /********************************************************************************************** *函数原型:void PC_ADC_Scope(void) *函数功能:上传ADC采集值,绘制ADC曲线图 *函数参数:无 *函数作者:菜菜菜了一批的菜鸟 *完成日期:01.15.2018 **********************************************************************************************/ void PC_ADC_Scope(void) { Push_Packet(0,(s16)ADC_ConvertedValue); Push_Packet(1,(s16)ADC_ConvertedValue); Push_Packet(2,(s16)ArithmeticalAvergeValueFilter()+100); SendDataToScope(); // 数据发送协议 } freecarscope.h文件 #ifndef __FREECARSCOPE_H #define __FREECARSCOPE_H #include "sys.h" #define UartDataNum 17 //上位机数据通道数量,必须与上位机设置一样 首先,FreeCarsDataNum是已经知道的,他是通道数UartDataNum*2(因为数据是Int16型的). /********************************************************************************************** *函数原型:void USendOneByte(u8 date) *函数功能:发送一个字节 *函数参数:date:数据 *函数作者:菜菜菜了一批的菜鸟 *完成日期:01.25.2018 **********************************************************************************************/ void USendOneByte(u8 date); /********************************************************************************************** *函数原型:void SendDataToScope(void) *函数功能:轮询法发送一帧数据消耗时间与数据长度有关不可以放在中断里面周期性调用消耗时间计算看 帮助文档 *函数参数:无 *函数作者:菜菜菜了一批的菜鸟 *完成日期:01.25.2018 **********************************************************************************************/ void SendDataToScope(void); // 数据发送协议 /********************************************************************************************** *函数原型:void Push_Packet(u8 chanel,u16 data) *函数功能:向某个通道缓冲区填充数据 *函数参数:chanel:通道||data:数据 *函数作者:菜菜菜了一批的菜鸟 *完成日期:01.25.2018 **********************************************************************************************/ void Push_Packet(u8 chanel,u16 data); /********************************************************************************************** *函数原型:void PC_ADC_Scope(void) *函数功能:上传ADC采集值,绘制ADC曲线图 *函数参数:无 *函数作者:菜菜菜了一批的菜鸟 *完成日期:01.15.2018 **********************************************************************************************/ void PC_ADC_Scope(void); #endif 上面就是两个上位机的通信协议程序,支持任意调用,方便移植,上位机在日常的调试中及其重要,下次给大家分享一下如何写自己的上位机。
|