匿名上位机V7波形显示教程

1. 下位机程序

1.1 协议文档分析

匿名科创在V7版本的协议文档上给出了很详细的范例,所以下位机程序非常好写,笔者是第一次写匿名上位机的下位机程序。以STM32发送一个无符号16位的数据为例讲解下位机程序的书写。

1.1.1 官方协议文档

1.1.1.1 查找方法

  • 打开上位机,把鼠标慢慢移动到左侧的边框处,等待一会会弹出左侧菜单栏
    在这里插入图片描述
  • 点击弹出的菜单栏中的帮助信息子菜单
    在这里插入图片描述
  • 点击通信协议
    在这里插入图片描述
  • 自动使用pdf阅读器打开文件名为ANO_XIEYI.pdf的文档(如果电脑没有显示pdf阅读器,不知道是否能显示)
    在这里插入图片描述

1.1.1.2 下位机协议分析

1.1.1.2.1 协议总框架
下位机协议由7部分组成,如下图所示,帧头(0xAA)、目标地址、功能码、数据长度、数据内容、和校验、附加校验。
在这里插入图片描述

各个部分详细解释:

  • 帧头: 每个数据包都得有帧头,其功能在于鉴别数据包的开始。
  • 目标地址:因为匿名通信协议是用于匿名科创的所有产品的通信,所以把数据不止发送给上位机,还有可能发送给其他的设备。所以需要该字段用于鉴别把数据发送给哪个设备。具体的地址在文档有介绍
    在这里插入图片描述
  • 功能码:表征该数据帧的功能,每个数据帧的功能有很多,用功能码作为数据的别称。
    常见功能码有如下:
功能码数据名称
0x00数据校验帧
0x01惯性传感器数据
0x02罗盘、气压、温度传感器数据
0x03飞控姿态:欧拉角格式
0x04飞控姿态:四元数格式
0x05高度数据
0x06飞控运行模式

… 等等数据

  • 数据长度: 以字节作为单位,表示有效数据的长度(不包含帧头、目标地址、功能码、数据长度、和校验、附加校验)
  • 数据内容:采用小端模式,低字节在前,高字节在后,一个单元为一个字节。
  • 和校验:从帧头0xAA字节开始,一直到DATA区结束,对每一字节进行累加操作,只取低8位
  • 附加校验:计算和校验时,每进行一字节的加法运算,同时进行一次SUM CHECK的累加操作,只取低8位。
    校验程序示例:
U8 sumcheck = 0; 
U8 addcheck = 0; 
For(u8 i=0; I < (data_buf[3]+4); i++) 
{ 
  sumcheck += data_buf[i];   //从帧头开始,对每一字节进行求和,直到DATA区结束 
  addcheck += sumcheck;    //每一字节的求和操作,进行一次sumcheck的累加 
} 
//如果计算出的sumcheck和addcheck和接收到的check数据相等,代表校验通过,反之数据有误 
if(sumcheck == data_buf[data_buf[3]+4] && addcheck == data_buf[data_buf[3]+5]) 
  return true;    //校验通过 
else 
  return false; //校验失败

1.1.1.2.2 用户自定义数据协议分析
文档页面: 6~7
1.1.1.2.2.1 示例介绍
灵活格式帧,我们也可以叫做用户自定义帧,也就是用户可以自己定义数据内容格式的数据帧。可能从名字无法很好的理解灵活格式帧有什么用,那么我们举一个简单的例子。
加入我在调试一个自己写的滤波算法,传感器原始数据A,为int16 格式,使用滤波算法对A进行滤波后,得到滤波后数据B,B也是int16 格式。滤波后数据经过控制算法,输出一个控制量C,C是int32 格式。那我需要对滤波算法和控制算法进行调试,肯定是需要得到ABC三个数据的波形,根据波形进行数据分析。 那么如何将数据ABC发送至上位机进行显示呢,就要用到灵活格式帧了。灵活格式帧共10帧,帧ID 从0xF1到0xFA,每一帧最多可以携带10个数据,每一个数据可以分别设置为U8、S16、U16、S32的格式。如果您需要显示float型数据,可以根据数据范围以及精度要求,乘以1000或者100变成S32型整数进行传输。
1.1.1.2.2.2 上位机配置

  • 点击左侧菜单栏中的协议通信,出现下图软件区域
    在这里插入图片描述

  • 点击右侧的边框
    在这里插入图片描述
    弹出了数据配置窗口
    在这里插入图片描述

  • 选中F1右侧的选择框,然后点击F1左侧的加号框
    在这里插入图片描述

  • 按照下图配置前三个数据的类型,这个类型是示例中的三个数据类型
    在这里插入图片描述

  • 我们配置数据容器。数据容器设置,什么是数据容器呢,就是刚才F1数据帧进行解析后,会解析出最多30个数据,那么用哪个数据进行波形显示,或者excel保存哪个数据呢,这就要数据容器了。匿名上位机设置有10个数据容器,对应本区域1到10选项卡。我们可以把数据容器想象成10个卡车,只有卡车能将数据传输到用户,那么这10辆卡车将哪个数据传输给用户呢,就是这数据容器配置区域进行配置了。
    具体配置如下图:
    在这里插入图片描述
    到此,上位机的配置完成,只需要单片机按照如下协议格式将数据发送至上位机,即可观察到对应的数据值
    开始刷新,并可绘制对应数据波形。

1.1.1.2.2.3 下位机数据格式
数据按照下图的格式:
在这里插入图片描述
DATA区域内容:
举例说明DATA区域格式,例如上文,需要发送ABC三个数据,AB为int16 型,C为int32 型,那么ABC三个数据共2+2+4=8字节,那么LEN字节为8,帧ID 为0xF1,DATA区域依次放入ABC三个数据,然后计算SC、AC,完成后将本帧发送至上位机即可。

1.1.1.2.2.4 代码实现
驱动代码:
ANO_DataProtocol.c

#include "usart.h"
#include "ANO_DataProtocol.h"
#include "stm32f10x.h"

#define BYTE0(dwTemp)       (*(char *)(&dwTemp))     //取出int型变量的低字节
#define BYTE1(dwTemp)       (*((char *)(&dwTemp) + 1))     //    取存储在此变量下一内存字节的内容,高字节
#define BYTE2(dwTemp)       (*((char *)(&dwTemp) + 2))
#define BYTE3(dwTemp)       (*((char *)(&dwTemp) + 3))

void AnoTc_SendUserTest(s16 A, s16 B, s32 C)
{
	// AA 05 AF F1 02 E4 01 36
	unsigned char _cnt = 0;
	unsigned char i;
	unsigned char sumcheck = 0;
	unsigned char addcheck = 0;
	
	Data_to_Send[_cnt++] = 0xAA;
	Data_to_Send[_cnt++] = 0xFF;
	Data_to_Send[_cnt++] = 0xF1;
	Data_to_Send[_cnt++] = 8;
	Data_to_Send[_cnt++] = BYTE0(A);
	Data_to_Send[_cnt++] = BYTE1(A);
	Data_to_Send[_cnt++] = BYTE0(B);
	Data_to_Send[_cnt++] = BYTE1(B);
	Data_to_Send[_cnt++] = BYTE0(C);
	Data_to_Send[_cnt++] = BYTE1(C);
	Data_to_Send[_cnt++] = BYTE2(C);
	Data_to_Send[_cnt++] = BYTE3(C);
	
	for(i = 0; i < _cnt; i++)
	{
		sumcheck += Data_to_Send[i];
		addcheck += sumcheck;
	}
	//if(sumcheck == Data_to_Send[Data_to_Send[3]+4] && addcheck == Data_to_Send[Data_to_Send[3]+5])
	Data_to_Send[_cnt++]=sumcheck;
	Data_to_Send[_cnt++]=addcheck;
	USART_SendCharArr(USART1, Data_to_Send,_cnt);
}

ANO_DataProtocol.h

#ifndef __ANO_DATA_PROTOCOL_H__
#define __ANO_DATA_PROTOCOL_H__

#include "sys.h"

void AnoTc_SendUserTest(s16 A, s16 B, s32 C);

#endif

main.c

#include "stm32f10x.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "ANO_DataProtocol.h"

int main()
{
	u16 i = 0;
	
    u32 ECG1,ECG2,ECG3;
    SystemInit();//系统时钟等初始化
    delay_init();	     //延时初始化
    NVIC_Configuration();//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    uart_init(115200);//串口初始化为9600//延时初始化

	while(1)
	{
		for(i = 0; i < 400; i++)
		{
			AnoTc_SendUserTest(i, i+100, i+200);
			delay_ms(100);
		}
		for(i = 400; i > 200; i--)
		{
			AnoTc_SendUserTest(i, i+100, i+200);
			delay_ms(100);
		}
	}
}

2. 上位机波形

在这里插入图片描述
生成了奇怪的三角波

3. 资源下载

匿名上位机波形显示demo及协议文档: https://download.csdn.net/download/FourLeafCloverLLLS/34433481

  • 10
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

零涂

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值