#include "uarts.h" #define UART6_RX_BUFFER_SIZE 256 uint8_t UART6_RxBuffer[UART6_RX_BUFFER_SIZE]; UART_BUF uart1; //串口结构体实体 UART_BUF uart6; //串口结构体实体 uint8_t RxBuffer; //接收数据中间变量 uint8_t u1_RxBuffer,u6_RxBuffer,u2_RxBuffer,u3_RxBuffer; //接收数据中间变量 uint8_t array1[255]; uint8_t u2_rxbuf[100]; uint8_t u3_rxbuf[100]; int u2_rx_count = 0,u3_rx_count = 0; uint8_t usart_flag = 1; #pragma import(__use_no_semihosting_swi) #pragma import(__use_no_semihosting) void _sys_exit(int x) { x = x; } struct __FILE { int handle; /* Whatever you require here. If the only file you are using is */ /* standard output using printf() for debugging, no file handling */ /* is required. */ }; /* FILE is typedef’ d in stdio.h. */ FILE __stdout; int fputc(int ch, FILE *f) { HAL_UART_Transmit(&MODBUS_HUART, (uint8_t *)&ch, 1, 0xffff); return ch; } void uart_send(UART_HandleTypeDef *huart,uint8_t *Tx_Buf,uint16_t Size) { HAL_UART_Transmit_DMA(huart,Tx_Buf,Size); } // 气密性检测仪结果格式S | g | xxxxxx | yyyyyy |tttttt|p|0xd0xa //其中 S 表示 刚检测完毕,数据未读取 //g:0 或1,1:表示结果合格,0:表示不合格 //x:检测的差压值 或泄漏值。单位kPa或ml/min(根据仪器设置显示 //方式确定) // y:检测压力值 kPa // t:检测时间 S // p:检测的频道0-9 //最后以 0xd+0xa结束 char g_str[1],x_str[6],y_str[6],t_str[6],p_str[1]; void usart2_rx_cb(void) { u2_rxbuf[u2_rx_count] = u2_RxBuffer; if(u2_rxbuf[0] == 'S')//u2_rxbuf[0] == 0xF5 || u2_rxbuf[0] == 0xF0 || u2_rx_count ++; else u2_rx_count = 0; if(u2_rxbuf[u2_rx_count - 1] == 0x0A && u2_rxbuf[u2_rx_count -2 ] == 0x0D) { if(u2_rx_count >= 27) { p_str[0] = u2_rxbuf[25]; g_str[0] = u2_rxbuf[2]; for(int i = 0;i < 6;i++) { x_str[i] = u2_rxbuf[4 + i]; y_str[i] = u2_rxbuf[11 + i]; t_str[i] = u2_rxbuf[18 + i]; } InputReg[25] = g_str[0]; InputReg[26] = (x_str[0] << 8) | x_str[1]; InputReg[27] = (x_str[2] << 8) | x_str[3]; InputReg[28] = (x_str[4] << 8) | x_str[5]; InputReg[29] = (y_str[0] << 8) | y_str[1]; InputReg[30] = (y_str[2] << 8) | y_str[3]; InputReg[31] = (y_str[4] << 8) | y_str[5]; InputReg[32] = (t_str[0] << 8) | t_str[1]; InputReg[33] = (t_str[2] << 8) | t_str[3]; InputReg[34] = (t_str[4] << 8) | t_str[5]; InputReg[35] = p_str[0]; } else { } u2_rx_count = 0; } if(u2_rx_count > 50) u2_rx_count = 0; HAL_UART_Receive_IT(&huart2, (uint8_t *)&u2_RxBuffer, 1); } void usart6_rx_cb(void) { if(uart6.rx_buf_cnt >= UART6_RX_BUFFER_SIZE-1) //接收数据量超限,错误 { uart6.rx_buf_cnt = 0; memset(uart6.rx_buf, 0x00, sizeof(&uart6.rx_buf)); HAL_UART_Transmit(&huart6, (uint8_t *)"数据溢出", 10, 0xFFFF); } else //接收正常 { //uart6.rx_buf[uart6.rx_buf_cnt++] = u6_RxBuffer; //接收数据存储到rx_buf array1[uart6.rx_buf_cnt++] = u6_RxBuffer; HAL_TIM_Base_Stop_IT(&MODBUS_HTIM); __HAL_TIM_SET_COUNTER(&MODBUS_HTIM, 0); HAL_TIM_Base_Start_IT(&MODBUS_HTIM); //将定时器7的计数值清零后重新计数 } HAL_UART_Receive_IT(&huart6, (uint8_t *)&u6_RxBuffer, 1); } void usart3_rx_cb(void) { u3_rxbuf[u3_rx_count] = u3_RxBuffer; if(u3_rxbuf[0] == 0x01) u3_rx_count++; else u3_rx_count = 0; if(u3_rx_count > 12) { u3_rx_count = 0; /*原压力寄存器,现存放热电偶采集模块0-4通道数值,寄存器数据/10 - 200 即为当前通道对应温度*/ InputReg[13] = ((u3_rxbuf[3] * 0x100 + u3_rxbuf[4]) / 4095.0) * 1550 * 10; InputReg[14] = ((u3_rxbuf[5] * 0x100 + u3_rxbuf[6]) / 4095.0) * 1550 * 10; InputReg[15] = ((u3_rxbuf[7] * 0x100 + u3_rxbuf[8]) / 4095.0) * 1550 * 10; InputReg[16] = ((u3_rxbuf[9] * 0x100 + u3_rxbuf[10]) / 4095.0) * 1550 * 10; } HAL_UART_Receive_IT(&huart3, (uint8_t *)&u3_RxBuffer, 1); } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART1) { usart_flag = 1; modbus_rx_cb(); } if(huart->Instance == USART2) { usart2_rx_cb(); } if(huart->Instance == USART3) { //laser_rx_cb(); usart3_rx_cb();//温度采集 } if(huart->Instance == UART4) { } if(huart->Instance == USART6) { usart_flag = 6; usart6_rx_cb(); } }