175 lines
4.0 KiB
C
175 lines
4.0 KiB
C
#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();
|
||
}
|
||
}
|
||
|
||
|
||
|