123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- #include "main.h"
- #include "YHPID.h"
- /**
- @* 野火PID串口工具
- @* 所有多字节的低字节在前
- @* 包头固定为四字节的0x59485A53;
- @* 通道地址1到5对应软件上的CH1到CH5,CH1为0x01,CH2为0x02;
- @* 包长度为从包头到校验的所有数据长度。
- @* 指令为相应的功能码。
- @* 参数为指令需要参数时加入。
- @* 校验为校验和方式——8位。
- ***/
- // 包头常量
- #define PACK_HEADER 0x59485A53
- #define CMD_DATA_UPLOAD 0x02
- #define CMD_PID_UPLOAD 0x03
- uint32_t g_dwinbuffer[23] ; // 当用DMA发送的时候 帧头要四字节对齐
- // 发送 PID 参数到上位机
- void Send_PID_To_PC(uint8_t channel, float P, float I, float D)
- {
- uint8_t index = 0, *tx_buf;
- tx_buf = (uint8_t *)g_dwinbuffer;
-
- // 包头(4字节,高字节在前)
- tx_buf[index++] = (uint8_t)((PACK_HEADER >> 24) & 0xFF);
- tx_buf[index++] = (uint8_t)((PACK_HEADER >> 16) & 0xFF);
- tx_buf[index++] = (uint8_t)((PACK_HEADER >> 8) & 0xFF);
- tx_buf[index++] = (uint8_t)(PACK_HEADER & 0xFF);
- // 通道地址(1字节)
- tx_buf[index++] = channel;
- // 包长度(4字节,从包头到校验,含校验共 0x17 = 23)
- uint32_t length = 0x17;
- tx_buf[index++] = (uint8_t)(length & 0xFF);
- tx_buf[index++] = (uint8_t)((length >> 8) & 0xFF);
- tx_buf[index++] = (uint8_t)((length >> 16) & 0xFF);
- tx_buf[index++] = (uint8_t)((length >> 24) & 0xFF);
- // 指令(1字节)
- tx_buf[index++] = CMD_PID_UPLOAD;
- // P 参数(4字节 float)
- memcpy(&tx_buf[index], &P, 4);
- index += 4;
- // I 参数(4字节 float)
- memcpy(&tx_buf[index], &I, 4);
- index += 4;
- // D 参数(4字节 float)
- memcpy(&tx_buf[index], &D, 4);
- index += 4;
- // 校验和(1字节,前面所有字节的累加和的低8位)
- uint8_t checksum = 0;
- for (uint8_t i = 0; i < index; i++) {
- checksum += tx_buf[i];
- }
- tx_buf[index++] = checksum;
-
- HAL_GPIO_WritePin(GPIOB, RS485_RE_Pin, GPIO_PIN_SET);
- HAL_UART_Transmit_DMA(&huart1, tx_buf, index);
- }
- // 发送 实际值 参数到上位机
- void Send_DATA_To_PC(uint8_t channel, float data)
- {
- uint8_t tx_buf[15]; // 总长度 0x0F = 15字节
- uint32_t index = 0;
- // 包头(4字节,高字节在前)
- tx_buf[index++] = (uint8_t)((PACK_HEADER >> 24) & 0xFF);
- tx_buf[index++] = (uint8_t)((PACK_HEADER >> 16) & 0xFF);
- tx_buf[index++] = (uint8_t)((PACK_HEADER >> 8) & 0xFF);
- tx_buf[index++] = (uint8_t)(PACK_HEADER & 0xFF);
- // 通道地址(1字节)
- tx_buf[index++] = channel;
- // 包长度(4字节,从包头到校验,含校验共 0x0F = 15)
- uint32_t length = 0x0F;
- tx_buf[index++] = (uint8_t)(length & 0xFF);
- tx_buf[index++] = (uint8_t)((length >> 8) & 0xFF);
- tx_buf[index++] = (uint8_t)((length >> 16) & 0xFF);
- tx_buf[index++] = (uint8_t)((length >> 24) & 0xFF);
- // 指令(1字节)
- tx_buf[index++] = CMD_DATA_UPLOAD;
- // SPEED 参数(4字节 float)
- memcpy(&tx_buf[index], &data, 4);
- index += 4;
- // 校验和(1字节,前面所有字节的累加和的低8位)
- uint8_t checksum = 0;
- for (uint8_t i = 0; i < index; i++) {
- checksum += tx_buf[i];
- }
- tx_buf[index++] = checksum;
- HAL_GPIO_WritePin(GPIOB, RS485_RE_Pin, GPIO_PIN_SET);
- HAL_UART_Transmit_DMA(&huart1, tx_buf, index);
- }
|