actuator/users/Src/uarts.c

175 lines
4.0 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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();
}
}