Rawdata
最基本的通信协议,接收到什么,便打印什么,不做数据的解析处理,仅用于查看字节流数据。
JustFloat
本协议是小端浮点数组形式的字节流协议,纯十六进制浮点传输,节省带宽。此协议非常适合用在通道数量多、发送频率高的时候。
一般用于下位机向上位机发送数据。
使用时需要在CMSIS Driver中安装VOFA包
将JustFloat文件夹(文件夹链接见文末)移植到工程中,根据通信硬件接口修改函数(原因见下)
自定义一个vofa框架句柄(默认为变量名jSHandle),使用该句柄初始化vofa,调用Vofa_JustFloat即可发送数据到上位机,而Vofa_Printf函数可以代替printf
justfloat调用vofa.c中的发送回调函数(弱定义),此函数将justfloat和通信硬件接口绑定,因此需要重定义该函数
printf重定向 在usart.c中比较方便
#include <stdio.h>
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1 , 0xffff);
return ch;
}
或者(以下还可以使用scanf’函数)
int fputc(int ch, FILE *f){
uint8_t temp[1] = {ch};
HAL_UART_Transmit(&huart2, temp, 1, 0xffff);
return ch;
}
int fgetc(FILE * f)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart2,&ch, 1, 0xffff);
return ch;
}
FireWater
本协议是CSV风格的字符串流,直观简洁,编程像printf简单。但由于字符串解析消耗更多的运算资源(无论在上位机还是下位机),建议仅在
通道数量不多、发送频率不高的时候使用。
一般用于上位机向下位机发送数据
将FireWater文件夹(文件夹链接见文末)移植到工程,添加头文件路径和源文件,注:静态库不能忘。在def.h中更改包含头文件
使用步骤
①串口接收中断使能
HAL_UART_Receive_IT(&huart1,&Res,1);
Res为一个uint8_t全局变量,用于暂存接收到的数据,需要自己定义
②重写接收中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
Write_RingBuff(&uart_ringbuff,&Res,1);
HAL_UART_Receive_IT(&huart1, &Res, 1);
}
该步作用是将MCU的通信硬件接口和FW绑定
③在主函数里初始化并在循环里执行任务
int main(void)
{
fw_init();
while(1)
{
fw_task();
}
}
④注:上位机发送的指令格式为
指令名:数据1,数据2,数据3,数据4\n
数据量可在fw.c中更改(float buf[4];),不满四个时,后面依次为0
协议将接收到的4个数据存在数组中,然后在fw.c中对应的指令名函数中写用户代码
代码逻辑:
HAL_UART_Receive_IT(&huart1,&Res,1);
这句表示每次接收一个字节数据,进入中断callback中,将接收到的数据根据协议压入环形队列中(uart_ringbuff中,在fw.c中定义),然后再次打开接收中断。每次执行到fw_task();都会进入该函数,判断是否接收完整的一帧,若没有接收完成,则退出该函数。直到下位机接收到\n,表示一帧结束,此时执行到fw_task();时,会进入fw.c中的对应指令名的函数中执行,将环形队列中的数据取出,送入数组,然后执行用户程序
注:串口接收中断比较特殊,每次进入中断回调函数后,需要手动再次开启 HAL_UART_Receive_IT(&huart1,&Res,1);
文件夹链接:https://pan.baidu.com/s/18XVReDEw1qgmcetdd8jQSg 提取码:9no0