#include "nuc.h" #include "crc16.h" #include #include "define.h" #include "error_detect.h" static volatile uint32_t drop_message = 0; static osThreadId_t thread_alert; uint8_t nucbuf[16]; uint8_t SendBuffer[19]; static void NUC_IdleCallback(void) { osThreadFlagsSet(thread_alert,SIGNAL_NUC_RAW_REDY); detect_hook(NUC_TOE); } int8_t NUC_Init(NUC_t *nuc){ if(nuc == NULL) return DEVICE_ERR_NULL; if((thread_alert = osThreadGetId()) == NULL ) return DEVICE_ERR_NULL; BSP_UART_RegisterCallback(BSP_UART_NUC,BSP_UART_IDLE_LINE_CB, NUC_IdleCallback); return DEVICE_OK; } int8_t NUC_StartReceiving() { if (HAL_UARTEx_ReceiveToIdle_DMA(BSP_UART_GetHandle(BSP_UART_NUC), (uint8_t *)nucbuf, sizeof(nucbuf)) == HAL_OK) return DEVICE_OK; return DEVICE_ERR; } int8_t NUC_Restart(void) { __HAL_UART_DISABLE(BSP_UART_GetHandle(BSP_UART_NUC)); __HAL_UART_ENABLE(BSP_UART_GetHandle(BSP_UART_NUC)); return DEVICE_OK; } bool_t NUC_WaitDmaCplt(void) { return (osThreadFlagsWait(SIGNAL_NUC_RAW_REDY, osFlagsWaitAll,500) == SIGNAL_NUC_RAW_REDY); } int8_t NUC_Send(fp32 *data) { union { float x[4]; uint8_t data[16]; }instance; for (int i = 0; i < 4; i++) { instance.x[i] = data[i]; } SendBuffer[0] = 0xFC; //发送ID SendBuffer[1] = 0x01; //控制帧 for(int i = 2; i < 18; i++){ SendBuffer[i] = instance.data[i-2]; } SendBuffer[18] = 0xFD; //结束符 if (HAL_UART_Transmit(BSP_UART_GetHandle(BSP_UART_NUC), (uint8_t *)SendBuffer,sizeof(SendBuffer),1000) == HAL_OK){ return DEVICE_OK; } return DEVICE_ERR; } int i= 0; int8_t NUC_RawParse(CMD_NUC_t *n) { if (n == NULL) return DEVICE_ERR_NULL; union { float x[3]; char data[12]; } instance; // 方便在浮点数和字符数组之间进行数据转换 // 校验数据包头 if (nucbuf[0] != HEAD) { return DEVICE_ERR; } if (nucbuf[15] != TAIL) { return DEVICE_ERR; } // 提取数据包中的 CRC 值(假设 CRC 值在数据包的最后两个字节) // uint16_t received_crc = (nucbuf[16] << 8) | nucbuf[17]; // 假设 CRC 在第 16 和 17 字节 // uint16_t calculated_crc = do_crc_table(nucbuf, 16); // 计算前 16 字节的 CRC // 校验 CRC // if (received_crc == calculated_crc) { // n->status_fromnuc = nucbuf[1]; // n->pit_status = nucbuf[2]; //switch (n->status_fromnuc) { // case navi: /* 协议格式 0xFF HEAD 0x02 控制帧 0x01 相机帧 x fp32 y fp32 z fp32 0xFE TAIL */ #ifdef radar if(nucbuf[0] == HEAD&&nucbuf[15] == TAIL){ instance.data[0] = nucbuf[3]; instance.data[1] = nucbuf[4]; instance.data[2] = nucbuf[5]; instance.data[3] = nucbuf[6]; n->nuc.vx = instance.x[0]; instance.data[4] = nucbuf[7]; instance.data[5] = nucbuf[8]; instance.data[6] = nucbuf[9]; instance.data[7] = nucbuf[10]; n->nuc.vy = instance.x[1]; instance.data[8] = nucbuf[11]; instance.data[9] = nucbuf[12]; instance.data[10] = nucbuf[13]; instance.data[11] = nucbuf[14]; n->nuc.vw = instance.x[2]; if(n->nuc.vw == 0){ i++; } } #elif defined(carmera_angle)|| defined(camera_angle_static) instance.data[3] = nucbuf[3]; instance.data[2] = nucbuf[4]; instance.data[1] = nucbuf[5]; instance.data[0] = nucbuf[6]; n->nuc.vx = instance.x[0]; instance.data[7] = nucbuf[7]; instance.data[6] = nucbuf[8]; instance.data[5] = nucbuf[9]; instance.data[4] = nucbuf[10]; n->nuc.vy = instance.x[1]; instance.data[11] = nucbuf[11]; instance.data[10] = nucbuf[12]; instance.data[9] = nucbuf[13]; instance.data[8] = nucbuf[14]; n->nuc.vw = instance.x[2]; #endif // break; // } return 0; } int8_t NUC_HandleOffline(CMD_NUC_t *cmd) { if(cmd == NULL) return DEVICE_ERR_NULL; memset(cmd, 0, sizeof(*cmd)); return 0; }