匿名上位机相信很多人都用过,以前在调飞控的时候使用过,可以很直观的显示数据的波形,比如飞机姿态等。
最近在调试foc。很多数据在调试过程中,仅仅使用串口打印出来显示是很不直观的,比如正弦波,经典的马鞍波等。今天研究了一下将数据通过串口发送给匿名上位机,然后在上位机中显示自定义数据波形。
首先看下马鞍波的波形
是不是特别直观,这个马鞍波也是foc在运行过程中,三相驱动定时器的CCR值。
环境:
匿名上位机使用版本:V4.34 提货窗口 提货码:6ezj
单片机串口:STM32的VCP,即USB虚拟串口
数据传输
- 协议的认识
- 代码实现协议
- 上位机配置
- 数据波形显示
- 串口设置
协议的认识
首先需要了解的是,所使用的匿名上位机版本对应的通信协议。不同版本的协议有差别,有的还挺大。例如我使用的这个版本,找到通信协议说明部分,具体打开如下图
点开后是一个excel表格,里面写了各种协议,包括官方定义好的标准协议,以及自定义的协议。如下
图中将官方定义的功能协议略去,仅显示了用户传输自定义数据部分的协议。可见,用户自定义的数据格式应该是
帧头(AAAA) 功能码(Fx) 传输数据长度(这个数据长度有说明,仅仅是用户数据部分,不包含帧头功能码这些) 用户数据(即用户自定义的数据部分) 校验(校验和,这个是将前面从帧头开始所有的数据累加,然后取低8位)。
举例说明:
我要传输的是三相的驱动定时器的CCR值,那么发送一帧数据的就应该是
0xAA 0xAA 0xF1 0x06 0xCCR1_H 0xCCR1_L 0xCCR2_H 0xCCR2_L 0xCCR3_H 0xCCR3_L 0xSUM
知道了上位机解析的协议,然后就是在代码中将发送数据按照这个格式发送就可以了。参考如下
代码实现协议
#include "send.h"
#include "usbd_cdc_if.h"
#include "sys.h"
//数据拆分宏定义,在发送大于1字节的数据类型时,比如int16、float等,需要把数据拆分成单独字节进行发送
#define BYTE0(dwTemp) (*(char*)(&dwTemp))
#define BYTE1(dwTemp) (*((char*)(&dwTemp) + 1))
#define BYTE2(dwTemp) (*((char*)(&dwTemp) + 2))
#define BYTE3(dwTemp) (*((char*)(&dwTemp) + 3))
extern uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];
void SendWave(int16_t a, int16_t b, int16_t c)
{
uint8_t cnt = 0;
UserTxBufferFS[cnt++] = 0xAA;
UserTxBufferFS[cnt++] = 0xAA;
UserTxBufferFS[cnt++] = 0xF1;
UserTxBufferFS[cnt++] = 6;
UserTxBufferFS[cnt++] = BYTE1(a);
UserTxBufferFS[cnt++] = BYTE0(a);
UserTxBufferFS[cnt++] = BYTE1(b);
UserTxBufferFS[cnt++] = BYTE0(b);
UserTxBufferFS[cnt++] = BYTE1(c);
UserTxBufferFS[cnt++] = BYTE0(c);
unsigned char sum = 0;
unsigned char i = 0;
for(i=0;i<cnt;i++)
sum += UserTxBufferFS[i];
UserTxBufferFS[cnt++] = sum;
CDC_Transmit_FS(UserTxBufferFS, cnt);
}
如上代码所示,这里就可以将需要上传的数据发送到匿名上位机中了。需要关注的是,代码中是用虚拟串口实现的,以后有机会再说吧。
上位机配置
选中高级收码,然后在帧格式设置这里,勾选使能该帧,同时我们可以看到这里的帧头就是AAAA,功能码就是F1,这里就对应上了。这里设置的意思就是将接收帧设置到和我们发送帧格式对应,这里主要是对应的功能码。
如果帧格式设置这里选择2,那么你会看到这里的功能码是F2,那么这个就是另一个数据帧了。
然后是数据容器设置这里
下面的数据来源表示帧1中的数据,是用来保存数据帧1中传过来的数据,也就是上面配置的帧格式设置那里功能码为F1的数据帧里面包含的数据;
数据容器设置和数据位置是对应着设置的。比如说现在已经选中了数据来源是帧1,然后数据容器设置选中1,这个数据容器就是说用户自定义的数据要存放的地方,但是一个容器只能存一个用户数据,我们传过来的数据一共有三个,即上面的CCR1,CCR2,CCR3。具体存哪个呢?这个就是由下面的数据位置决定的,比如勾选1,那么就表示将CCR1保存在数据容器1中,如果勾选2,那么就表示将CCR2保存在数据容器1中;因为一共有三个数据要保存,所以我们要选择3个数据容器。即最终对应的应该是:数据容器设置1,数据位置对应1;数据容器设置2,数据位置对应2;数据容器设置3,数据位置对应3;
到这里高级收码部分设置就完成了,别忘了保存设置。
数据波形显示
按照图中的四步设置这里的数据波形,因为原来的软件默认显示都是飞控的数据,这里需要切换到自定义数据波形。如果你事先已经设置好了串口,并且已经连接,那么这里将会正常显示波形了。
串口设置
使用USB虚拟串口是不需要设置这里的波特率的,这个传输速度可比普通串口快多了。