VOFA+上位机三种协议(FireWater,JustFloat,RawData)C语言参考代码

1.简介

vofa+是一款能很强上位机功,具有常规串口助手显示串口收发数据的作用,还可以进行一些串口数据可视化操作。

2.协议简介

其中有三种常见串口协议FireWater,JustFloat,RawData。

2.1FireWater协议

FireWater是一种非常简单的与vofa+上位机的通讯协议。

简介见下图。

参考C语言发送代码如下:

printf("%d,%d,%d,%d\r\n",data1,data2,data3);//将data1,data2,data3换成相应想要看到的数据即可

一般单片机向串口发送数据就要在后面加上\r\n,因为有些上位机或者平台只认为\r\n才是换行,单纯的\n不一定会让数据换行,所以为了多平台共用,尽量使用\r\n。

/*
    在微软的MS-DOS和Windows中,使用“回车CR('r')”和“换行LF('n')”两个字符作为换行符;
    Windows系统里面,每行结尾是 回车+换行(CR+LF),即“rn”;
    Unix系统里,每行结尾只有 换行CR,即“n”;
    Mac系统里,每行结尾是 回车CR 即'r';
    所以我们平时编写文件的回车符应该确切来说叫做回车换行符;
*/

 该种通信协议在数据量比较大时,发送数据较多时,会产生错位,接收失败,所以在数据量较大,或者发送频率较高时,不建议使用。

2.2JustFloat

该协议简介见下图:

参考c语言发送代码如下:

/*-------------------------------------------------------------------------------------------------------------------
  @brief     利用Vofa发数据
  @param     data1,data2,data3,data4,data5,data6,要发的数据放进入参即可
  @return    null
  Sample     Vofa_data(Err,Steer_Angle,set_speed_right,right_wheel,set_speed_left,left_wheel);
  @note      如果不够用,继续往后加入参即可,继续加参数参考原则见下注释
-------------------------------------------------------------------------------------------------------------------*/
void Vofa_data(int data1,int data2,int data3,int data4,int data5,int data6)
{
    int data[6];     
    float tempFloat[6];   //定义的临时变量
    uint8 tempData[28];   //定义的传输Buffer,一个int占4个字节,如果传6个,4*6=24,后面还有四个校验位,24+4=28

    data[0] = data1;
    data[1] = data2;
    data[2] = data3;
    data[3] = data4;
    data[4] = data5;
    data[5] = data6;

    tempFloat[0] = (float)data[0];     //转成浮点数
    tempFloat[1] = (float)data[1];
    tempFloat[2] = (float)data[2];
    tempFloat[3] = (float)data[3];
    tempFloat[4] = (float)data[4];
    tempFloat[5] = (float)data[5];

    memcpy(tempData, (uint8 *)tempFloat, sizeof(tempFloat));  //通过拷贝把数据重新整理

    tempData[24] = 0x00;//写入结尾数据
    tempData[25] = 0x00;
    tempData[26] = 0x80;
    tempData[27] = 0x7f;

    uart_putbuff(UART_0, tempData, 28);//通过串口传输数据,前面开多大的数组,后面占多大长度
}

 需要注意的是,uart_putbuff(UART_0, tempData, 28);这个函数不同平台函数有所不同,需要根据平台修改,其他内容,根据自己所发送的数据决定。

实测图如下,在调节PID等控制算法时,即使数据量大,速度快仍然保持了较高的准确性。

比较推荐使用。

2.3RawData

仅作为常规串口,没有什么特殊的功能。

发送代码和第一种一样。

printf("%d,%d,%d,%d\r\n",data1,data2,data3);//将data1,data2,data3换成相应想要看到的数据即可

就作为普通串口查看发送的数据而已。

3.总结

作为一款上位机,vofa+功能强大,本文简单讲解了三种传输协议,在低速少量数据情况时,可以使用FireWater协议,在高速大量数据情况建议使用JustFloat协议,相关协议C语言参考代码在文中有所提及。

4.下载链接

下载中心 | VOFA-Plus上位机

在STM32单片机中,使用UART通信进行JustFloat协议的数据交换,首先需要设置好USART的初始化配置,并编写相应的发送和接收函数。以下是一个简单的示例,假设我们已经在系统中配置了UART1作为通信端口: ```c #include "stm32f1xx_hal.h" // 发送函数 void send_data_float(float data) { uint8_t buffer[4]; // 存储单精度浮点数的字节序列 uint16_t i; // 将浮点数转换为字节序列(小端模式) pack_float_to_bytes(data, buffer); // 遍历字节序列并逐个发送 for (i = 0; i < sizeof(buffer); i++) { HAL_UART_Transmit(&huart1, buffer + i, 1, 1000); // 等待发送完成 } } // 字节序打包函数(仅作示例,实际应参考JustFloat协议) static void pack_float_to_bytes(float f, uint8_t *dest) { uint32_t integer, fraction; __HAL_RCC_ADC1_CLK_ENABLE(); // 如果使用ADC进行浮点到整数的转换,先开启时钟 ADC_InitTypeDef adc_config; // ...(这里省略ADC配置过程) // 获取整数部分和小数部分 float_to_integer_parts(f, &integer, &fraction); // 将整数和小数部分分别存储到缓冲区 dest[0] = integer & 0xFF; // 最低8位 dest[1] = (integer >> 8) & 0xFF; // 下8位 dest[2] = (integer >> 16) & 0xFF; // 再下8位 dest[3] = fraction; // 最高8位通常会存储在小数点后,这里保留 } // DMA空闲中断接收函数 void dma_USART1_IRQHandler() { if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { uint8_t received_data = USART1->DR; // 接收新的字符 // 在这里处理接收到的数据,比如解码、存储等 process_received_data(received_data); // 中断处理完后清除接收标志 USART_ClearITPendingBit(USART1, USART_IT_RXNE); } } void process_received_data(uint8_t data) { // 按照JustFloat协议解析接收到的字节流,重构浮点数 float processed_data = unpack_float_from_bytes(data); // 自定义的反序列化函数 // ...(后续操作,如更新变量,通知上层处理等) } // 反序列化函数(仅作示例,实际需参考JustFloat协议) static float unpack_float_from_bytes(uint8_t *src) { uint32_t integer, fraction; // ...(这里省略将字节还原成整数和小数部分的过程) return float_from_integer_parts(integer, fraction); // 反向操作 } ``` 注意,这只是一个简化的示例,实际应用中可能需要考虑错误处理、帧同步、校验等问题。并且,上述代码没有包含具体的中断服务函数注册和配置,这部分依赖于您的STM32 HAL库的具体实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值