精华内容
下载资源
问答
  • 匿名四轴上位机

    2018-02-28 18:22:38
    匿名四轴上位机软件介绍: 1,该软件为:ANO_Tech匿名四轴上位机_V2.6.exe,由匿名四轴提供,可用于MPU6050的测试调试。 2,该软件双击后,会弹出一个蓝色的小界面,直接关闭即可。然后才会进入主界面。 3, 进入主...
  • 文件夹内包含的是匿名四轴上位机的两大版本,其功能都差不多,只是界面稍微有点变化,v6.5更新于2018年11月,根据自己爱好下载使用
  • 包含匿名上位机v5.12和v2.6两个版本以及官方python上位机,亲测都可用,需要的可以拿去用用,适合调试mpu6050飞控姿态。
  • ANO_Tech匿名四轴上位机_V2.6.zip 四轴、MPU6050调试必备。
  • 1,该软件为:ANO_Tech匿名四轴上位机_V2.6.exe,由匿名四轴提供,可用于MPU6050的测试调试。 2,该软件双击后,会弹出一个蓝色的小界面,直接关闭即可。然后才会进入主界面。 3, 进入主界面后,可能会弹出下载出错...
  • 个人并不喜欢Arduino 用的也很少,今晚写完代码没事干 就写了一点点 试了下Arduino的串口通信 测试没毛病
  • 匿名四轴上位机.zip

    2021-01-23 22:54:50
    匿名四轴上位机
  • ( ANO_Tech匿名四轴上位机.zip

    热门讨论 2013-09-03 21:28:53
    匿名四轴上位机,配套匿名四旋翼飞行器使用,不定期更新
  • QT四轴上位机初级版.zip

    热门讨论 2013-04-28 11:06:12
    QT开发技术,实现串口收发数据包,设计上位机界面,实现简单实用的QT四轴飞行器上位机功能
  • 匿名四轴上位机使用手册

    千次阅读 2019-07-16 18:04:00
    匿名四轴上位机使用手册 目录 1、串口功能 2、高级收码 3、波形显示 4、飞控状态 5、上传数据的单片机程序 6、更多参考 1、串口功能 软件界面 ...

    匿名四轴上位机使用手册

     

    1、串口功能

    软件界面

     

    串口功能和串口助手等软件功能类似,设置也差不多。

    1.设置接收格式、端口、波特率即可。

    2.打开基本收码功能。

    3.打开串口。 

    4.测试:

     

     

     2、高级收码

    高级收码设置选项卡:

     

    1.1-10对应0XA1-0XAA,我们只需要按定义帧设置即可,我这里使用0XA2,选择2,并打开开关。

    2.因为我需要查看的有三个数据,pitch,roll,yaw,并为float类型,所以如此设置。

    3.最后打开高级收码功能,如果你需要实时查看上传的数据可以打开收码显示。

    4.打开串口。 

    5.测试:

     

     

     

     3、波形显示

    波形显示功能需要在高级收码的功能上做修改。

    波形显示设置选项卡如下:

     

     

    1.1-20序号对应的是波形序号,也就是说最多能指定显示20个波形,我们这里有pitch,roll,yaw三个波形,所以设置1,2,3。

    2.设置第一个波形1,它来源于数据帧2的第一位。

    3.设置第一个波形2,它来源于数据帧2的第二位。

    4.设置第一个波形3,它来源于数据帧2的第三位。

    5.打开数据校验,数据显示。

    6.打开波形显示。

    7.在波形显示页面勾上前三个即可:

    8.打开串口。

    9.测试:

     

     

     

    4、飞控状态

    使用到此功能再补充。

     

    5、上传数据的单片机程序

    以下为上传三个角度的代码,串口初始化等略过:

    void usart1_send_char(u8 c)
    {
        while((USART1->SR&0X40)==0);//等待上一次发送完毕  
        USART1->DR=c;   
    }
     
    //fun:功能字. 0XA0~0XAF
    //data:数据缓存区,最多28字节!!
    //len:data区有效数据个数
    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[i];         //复制数据
        for(i=0;i<len+3;i++)send_buf[len+3]+=send_buf[i];    //计算校验和
        for(i=0;i<len+4;i++)usart1_send_char(send_buf[i]);   //发送数据到串口1
    }
     
    void mpu6050_send_data(float pitch,float roll,float yaw)
    {
        u8 tbuf[16];
        unsigned char *p;
        p=(unsigned char *)&pitch;
        tbuf[0]=(unsigned char)(*(p+3));
        tbuf[1]=(unsigned char)(*(p+2));
        tbuf[2]=(unsigned char)(*(p+1));
        tbuf[3]=(unsigned char)(*(p+0));
         
        p=(unsigned char *)&roll;
        tbuf[4]=(unsigned char)(*(p+3));
        tbuf[5]=(unsigned char)(*(p+2));
        tbuf[6]=(unsigned char)(*(p+1));
        tbuf[7]=(unsigned char)(*(p+0));
         
        p=(unsigned char *)&yaw;
        tbuf[8]=(unsigned char)(*(p+3));
        tbuf[9]=(unsigned char)(*(p+2));
        tbuf[10]=(unsigned char)(*(p+1));
        tbuf[11]=(unsigned char)(*(p+0));
         
        usart1_niming_report(0XA2,tbuf,12);//自定义帧,0XA2
    }  

    注意:最后一个函数把float拆成四个字节发送(由于串口只能一个字节一个字节的发送),用指针获得float型变量的首地址,然后强制转换为unsigned char型,地址逐渐加大把float的四个字节分别发出即可。

     

    6、更多参考

    匿名四轴上位机视频教程:https://v.youku.com/v_show/id_XNTkzNDkxNTU2.html

    另外在个人的无人机中使用如下:

    /*********************************************************************************
     * 文件名  :main.c
     * 描述    :无人机      
     * 实验平台: STM32开发板
     * 库版本  :ST3.5.0
     * 作者    :  零
    **********************************************************************************/
    #include "stm32f10x.h"
    #include "pwm_output.h"
    #include "key.h"
    #include "delay.h"
    #include "QDTFT_demo.h"
    #include "led.h"
    #include "Lcd_Driver.h"
    #include "mpu6050.h"
    #include "inv_mpu.h"
    #include "inv_mpu_dmp_motion_driver.h" 
    #include "usart.h"    
    #include "delay.h"
    #include "misc.h"
    #include "GUI.h"
    #include "pid_1.h"
    #include "math.h"
    #include "control.h"
    #include "string.h"
    #include "usmart.h"
    #include "stm32f10x_usart.h"
    /************************************************/
    
    
    //串口1发送1个字符 
    //c:要发送的字符
    void usart1_send_char(u8 c)
    {       
        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕   
        USART_SendData(USART1,c);  
    }
    /* 
    //传送数据给匿名四轴上位机软件(V2.6版本)
    //fun:功能字. 0XA0~0XAF
    //data:数据缓存区,最多28字节!!
    //len:data区有效数据个数
    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[i];            //复制数据
        for(i=0;i<len+3;i++)send_buf[len+3]+=send_buf[i];    //计算校验和    
        for(i=0;i<len+4;i++)usart1_send_char(send_buf[i]);    //发送数据到串口1 
    }
    //if(report)mpu6050_send_data(aacx,aacy,aacz,gyrox,gyroy,gyroz);//用自定义帧发送加速度和陀螺仪原始数据
    //if(report)usart1_report_imu(aacx,aacy,aacz,gyrox,gyroy,gyroz,(int)(roll*100),(int)(pitch*100),(int)(yaw*10));    
    
    //发送加速度传感器数据和陀螺仪数据
    //aacx,aacy,aacz:x,y,z三个方向上面的加速度值
    //gyrox,gyroy,gyroz:x,y,z三个方向上面的陀螺仪值
    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
    }    
    //通过串口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度
    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[i]=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
    } 
    ************************************************/
    
    
    
    
    //fun:功能字. 0XA0~0XAF
    //data:数据缓存区,最多28字节!!
    //len:data区有效数据个数
    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[i];         //复制数据
        for(i=0;i<len+3;i++)send_buf[len+3]+=send_buf[i];    //计算校验和
        for(i=0;i<len+4;i++)usart1_send_char(send_buf[i]);   //发送数据到串口1
    }
     
    void mpu6050_send_data(float pitch,float roll,float yaw)
    {
        u8 tbuf[16];
        unsigned char *p;
        p=(unsigned char *)&pitch;
        tbuf[0]=(unsigned char)(*(p+3));
        tbuf[1]=(unsigned char)(*(p+2));
        tbuf[2]=(unsigned char)(*(p+1));
        tbuf[3]=(unsigned char)(*(p+0));
         
        p=(unsigned char *)&roll;
        tbuf[4]=(unsigned char)(*(p+3));
        tbuf[5]=(unsigned char)(*(p+2));
        tbuf[6]=(unsigned char)(*(p+1));
        tbuf[7]=(unsigned char)(*(p+0));
         
        p=(unsigned char *)&yaw;
        tbuf[8]=(unsigned char)(*(p+3));
        tbuf[9]=(unsigned char)(*(p+2));
        tbuf[10]=(unsigned char)(*(p+1));
        tbuf[11]=(unsigned char)(*(p+0));
         
        usart1_niming_report(0XA2,tbuf,12);//自定义帧,0XA2
    }  
    u16 pwm1=2000,pwm2=2000,pwm3=2000,pwm4=2000;
    
    
    /************************************************/
    /*
     * 函数名:main
     * 描述  :主函数
     * 输入  :无
     * 输出  :无
     */
    int main(void)
    {    
        u8 report=1; //默认开启上报
        u8 res;
        u8 test[20];
        u8 temp_value[20];            //存储陀螺仪的临时值
        u8 temp_value2[20];            //存储pwm输出的临时值
        u8 t=0;
        u8 key;                        //按键值
        u8 key_status=0;            //按键状态
        u8 keystatus=0;                //按键s4的状态值
        float temp;
        float pitch,roll,yaw;         //欧拉角
        short aacx,aacy,aacz;        //加速度传感器原始数据
        short gyrox,gyroy,gyroz;    //陀螺仪原始数据
        
        int Motor1=0;        //电机1输出
        int Motor2=0;        //电机2输出
        int Motor3=0;        //电机3输出
        int Motor4=0;        //电机4输出
        
        float Pitch;
        float Roll;
        float Yaw;
        PIDx_init();
        PIDy_init();
        PIDz_init();
        pitch_init();
        roll_init();
        yaw_init();
        
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);     //设置NVIC中断分组2:2位抢占优先级,2位响应优先级    
        delay_init();
        KEY_Init();
        uart_init(500000);  //初始化串口
        usmart_dev.init(72);        //初始化USMART
        pwm_init();/* TIM3 PWM波输出初始化,并使能TIM3 PWM输出 */
        Lcd_Init();
        LCD_LED_SET;//通过IO控制背光亮    
        Lcd_Clear(GRAY0);
        delay_ms(1000);    
        MPU_Init();                    //初始化MPU6050
        Gui_DrawFont_GBK16(25,30,YELLOW,GRAY0,"Start check");
        while(mpu_dmp_init())Gui_DrawFont_GBK16(16,50,YELLOW,GRAY0,"MPU6050 Error");
        Gui_DrawFont_GBK16(25,50,YELLOW,GRAY0,"MPU6050 OK");
        Lcd_Clear(GRAY0);
        Gui_DrawFont_GBK16(25,30,YELLOW,GRAY0,"S3->shuju");
        Gui_DrawFont_GBK16(25,50,BLUE,GRAY0,"S4->PWM");
        while (1){
            if(keystatus!=1&&key!=2)
            key=KEY_Scan(0);    //得到键值
            if(key)
            {                           
                switch(key)
                {                 
                    case KEY0_PRES:    //
                    {    
                                    
                        Lcd_Clear(GRAY0);
                        Gui_DrawFont_GBK16(25,30,YELLOW,GRAY0,"M1:          ");
                        Gui_DrawFont_GBK16(25,50,BLUE,GRAY0,"M2:           ");
                        Gui_DrawFont_GBK16(25,70,RED,GRAY0, "M3:           ");
                        Gui_DrawFont_GBK16(25,90,BLUE,GRAY0,"M4:           ");
                        while (1)
                        {
                            key = KEY_Scan(1);
                            if (key)
                                switch(key)
                                    { 
                                    case KEY1_PRES:
                                        key_status=1;
                                        break;
                                    }
                            if(key_status==1) break;
                            //有没有更新值,有更新新的值就会继续往下执行
                            if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
                            {                                 
                                /*
                                MPU_Get_Accelerometer(&aacx,&aacy,&aacz);    //得到加速度传感器数据
                                MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);    //得到陀螺仪数据
                                */        
                            
                                
                                Pitch = PIDx_out_realize(pitch);
                                Roll = PIDy_out_realize(roll);
                                Yaw = PIDz_out_realize(yaw);
                                //Pitch +=PIDx_inner_realize(pitch);
                                //Roll +=PIDy_inner_realize(roll);
                                //Yaw +=PIDz_inner_realize(yaw);
                
                                //Motor1 = (int)(2200 - Pitch + Roll - Yaw);
                                //Motor2 = (int)(2200 + Pitch + Roll + Yaw);
                                //Motor3 = (int)(2200 + Pitch - Roll - Yaw);
                                //Motor4 = (int)(2200 - Pitch - Roll + Yaw);
                    
                                Motor1 = (int)(2500 + Pitch - Roll);
                                Motor2 = (int)(2500 + Pitch + Roll);
                                Motor3 = (int)(2500 - Pitch + Roll);
                                Motor4 = (int)(2500 - Pitch - Roll);
                                //TIM_SetCompare1(TIM3,Motor4);//         
                                //TIM_SetCompare2(TIM3,Motor1);//    
                                //TIM_SetCompare3(TIM3,Motor2);//     
                                //TIM_SetCompare4(TIM3,Motor3);//    
                                
                                if(t%1==0)
                                {
                                sprintf(temp_value2,"%4d",Motor4);
                                Gui_DrawFont_GBK16(50,30,BLUE,GRAY0,temp_value2);    
                                sprintf(temp_value2,"%4d",Motor1);
                                Gui_DrawFont_GBK16(50,50,BLUE,GRAY0,temp_value2);    
                                sprintf(temp_value2,"%4d",Motor2);
                                Gui_DrawFont_GBK16(50,70,BLUE,GRAY0,temp_value2);    
                                sprintf(temp_value2,"%4d",Motor3);
                                Gui_DrawFont_GBK16(50,90,BLUE,GRAY0,temp_value2);
                                if(report)mpu6050_send_data(pitch,roll,yaw);//用自定义帧发送加速度和陀螺仪原始数据
                                //if(report)usart1_report_imu(aacx,aacy,aacz,gyrox,gyroy,gyroz,(int)(roll*100),(int)(pitch*100),(int)(yaw*10));
                                }
                            }
                        t++;
                    }
                    key_status=0;                
                }
                
                    case KEY1_PRES:    //
                    {
                    keystatus = 0;
                    Lcd_Clear(GRAY0);
                    Gui_DrawFont_GBK16(25,50,BLUE,GRAY0,"Pitch:    .C");
                    Gui_DrawFont_GBK16(25,70,RED,GRAY0, "Roll:    .C");
                    Gui_DrawFont_GBK16(25,90,BLUE,GRAY0,"Yaw :    .C");        
                    while(1){
                    key = KEY_Scan(0);
                            if (key)
                                switch(key)
                                    { 
                                    case KEY0_PRES:
                                        key_status=1;
                                        break;
                                    }
                    if(key_status==1) break;
                    if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
                            { 
                                
                                //MPU_Get_Accelerometer(&aacx,&aacy,&aacz);    //得到加速度传感器数据
                                //MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);    //得到陀螺仪数据            
                                
                                Pitch = PIDx_out_realize(pitch);
                                Roll = PIDy_out_realize(roll);
                                Yaw = PIDz_out_realize(yaw);
                                //Pitch +=PIDx_inner_realize(pitch);
                                //Roll +=PIDy_inner_realize(roll);
                                //Yaw +=PIDz_inner_realize(yaw);
                                //Motor1 = (int)(2200 - Pitch + Roll - Yaw);
                                //Motor2 = (int)(2200 + Pitch + Roll + Yaw);
                                //Motor3 = (int)(2200 + Pitch - Roll - Yaw);
                                //Motor4 = (int)(2200 - Pitch - Roll + Yaw);
                                
                                Motor1 = (int)(2500 + Pitch - Roll);
                                Motor2 = (int)(2500 + Pitch + Roll);
                                Motor3 = (int)(2500 - Pitch + Roll);
                                Motor4 = (int)(2500 - Pitch - Roll);
                                //TIM_SetCompare1(TIM3,Motor4);//         
                                //TIM_SetCompare2(TIM3,Motor1);//    
                                //TIM_SetCompare3(TIM3,Motor2);//     
                                //TIM_SetCompare4(TIM3,Motor3);//    
                    temp=pitch;
                    if(temp<0)
                    {
                        Gui_DrawFont_GBK16(10,50,BLUE,GRAY0,"-");
                        temp=-temp;        //转为正数
                    }else Gui_DrawFont_GBK16(10,50,BLUE,GRAY0,"  ");//去掉负号 
                    sprintf(temp_value,"%.2f",temp);
                    Gui_DrawFont_GBK16(70,50,BLUE,GRAY0,temp_value);    
                    temp=roll;
                    if(temp<0)
                    {
                        Gui_DrawFont_GBK16(10,70,BLUE,GRAY0,"-");
                        temp=-temp;        //转为正数
                    }else Gui_DrawFont_GBK16(10,70,BLUE,GRAY0," ");//去掉负号 
                    sprintf(temp_value,"%.2f",temp);
                    Gui_DrawFont_GBK16(65,70,BLUE,GRAY0,temp_value);    
                    temp=yaw;
                    //z轴
                    if(temp<0)
                    {
                        Gui_DrawFont_GBK16(10,90,BLUE,GRAY0,"-");
                        temp=-temp;        //转为正数
                    }else Gui_DrawFont_GBK16(10,90,BLUE,GRAY0," ");//去掉负号 
                    sprintf(temp_value,"%.2f",temp);
                    Gui_DrawFont_GBK16(65,90,BLUE,GRAY0,temp_value);    
                    }
                    if(report)mpu6050_send_data(pitch,roll,yaw);//用自定义帧发送加速度和陀螺仪原始数据
                    //if(report)usart1_report_imu(aacx,aacy,aacz,gyrox,gyroy,gyroz,(int)(roll*100),(int)(pitch*100),(int)(yaw*10));
                }
                    key_status=0;
                    keystatus=1;
            }
                    
                    case KEY2_PRES:    //
                        break;
                    case KEY3_PRES:    //    
                        break;
                    case KEY4_PRES:    //
                        break;
                }
            }else delay_ms(10);    
        }            
    }

     

    转载于:https://www.cnblogs.com/-wenli/p/11196573.html

    展开全文
  • 随着单片机开发,调试工具就必不可少,本文就介绍匿名四轴上位机的基础知识。 提示:以下是本篇文章正文内容,下面案例可供参考 一、什么是上位机 上位机是指可以直接发出操控命令的计算机,一般是PC/host ...

     目录

    文章目录

    前言

    一、什么是上位机

    二、匿名四轴上位机

    1、功能

    2、软件的一些简单协议

    三、相关的接收发送代码

    一、接收数据

    2.发送数据

    总结





    前言

    对于单片机开发者,调试工具就必不可少,有时需要显示波形、发送文本、数据和一些复杂的数据包。例如PID参数整定,然而四轴匿名上位都有这些功能。本文就介绍匿名四轴上位机怎么显示波形和调试,以及一些接收发送代码。
     



    一、什么是上位机

    上位机是指可以直接发出操控命令的计算机,一般是PC/host computer/master computer/upper computer,屏幕上显示各种信号变化(液压,水位,温度等)。下位机是直接控制设备获取设备状况的计算机,一般是PLC/单片机single chip microcomputer/slave computer/lower computer之类的。上位机发出的命令首先给下位机,下位机再根据此命令解释成相应时序信号直接控制相应设备。下位机不时读取设备状态数据(一般为模拟量),转换成数字信号反馈给上位机。简言之如此,实际情况千差万别,但万变不离其宗:上下位机都需要编程,都有专门的开发系统。

    在概念上,控制者和提供服务者是上位机,被控制者和被服务者是下位机,也可以理解为主机和从机的关系,但上位机和下位机是可以转换的。

    二、匿名四轴上位机

    1、功能

    这个上位机可以基本收发(类似于串口调试助手)、高级收发收码(实现比较复杂的自定义接收和发送)、同时显示20条波形图(用于调试pid等)、调试无人机可以监视无人机的各个状态以及调试pid。

    四轴匿名上位机下载链接:

    http://链接:https://pan.baidu.com/s/1l6kT-LQCMQRySXpp2lrh7w 提取码:c5lq

    2、软件的一些简单协议

      一:基本收发
    1:收码和发码格式均可设为HEX或者CHR。
    2:定时发送功能可以精确到毫秒,但是不能太快(发送为独占式,数据不发送完函数不会返回),如果上一帧
          数据还没发送完毕就发送下一帧数据会出错。
    3:请使用ft232串口芯片或支持高波特率的芯片,否则波特率无法设置过高。

        二:高级收码
    1:收码显示为HEX格式。
    2:下位机发送自定义数据,格式为:0x88+FUN+LEN+DATA+SUM
          FUN可以是 0xA1到0xAA,共10个;LEN为DATA的长度(不包括0x88、FUN、LEN、SUM)。
          SUM是0x88一直到DATA最后一字节的和,uint8格式。
        (记得打开需要使用帧的开关,更改设置后点击保存设置使设置生效)
    3:数据可以是uint8、int16、uint16、int32、float这几个常用格式,多字节数据高位在前。
    4:共有20个数据存储器,每个存储器的数据可以分别设置为来自10个自定义帧的30个数据。
    5:高速通讯时(2ms一帧数据或者更快),请关闭高级收码页面的数据显示按钮和基本收码,否则更新过快有可
          能会造成程序卡死。
    6:飞控显示对应的帧FUN为0xAF,(帧格式:0x88+0xAF+0x1C+ACC DATA+GYRO DATA+MAG DATA+ANGLE DATA
          + 0x00 0x00 + 0x00 0x00+SUM,共32字节,ACC/GYRO/MAG/ANGLE(roll/pitch/yaw)数据为int16格式,其
          中ANGLE的roll和pitch数据为实际值乘以100以后得到的整数值,yaw为乘以10以后得到的整数值,
          上位机在显示时再 除以100和10)。
    7:遥控,电机pwm,电压显示对应的帧FUN为0xAE,(帧格式:0x88+0xAE+0x12+THROT YAW ROLL PITCH 
          +AUX1 2 3 4 5 + PWM:1 2 3 4 + VOTAGE + SUM,共28字节),数据为uint16格式,遥控数据最小在1000左右,
          最大在2000左右。数据都为uint16格式,其中pwm范围1-100,votage为实际值*100。
          小技巧:如果高速通讯时是为了画波形,就只开波形显示,并只保留需要观察的波形,如果是为了观察数
          据,就关闭波形显示,只保留收码显示,这样可以加快程序响应速度。
    7:最快通讯速度测试过下位机用500K波特率,每1ms发送32字节的数据,上位机显示其中6条波形,OK!
        (有可能和电脑配置有关)

        三:波形显示
    1:共有20条波形,对应20个数据存储器。
    2:双击波形绘制区域,可以打开波形显示开关。
    3:按住Ctrl用鼠标左键点击某一条波形,可以显示数据标签,再次点击隐藏。
    4:按住鼠标左键,在绘图区域从一点向右下方拖动,然后松开,可以放大显示框住的波形区域,可以多次放
          大;
    5:按住鼠标左键,在绘图区域从一点向左上方拖动,然后松开,可以将放大后的波形还原。
    6:按住鼠标右键,在绘图区域上下左右拖动,可以移动波形。
    7:显示波形时按F9键,可以打开波形高级设置。

        四:DEBUG功能
    1:在调试过程中可以将某些标志位、寄存器、变量实时发回上位机,并在DEBUG页面显示。
    2:通讯格式为:0x88 + 0xAD + len + num + DATA + SUM,  len为num与DATA的总长度,num表示要改变哪个显示
          状态,例如num=0x01即是要改变第一个LED,num=0x07即是改变第一个数字输出显示。当要改变LED时,
          DATA只需一字节,DATA=0x00表示关闭LED,大于0x00表示点亮LED;当要改变数字输出时,DATA需要两字
    节,
          表示 一个uint16数字,高字节在前。SUM为从0x88开始到SUM前一字节的和校验,uint8格式。
          例如:发送 0x88 + 0xAD + 0x02 + 0x01 + 0x01 + 0x39    表示点亮第一个LED
                      发送 0x88 + 0xAD + 0x03 + 0x07 + 0x00 + 0x05 + 0x44   表示在第一个数字输出位置显示 5 。

        五:键鼠控制
    1:控制数据发送格式为:0x8A + 0x8A + 0X1C + THROT YAW ROLL PITCH AUX1 AUX2 AUX3 AUX4 AUX5 + 0x00 0x00 
          0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + SUM,遥控数据都为int16格式,中值1500,最小最大值为1000、
          2000。
    2:发送频率 50Hz。
    3:鼠标上下控制油门,左右控制YAW,键盘的WASD控制ROLL/PITCH,键盘12345控制AUX12345。共9通道。

        六:飞控参数
    1:点击3D模型显示右下方的校正按钮,上位机会发送0X8A 0X8B 0X1C 0XAA 0XA3 +无用数据+SUM给下位机,
          其中0X8B表示飞控参数,0XAA表示零偏,0XA3表示ACC GYRO都要校正。
    2:点击飞控参数界面传感器矫正功能里面的校正按钮,分别表示ACC 和GYRO的校正,不会同时校正两个传感
    器,
          上位机校正ACC发送格式为:0X8A 0X8B 0X1C 0XAA 0XA1+无用数据+SUM
          上位机校正GYRO发送格式为:0X8A 0X8B 0X1C 0XAA 0XA2+无用数据+SUM(送有数据整个长度都为32字节)
    3:上位机发送微调后的offset数据(仅为ACC的 X 和 Y ),格式为0X8A 0X8B 0X1C 0XAB + offset.x + offset.y
          +无用数据 +SUM,数据为int16格式。
    4:上位机发送读offset的命令格式为:0X8A 0X8B 0X1C 0XAC + 无用数据 + SUM
    5:上位机发送读PID数据的命令为:0X8A 0X8B 0X1C 0XAD + 无用数据 + SUM
    6:下位机发送offset数据给上位机的格式为:0X88 0XAC 0X1C 0XAC + 传感器零偏数据ACC XYZ GYRO XYZ
          +无用数据+SUM,共六个int16型数据。
    7:下位机发送PID数据给上位机的格式为:0X88 0XAC 0X1C 0XAD + PID数据 + 无用数据 + SUM
          PID数据为rol_p,rol_i,rol_d,pit_p..i..d,yaw_p,,i,,d,共9个uint16型数据。
    8:上位机发送PID数据给下位机的格式为:0X8A 0X8B 0X1C 0XAE +PID数据+ 无用数据 + SUM
          PID数据格式和下位机发送给上位机的格式一样。
    9:点击飞控解锁按钮,上位机会发送0X8A 0X8B 0X1C 0XA1+无用数据+SUM给下位机,如果下位机已经解锁,
          点击此按钮会发送0X8A 0X8B 0X1C 0XA0+无用数据+SUM给下位机,锁定飞控。

    三、相关的接收发送代码



    一、接收数据

    1.接收数据流

    若接收到的数据包是按协议发送的,则将数据存入RX_upcomputer数组中。

    //数据的接收
    #define E_START                    0   //准备成功
    #define E_OK                       1   //成功
    #define E_FRAME_HEADER_ERROR       2   //帧头错误
    #define E_FRAME_RTAIL_ERROR        3   //帧尾错误
    #define LINE_LIN_up                   32  //数据长度
    uint8_t uart_flag_up;                     //接收标志
    
    vu8 RX_upcomputer[33];
    void get_upcomputer_data(uint8_t data)
    {
    	static uint8_t uart_num=0;
    	vu8 sum=0;
        vu8 i=0;
        RX_upcomputer[uart_num++]=data;
        if(1==uart_num)
        {
            //接收到的第一个字节不为0X8A,帧头错误
            if(0X8A!=RX_upcomputer[0])
            {
                uart_num=0;
                uart_flag_up=E_FRAME_HEADER_ERROR;
            }
        }
    		if(2==uart_num)
        {
            //接收到的第二个字节不为0x8B,帧头错误
            if(0X8B!=RX_upcomputer[1])
            {
                uart_num=0;
                uart_flag_up=E_FRAME_HEADER_ERROR;
            }
        }
    		if(3==uart_num)
        {
            //接收到的第三个字节不为0X1C,帧头错误
            if(0X1C!=RX_upcomputer[2])
            {
                uart_num=0;
                uart_flag_up=E_FRAME_HEADER_ERROR;
            }
        }
    		
        if(LINE_LIN_up==uart_num)
        {
            uart_flag_up=E_OK;
            //接收到的最后一个字节为校验位
    			for(i=0;i<LINE_LIN_up-1;i++)
    			sum += RX_upcomputer[i];        //校验位
    
            if(sum==RX_upcomputer[LINE_LIN_up-1])
                uart_flag_up=E_OK;
            else                                //接收的最后一个字节校验位错误,帧尾错误
                uart_flag_up=E_FRAME_RTAIL_ERROR;
            uart_num=0;
        }
    	
    }

    2.解析数据

    解析存在 RX_upcomputer数组中的数据。

    extern float Out_XP,Out_XI,Out_XD,In_XP,In_XI,In_XD,Out_YP,Out_YI,Out_YD,In_YP,In_YI,In_YD,ZP,ZI,ZD;
    extern float out_zp;
    //解析上位机发送的pid数据
    void upcomputer_receive1(void)
    {
    	
    	In_XP=((int)RX_upcomputer[4]<<8)|RX_upcomputer[5];
    	In_XP=In_XP/100;
    	In_XI=((int)RX_upcomputer[6]<<8)|RX_upcomputer[7];
    	In_XI=In_XI/100;
    	In_XD=((int)RX_upcomputer[8]<<8)|RX_upcomputer[9];
    	In_XD=In_XD/100;
    	out_zp=((int)RX_upcomputer[10]<<8)|RX_upcomputer[11];
    	out_zp=out_zp/100;
    	In_YI=((int)RX_upcomputer[12]<<8)|RX_upcomputer[13];
    	In_YI=In_YI/100;
    	In_YD=((int)RX_upcomputer[14]<<8)|RX_upcomputer[15];
    	In_YD=In_YD/100;
    	ZP=((int)RX_upcomputer[16]<<8)|RX_upcomputer[17];
    	ZP=ZP/100;
    	ZI=((int)RX_upcomputer[18]<<8)|RX_upcomputer[19];
    	ZI=ZI/100;
    	ZD=((int)RX_upcomputer[20]<<8)|RX_upcomputer[21];
    	ZD=ZD/100;
    }
    
    
    //解析上位机微调后的offset
    int offset_x,offset_y;
    void upcomputer_receive2(void)
    {
    	offset_x=((int)RX_upcomputer[4]<<8)|RX_upcomputer[5];
    	
    	offset_y=((int)RX_upcomputer[6]<<8)|RX_upcomputer[7];
    	
    }



    2.发送数据

    void usart1_SendByte(u8 data)
    {
        /* 发送字节数据到UART */
        USART_SendData(USART1,data);
    
        /*等待发送寄存器为空 */
        while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
    }
    
    /****************** 发送八位数组************************/
    void usart1_SendArray(vu8 *array, uint16_t num)
    {
        vu8 i;
    
      for(i=0; i<num; i++)
      {
            /* ·发送一个字节数据到USART */
         usart1_SendByte(array[i]);
      }
        /* 等待发送完成 */
      while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
    }
    
    
    vu8 testdatatosend[50];
    /*波形显示函数*/
    void Test_Send_User(uint16_t data1, uint16_t data2, uint16_t data3,uint16_t data4,uint16_t data5,uint16_t data6,uint16_t data7,uint16_t data8,uint16_t data9,uint16_t data10)
    {
        vu8 _cnt=0;
        vu8 sum=0;
        vu8 i=0;
    
        testdatatosend[_cnt++]=0x88;
        testdatatosend[_cnt++]=0xA1;
        testdatatosend[_cnt++]=0;
    
        testdatatosend[_cnt++]=data1>>8;     
        testdatatosend[_cnt++]=data1&0xff;   
    
        testdatatosend[_cnt++]=data2>>8;
        testdatatosend[_cnt++]=data2&0xff;
    
        testdatatosend[_cnt++]=data3>>8;
        testdatatosend[_cnt++]=data3&0xff;
    
        testdatatosend[_cnt++]=data4>>8;
        testdatatosend[_cnt++]=data4&0xff;
    
        testdatatosend[_cnt++]=data5>>8;
        testdatatosend[_cnt++]=data5&0xff;
    
        testdatatosend[_cnt++]=data6>>8;
        testdatatosend[_cnt++]=data6&0xff;
    
        testdatatosend[_cnt++]=data7>>8;
        testdatatosend[_cnt++]=data7&0xff;
    
        testdatatosend[_cnt++]=data8>>8;
        testdatatosend[_cnt++]=data8&0xff;
    
        testdatatosend[_cnt++]=data9>>8;
        testdatatosend[_cnt++]=data9&0xff;
    
        testdatatosend[_cnt++]=data10>>8;
        testdatatosend[_cnt++]=data10&0xff;
    
    
    
        testdatatosend[2] = _cnt-3;
    
        for(i=0;i<_cnt;i++)
            sum += testdatatosend[i];
    
        testdatatosend[_cnt++]=sum;
    
        usart1_SendArray(testdatatosend,_cnt);
    }
    
    
    
    
    
    /*****************************************************************************************
    *下面的函数主要用于无人机调试,也可用于其他pid调试
    *
    ***************************************************************************************/
    
    /*发送陀螺仪数据给上位机*/
    void Test_Send_User1(int16_t acc_x_,int16_t acc_y_,int16_t acc_z_,int16_t gyro_x_,int16_t gyro_y_,int16_t gyro_z_,int16_t roll_,int16_t pitch_,int16_t yaw_)
    {
    	 vu8 _cnt=0;
        vu8 sum=0;
        vu8 i=0;
    
        testdatatosend[_cnt++]=0x88;
        testdatatosend[_cnt++]=0xAF;
        testdatatosend[_cnt++]=0x1C;
    
        testdatatosend[_cnt++]=acc_x_>>8;     //
        testdatatosend[_cnt++]=acc_x_&0xff;   //
    
        testdatatosend[_cnt++]=acc_y_>>8;
        testdatatosend[_cnt++]=acc_y_&0xff;
    
        testdatatosend[_cnt++]=acc_z_>>8;
        testdatatosend[_cnt++]=acc_z_&0xff;
    
        testdatatosend[_cnt++]=gyro_x_>>8;
        testdatatosend[_cnt++]=gyro_x_&0xff;
    
        testdatatosend[_cnt++]=gyro_y_>>8;
        testdatatosend[_cnt++]=gyro_y_&0xff;
    
        testdatatosend[_cnt++]=gyro_z_>>8;
        testdatatosend[_cnt++]=gyro_z_&0xff;
    		
    		testdatatosend[_cnt++]=0;
    		testdatatosend[_cnt++]=0;
    		
    		testdatatosend[_cnt++]=0;
    		testdatatosend[_cnt++]=0;
    		
    		testdatatosend[_cnt++]=0;
    		testdatatosend[_cnt++]=0;
    
        testdatatosend[_cnt++]=roll_>>8;
        testdatatosend[_cnt++]=roll_&0xff;
    
        testdatatosend[_cnt++]=pitch_>>8;
        testdatatosend[_cnt++]=pitch_&0xff;
    
        testdatatosend[_cnt++]=yaw_>>8;
        testdatatosend[_cnt++]=yaw_&0xff;
    
        testdatatosend[_cnt++]=0x00;
        testdatatosend[_cnt++]=0x00;
    		testdatatosend[_cnt++]=0x00;
        testdatatosend[_cnt++]=0x00;
    
        testdatatosend[2] = _cnt-3;
    
        for(i=0;i<_cnt;i++)
            sum += testdatatosend[i];
    
        testdatatosend[_cnt++]=sum;
    
        usart1_SendArray(testdatatosend,_cnt);
    	
    }
    
    
    
    
    /*发送电机pwm和飞控电池电压给上位机*/
    void Test_Send_User2(uint16_t throt,uint16_t yaw_2,uint16_t roll_2,uint16_t pitch_2,uint16_t aux_1,uint16_t aux_2,uint16_t aux_3,uint16_t aux_4,uint16_t aux_5,uint16_t pwm1,uint16_t pwm2,uint16_t pwm3,uint16_t pwm4,uint16_t votage)
    {
    	
    	vu8 _cnt=0;
        vu8 sum=0;
        vu8 i=0;
    
        testdatatosend[_cnt++]=0x88;
        testdatatosend[_cnt++]=0xAE;
        testdatatosend[_cnt++]=0x12;
    	
    	  testdatatosend[_cnt++]=throt>>8;
        testdatatosend[_cnt++]=throt&0xff;
    
        testdatatosend[_cnt++]=yaw_2>>8;     //
        testdatatosend[_cnt++]=yaw_2&0xff;   //
    
        testdatatosend[_cnt++]=roll_2>>8;
        testdatatosend[_cnt++]=roll_2&0xff;
    
        testdatatosend[_cnt++]=pitch_2>>8;
        testdatatosend[_cnt++]=pitch_2&0xff;
    
        testdatatosend[_cnt++]=aux_1>>8;
        testdatatosend[_cnt++]=aux_1&0xff;
    
        testdatatosend[_cnt++]=aux_2>>8;
        testdatatosend[_cnt++]=aux_2&0xff;
    
        testdatatosend[_cnt++]=aux_3>>8;
        testdatatosend[_cnt++]=aux_3&0xff;
    
        testdatatosend[_cnt++]=aux_4>>8;
        testdatatosend[_cnt++]=aux_4&0xff;
    
        testdatatosend[_cnt++]=aux_5>>8;
        testdatatosend[_cnt++]=aux_5&0xff;
    
        testdatatosend[_cnt++]=pwm1>>8;
    		testdatatosend[_cnt++]=pwm1&0xff;
    
        testdatatosend[_cnt++]=pwm2>>8;
    		testdatatosend[_cnt++]=pwm2&0xff;
    		
        testdatatosend[_cnt++]=pwm3>>8;
    		testdatatosend[_cnt++]=pwm3&0xff;
    
        testdatatosend[_cnt++]=pwm4>>8;
    		testdatatosend[_cnt++]=pwm4&0xff;
    		
    		testdatatosend[_cnt++]=votage>>8;
        testdatatosend[_cnt++]=votage&0xff;
    
        testdatatosend[2] = _cnt-3;
    
        for(i=0;i<_cnt;i++)
            sum += testdatatosend[i];
    
        testdatatosend[_cnt++]=sum;
    
        usart1_SendArray(testdatatosend,_cnt);
    	
    }
    
    
    
    /*发送OFFSET给上位机*/
    void Test_Send_User3(int16_t acc_x_3,int16_t acc_y_3,int16_t acc_z_3,int16_t gyro_x_3,int16_t gyro_y_3,int16_t gyro_z_3)
    {
    	vu8 _cnt=0;
        vu8 sum=0;
        vu8 i=0;
    
        testdatatosend[_cnt++]=0x88;
        testdatatosend[_cnt++]=0xAC;
        testdatatosend[_cnt++]=0x1C;
    	  testdatatosend[_cnt++]=0xAC;
    	
    	  testdatatosend[_cnt++]=acc_x_3>>8;
        testdatatosend[_cnt++]=acc_x_3&0xff;
    
        testdatatosend[_cnt++]=acc_y_3>>8;     //
        testdatatosend[_cnt++]=acc_y_3&0xff;   //
    
        testdatatosend[_cnt++]=acc_z_3>>8;
        testdatatosend[_cnt++]=acc_z_3&0xff;
    
        testdatatosend[_cnt++]=gyro_x_3>>8;
        testdatatosend[_cnt++]=gyro_x_3&0xff;
    
        testdatatosend[_cnt++]=gyro_y_3>>8;
        testdatatosend[_cnt++]=gyro_y_3&0xff;
    
        testdatatosend[_cnt++]=gyro_z_3>>8;
        testdatatosend[_cnt++]=gyro_z_3&0xff;
    
        //testdatatosend[2] = _cnt-3;
    
        for(i=0;i<_cnt;i++)
            sum += testdatatosend[i];
    
        testdatatosend[31]=sum;
    
        usart1_SendArray(testdatatosend,32);
    	
    	
    }
    
    
    //给上位机发送PID参数*/
    void Test_Send_User4(uint16_t rol_p,uint16_t rol_i,uint16_t rol_d,uint16_t pit_p,uint16_t pit_i,uint16_t pit_d,uint16_t yaw_p,uint16_t yaw_i,uint16_t yaw_d)
    {
    	vu8 _cnt=0;
        vu8 sum=0;
        vu8 i=0;
    
        testdatatosend[_cnt++]=0x88;
        testdatatosend[_cnt++]=0xAC;
        testdatatosend[_cnt++]=0x1C;
    	  testdatatosend[_cnt++]=0xAD;
    	
    	  testdatatosend[_cnt++]=rol_p>>8;
        testdatatosend[_cnt++]=rol_p&0xff;
    
        testdatatosend[_cnt++]=rol_i>>8;     //
        testdatatosend[_cnt++]=rol_i&0xff;   //
    
        testdatatosend[_cnt++]=rol_d>>8;
        testdatatosend[_cnt++]=rol_d&0xff;
    
        testdatatosend[_cnt++]=pit_p>>8;
        testdatatosend[_cnt++]=pit_p&0xff;
    
        testdatatosend[_cnt++]=pit_i>>8;
        testdatatosend[_cnt++]=pit_i&0xff;
    
        testdatatosend[_cnt++]=pit_d>>8;
        testdatatosend[_cnt++]=pit_d&0xff;
    
        testdatatosend[_cnt++]=yaw_p>>8;
        testdatatosend[_cnt++]=yaw_p&0xff;
    
        testdatatosend[_cnt++]=yaw_i>>8;
        testdatatosend[_cnt++]=yaw_i&0xff;
    
        testdatatosend[_cnt++]=yaw_d>>8;
        testdatatosend[_cnt++]=yaw_d&0xff;
    
       // testdatatosend[2] = _cnt-3;
    
        for(i=0;i<_cnt;i++)
            sum += testdatatosend[i];
    
        testdatatosend[31]=sum;
    
        usart1_SendArray(testdatatosend,32);
    	
    	
    }
    
    



    总结

    以上就是今天讲的内容,四轴匿名上位机的使用、协议和一些接收发送代码。

    这是我的学习总结,若有不当之处,欢迎指出。

    展开全文
  • 对于匿名四轴上位机,我相信玩四轴的小伙伴们应该不会陌生。个人觉得,这款软件最为强大的部分便是拿来调试pid,从观察波形到在线调参简直一气呵成,极为便利。 但是,我们也经常会碰到其他系统的pid调节,这时候,...

    对于匿名四轴上位机,我相信玩四轴的小伙伴们应该不会陌生。个人觉得,这款软件最为强大的部分便是拿来调试pid,从观察波形在线调参简直一气呵成,极为便利。
    但是,我们也经常会碰到其他系统的pid调节,这时候,把匿名上位机变成一款普遍适用的pid参数调试软件就很有必要了。
    本文利用匿名上位机的高级收码功能,接收stm32获取的ds18b20温度传感器的数据,并绘制其曲线

    1. 数据格式

    保证上位机与STM32能够正常通信,必须采用规定的格式来发送数据,总结一下,就是:帧头+功能字+长度+数据+校验。匿名提供了一些特殊的功能字用于飞控数据的传输。我们这里采用高级收码。帧头是AAAA,功能字是F1到FA,也就是说最多可以接受十个用户自定义的数据类型。

    几点说明
    ▲SUM等于从该数据帧第一字节开始,也就是帧头开始,至该帧数据的最后一字节所有字节的和,只保留低八位,高位舍去。
    ▲协议中长度字节LEN表示该数据帧内包含数据的字节总长度,不包括帧头、功能字、长度字节和最后的校验位,只是数据的字节长度和。比如该帧数据内容为3个int16型数据,那么LEN等于6

    上位机高级收码设置界面
    

    在这里插入图片描述

    2. 代码实现

    • 数据发送至串口
    /*Send_Data函数是协议中所有发送数据功能使用到的发送函数*/
    //移植时,用户应根据自身应用的情况,根据使用的通信方式,实现此函数,这里就采用有线连接,发送至串口2了
    void ANO_DT_Send_Data(uint8_t *dataToSend , uint8_t length)
    {
    	Usart_Send(dataToSend, length);
    }
    /
    void Usart_Send(uint8_t *data, uint8_t length)
    {
    	uint8_t  i;
    	for(i=0;i<length;i++) 
    	{
    	 USART_SendData(USART1, *(data+i));
    	 while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
    	 {}
    	}
    }
    

    值得说明的一个问题是,使用USART_SendData()函数非连续发送单个字符是没有问题的;当连续发送字符时(两个字符间没有延时),就会发现发送缓冲区有溢出现象。若发送的数据量很小时,此时串口发送的只是最后一个字符,当发送数据量大时,就会导致发送的数据莫名其妙的丢失。
    所以,在这里我们在每一个字符发送后检测状态位。

    USART_SendData(USART1, RxBuffer[TxCounter]);
    
    while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET){} //等待发送缓冲区空才能发送下一个字符
    
    • 处理发送数据请求
      结合定时器,设置各个数据发送标志位,可以定期发送各种数据到上位机。这里为了简单,只发送DS18B20读取的温度数据了。
    //Data_Exchange函数处理各种数据发送请求,比如想实现每5ms发送一次传感器数据至上位机,即在此函数内实现
    //此函数每1ms调用一次
    void ANO_DT_Data_Exchange(void)
    {
    	static uint8_t cnt 	= 0;
    	cnt++;
    	if(cnt>=10)//10MS
    	{
    		cnt = 0;
    		send_flag = 1;
    	}	
    /
    	if(send_flag)
    	{
    		send_flag = 0;
    	  ANO_DT_Send_temperature(temperature);
    	}	
    }
    
    • 将数据按照格式发送
    void ANO_DT_Send_temperature(short temperature)
    {
      u8 _cnt=0,sum = 0,i;
    	short _temp;
    	data_to_send[_cnt++]=0xAA;
    	data_to_send[_cnt++]=0xAA;
    	data_to_send[_cnt++]=0xF1; //自定义帧1
    	data_to_send[_cnt++]=0;
    
    	_temp=temperature;
    	data_to_send[_cnt++]=BYTE1(_temp);
    	data_to_send[_cnt++]=BYTE0(_temp);//数据部分
    	
    	data_to_send[3] = _cnt-4;//长度位
    	
    	for(i=0;i<_cnt;i++)
    		sum += data_to_send[i];
    	
    	data_to_send[_cnt++]=sum;//校验位
    	
    	ANO_DT_Send_Data(data_to_send, _cnt);
    }
    
    • 上位机界面
      温度数据被放大了10倍
      上位机界面
    展开全文
  • 匿名四轴上位机使用简介

    千次阅读 2017-08-05 15:33:00
    匿名四轴上位机可以通过串口上传数据,画出波形图,这个功能在调试pid的时候还是很有用的,主要就讲如何使用这个功能 有个视频说的很详细http://v.youku.com/v_show/id_XNTkzNDkxNTU2.html 1、设置好串口,如下 ...

    匿名四轴上位机可以通过串口上传数据,画出波形图,这个功能在调试pid的时候还是很有用的,主要就讲如何使用这个功能

    有个视频说的很详细 http://v.youku.com/v_show/id_XNTkzNDkxNTU2.html

    1、设置好串口,如下

    在基本功能里可以发送接收,当成普通的串口调试助手来使用,设置完了点击下面的打开串口即可

     

    2、设置帧格式

    在左边高级收码中,右上角有帧格式的设置,如下

    1-10的选择根据代码里fun的值来,对应0xA1-0xAA,这里我使用的是oxA2 故选择2

    后面为代码对应帧里上传的数据格式的选择,我上传的是三个float型,所以只需要把前三个都选择为float就行了

    最后打开上图的 开关,显示  保存设置帧格式设置完毕

    3、画波形所需的数据设置,如下

    最上面的1-20序号对应后面会提到的波形序号,也就是说最多能指定显示20个波形

    下面设置的每个序号对应波形的数据来源,从某个帧的某个位获得。

    数据帧即之前设置过的,由于我上传使用的是0xA2 所以选择2,数据位即之前设置的三个float型的选择,可以看到最多有30个数据位,与之前类型选择的个数一样

    我选择数据位1(之前三个float 我串口上传的分别是pitch roll  yaw角度),这样我们就把待会的波形1的数据来源设置为帧2的第一位,也就是pitch角了

    同理  把 roll yaw 即帧2的位2和3 设置为波形序号2,3  设置结束 打开旁边的数据校验 数据显示  功能帧显示,再打开下面的

     

    就可以看到上传的原始数据(左边)和相应的处理后的数据(右边)

    此时调到波形显示界面,打开波形显示 勾选刚才设置过的序号123 可以看到pitch roll yaw角的曲线

     

     最后讲讲单片机上传数据的代码部分,上传的数据需要按照上位机规定的格式来上传,在上位机打开时  按F12可以看到使用说明,里面有讲格式的规定,以下为上传三个角度的代码,串口初始化等略过

     

    void usart1_send_char(u8 c)
    {
    	while((USART1->SR&0X40)==0);//等待上一次发送完毕   
    	USART1->DR=c;   	
    } 
    
    //fun:功能字. 0XA0~0XAF
    //data:数据缓存区,最多28字节!!
    //len:data区有效数据个数
    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[i];			//复制数据
    	for(i=0;i<len+3;i++)send_buf[len+3]+=send_buf[i];	//计算校验和	
    	for(i=0;i<len+4;i++)usart1_send_char(send_buf[i]);	//发送数据到串口1 
    }
    
    void mpu6050_send_data(float pitch,float roll,float yaw)
    {
    	u8 tbuf[16]; 
    	unsigned char *p;
    	p=(unsigned char *)&pitch;
    	tbuf[0]=(unsigned char)(*(p+3));
    	tbuf[1]=(unsigned char)(*(p+2));
    	tbuf[2]=(unsigned char)(*(p+1));
    	tbuf[3]=(unsigned char)(*(p+0));
    	
    	p=(unsigned char *)&roll;
    	tbuf[4]=(unsigned char)(*(p+3));
    	tbuf[5]=(unsigned char)(*(p+2));
    	tbuf[6]=(unsigned char)(*(p+1));
    	tbuf[7]=(unsigned char)(*(p+0));
    	
    	p=(unsigned char *)&yaw;
    	tbuf[8]=(unsigned char)(*(p+3));
    	tbuf[9]=(unsigned char)(*(p+2));
    	tbuf[10]=(unsigned char)(*(p+1));
    	tbuf[11]=(unsigned char)(*(p+0));
    	
    	usart1_niming_report(0XA2,tbuf,12);//自定义帧,0XA2
    }	
    

     稍微提一下最后一个函数,就是把float拆成四个字节发送(由于串口只能一个字节一个字节的发送),用指针获得float型变量的首地址,然后强制转换为unsigned char型,地址逐渐加大把float的四个字节分别发出即可。

     

    转载于:https://www.cnblogs.com/otaganyuki/p/7290395.html

    展开全文
  • #include "sys.h" #include "usart.h" #include "delay.h" #include "mpu6050.h" #include "inv_mpu.h" #include "inv_mpu_dmp_motion_driver.h" ...//MPU6050六传感器 实验 -库函数版本 /...
  • 利用STC15W4K32S4单片机读取MPU6050原始数据,及简单姿态融合。并与匿名四轴上位机通讯
  • JZ18-4A 四轴联动可编程控制器, 集成了PLC 与运动控制器双重功能, 顺序执行 的编写方式,所见即所得,编程方便简易。本身控制器采用高性能 32 位 CPU,可四轴直 线插补和两轴圆弧插补,涵盖基本的运动控制及 PLC ...
  • 匿名四轴上位机使用方法
  • ANO_Tech匿名四轴上位机_V2.6.exe.zip
  • extern float ...//Yaw角度 float ZGyroModuleAngleMAX; float ZGyroModuleAngleMIN; extern float yawRealAngle; extern uint8_t GYRO_RESETED; extern float pitchRealAngle;//Pitch角度 extern float
  • 代码基于stm32f103c8t6,通过串口将数据发送到匿名上位机,并将数据波形显示出来,方便调试参数。
  • 手机APP是由匿名四轴遥控器修改而来,在原有基础上添加了双摇杆控制和单摇杆控制 数据通过UDP和ESP8266通信 协议可修改 安卓app源码:https://github.com/Kevincoooool/KSTC_V1 ESP8266 串口通信固件源码:...
  • 匿名上位机V6.5版本,2018年11月3日发布 匿名上位机V7.0版本,2020年2月22日发布 最新上位机使用教程:https://www.bilibili.com/video/av90875255/

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,022
精华内容 408
关键字:

四轴上位机