gateway_mcu/CH32V303-FreeRTOS/App/application/Src/queueUart.c

301 lines
8.6 KiB
C

#include "queueUart.h"
#include "uart_dev.h"
#include "busIdleDetection.h"
#include "semphr.h"
/* 队列中每个消息的大小 */
#define QUEUE_SIZE 4
/* 各个通讯口的队列 */
QueueHandle_t J1_485_Queue = NULL;
QueueHandle_t J2_485_Queue = NULL;
QueueHandle_t J3_485_Queue = NULL;
QueueHandle_t J4_485_Queue = NULL;
QueueHandle_t J5_0_485_Queue = NULL;
QueueHandle_t upward_uart_Queue = NULL;
/* 队列集 */
QueueSetHandle_t uart_Queue = NULL;
QueueSetMemberHandle_t xActivatedMemberUartQueue;
/* 通过该结构体接收对应的数据用来发送,结束后通过该结构体,释放数据的内存 */
typedef struct _queueRecvDataInfo {
queueUartSendInfo *J1_485_data;
queueUartSendInfo *J2_485_data;
queueUartSendInfo *J3_485_data;
queueUartSendInfo *J4_485_data;
queueUartSendInfo *upward_uart_data;
queueTimeShareSendInfo *J5_0_485_data;
} queueRecvDataInfo;
static queueRecvDataInfo queueRecvData;
/**
* @brief 初始化串口发送的队列
* @param
* @retval
*/
void uartQueueInit(void)
{
/* 初始化队列 */
J1_485_Queue = xQueueCreate(5, QUEUE_SIZE);
// if (NULL == J1_485_Queue) {
// log_error("creat J1_485_Queue error\n");
// }
J2_485_Queue = xQueueCreate(5, QUEUE_SIZE);
// if (NULL == J2_485_Queue) {
// log_error("creat J2_485_Queue error\n");
// }
J3_485_Queue = xQueueCreate(5, QUEUE_SIZE);
// if (NULL == J3_485_Queue) {
// log_error("creat J3_485_Queue error\n");
// }
J4_485_Queue = xQueueCreate(5, QUEUE_SIZE);
// if (NULL == J4_485_Queue) {
// log_error("creat J4_485_Queue error\n");
// }
J5_0_485_Queue = xQueueCreate(10, QUEUE_SIZE);
// if (NULL == J5_0_485_Queue) {
// log_error("creat J5_0_485_Queue error\n");
// }
upward_uart_Queue = xQueueCreate(10, QUEUE_SIZE);
// if (NULL == upward_uart_Queue) {
// log_error("creat upward_uart_Queue error\n");
// }
/* 将队列都放入队列集中 */
uart_Queue = xQueueCreateSet(6);
xQueueAddToSet(J1_485_Queue, uart_Queue);
xQueueAddToSet(J2_485_Queue, uart_Queue);
xQueueAddToSet(J3_485_Queue, uart_Queue);
xQueueAddToSet(J4_485_Queue, uart_Queue);
xQueueAddToSet(J5_0_485_Queue, uart_Queue);
xQueueAddToSet(upward_uart_Queue, uart_Queue);
}
/**
* @brief 从队列中取出数据,发送函数
* @param
* @retval
*/
void uartQueueSend(void)
{
/* 用于判定是否延时 */
static uint8_t flag = 0;
/* 查看队列集中是否有数据 */
xActivatedMemberUartQueue = xQueueSelectFromSet(uart_Queue, portMAX_DELAY);
/* 查看Upward_uart5中有无数据 */
if (!getUartState(g_Upward_uart5_handle)) {
/* 处理接收到的数据 */
if (xQueueReceive(upward_uart_Queue, &queueRecvData.upward_uart_data, 0) == pdTRUE) {
uartInterruptSend(g_Upward_uart5_handle, queueRecvData.upward_uart_data->data
, queueRecvData.upward_uart_data->length);
flag = 1;
}
}
/* 查看J1_485中有无数据 */
if (!getRs485State(g_J1_uart6_handle)) {
/* 处理接收到的数据 */
if (xQueueReceive(J1_485_Queue, &queueRecvData.J1_485_data, 0) == pdTRUE) {
uartInterruptSend(g_J1_uart6_handle, queueRecvData.J1_485_data->data
, queueRecvData.J1_485_data->length);
flag = 1;
}
}
/* 查看J2_485中有无数据 */
if (!getRs485State(g_J2_uart7_handle)) {
/* 处理接收到的数据 */
if (xQueueReceive(J2_485_Queue, &queueRecvData.J2_485_data, 0) == pdTRUE) {
uartInterruptSend(g_J2_uart7_handle, queueRecvData.J2_485_data->data
, queueRecvData.J2_485_data->length);
flag = 1;
}
}
/* 查看J3_485中有无数据 */
if (!getRs485State(g_J3_usart2_handle)) {
/* 处理接收到的数据 */
if (xQueueReceive(J3_485_Queue, &queueRecvData.J3_485_data, 0) == pdTRUE) {
uartInterruptSend(g_J3_usart2_handle, queueRecvData.J3_485_data->data
, queueRecvData.J3_485_data->length);
flag = 1;
}
}
/* 查看J4_485中有无数据 */
if (!getRs485State(g_J4_uart8_handle)) {
/* 处理接收到的数据 */
if (xQueueReceive(J4_485_Queue, &queueRecvData.J4_485_data, 0) == pdTRUE) {
uartInterruptSend(g_J4_uart8_handle, queueRecvData.J3_485_data->data
, queueRecvData.J4_485_data->length);
flag = 1;
}
}
/* 查看J5_0_485中有无数据 */
if (!getRs485State(g_J5_0_usart3_handle)) {
/* 处理接收到的数据 */
if (xQueueReceive(J5_0_485_Queue, &queueRecvData.J5_0_485_data, 0) == pdTRUE) {
setConnectPort(queueRecvData.J5_0_485_data->connectPort);
// log_info("send J5_0 Data : %s , %d\n", queueRecvData.J5_0_485_data->data, queueRecvData.J5_0_485_data->length);
uartInterruptSend(g_J5_0_usart3_handle, queueRecvData.J5_0_485_data->data
, queueRecvData.J5_0_485_data->length);
flag = 1;
}
}
/* 没有数据发送则延时 */
if (!flag) {
/* 延时三个系统节拍 */
vTaskDelay(3);
}
flag = 0;
}
#ifdef UARTINTERRUPTSEND
// 创建队列集
QueueSetHandle_t BinarySemaphoreSet = NULL;
// 创建二值信号量
SemaphoreHandle_t J1_BinarySemaphore = NULL;
SemaphoreHandle_t J2_BinarySemaphore = NULL;
SemaphoreHandle_t J3_BinarySemaphore = NULL;
SemaphoreHandle_t J4_BinarySemaphore = NULL;
SemaphoreHandle_t J5_0_BinarySemaphore = NULL;
SemaphoreHandle_t upward_BinarySemaphore = NULL;
/**
* @brief 二值信号量初始化,用于同步中断发送完成信息,便于任务中释放内存
* @param
* @retval
*/
void binarySemaphoreInit(void)
{
// 初始化队列集
BinarySemaphoreSet = xQueueCreateSet(6);
// 初始化二值信号量
J1_BinarySemaphore = xSemaphoreCreateBinary();
J2_BinarySemaphore = xSemaphoreCreateBinary();
J3_BinarySemaphore = xSemaphoreCreateBinary();
J4_BinarySemaphore = xSemaphoreCreateBinary();
J5_0_BinarySemaphore = xSemaphoreCreateBinary();
upward_BinarySemaphore = xSemaphoreCreateBinary();
// 将二值信号量添加到队列集中
xQueueAddToSet(J1_BinarySemaphore, BinarySemaphoreSet);
xQueueAddToSet(J2_BinarySemaphore, BinarySemaphoreSet);
xQueueAddToSet(J3_BinarySemaphore, BinarySemaphoreSet);
xQueueAddToSet(J4_BinarySemaphore, BinarySemaphoreSet);
xQueueAddToSet(J5_0_BinarySemaphore, BinarySemaphoreSet);
xQueueAddToSet(upward_BinarySemaphore, BinarySemaphoreSet);
}
/**
* @brief 通过二值信号量释放中断发送数据的内存
* @param
* @retval
*/
void binarySemaphoreFreeMemory(void)
{
// 等待队列集中的事件
QueueSetMemberHandle_t xActivatedMember = xQueueSelectFromSet(BinarySemaphoreSet, portMAX_DELAY);
if (xActivatedMember == J1_BinarySemaphore) {
// 执行相关逻辑
vPortFree(queueRecvData.J1_485_data);
setJ1_485_SendState(0);
// 处理二值信号量事件
xSemaphoreTake(J1_BinarySemaphore, 0);
}
else if (xActivatedMember == J2_BinarySemaphore) {
vPortFree(queueRecvData.J2_485_data);
setJ2_485_SendState(0);
xSemaphoreTake(J2_BinarySemaphore, 0);
}
else if (xActivatedMember == J3_BinarySemaphore) {
vPortFree(queueRecvData.J3_485_data);
setJ3_485_SendState(0);
xSemaphoreTake(J3_BinarySemaphore, 0);
}
else if (xActivatedMember == J4_BinarySemaphore) {
vPortFree(queueRecvData.J4_485_data);
setJ4_485_SendState(0);
xSemaphoreTake(J4_BinarySemaphore, 0);
}
else if (xActivatedMember == J5_0_BinarySemaphore) {
vPortFree(queueRecvData.J5_0_485_data);
setJ5_0_485_SendState(0);
xSemaphoreTake(J5_0_BinarySemaphore, 0);
}
else if (xActivatedMember == upward_BinarySemaphore) {
vPortFree(queueRecvData.upward_uart_data);
setUpward_uart_SendState(0);
xSemaphoreTake(upward_BinarySemaphore, 0);
}
}
/**
* @brief 数据发送完成后用于清除
* @param
* @retval
*/
void J1_485_IN_TXE(void)
{
// vPortFree(queueRecvData.J1_485_data);
xSemaphoreGiveFromISR(J1_BinarySemaphore, 0);
}
void J2_485_IN_TXE(void)
{
// vPortFree(queueRecvData.J2_485_data);
xSemaphoreGiveFromISR(J2_BinarySemaphore, 0);
}
void J3_485_IN_TXE(void)
{
// vPortFree(queueRecvData.J3_485_data);
xSemaphoreGiveFromISR(J3_BinarySemaphore, 0);
}
void J4_485_IN_TXE(void)
{
// vPortFree(queueRecvData.J4_485_data);
xSemaphoreGiveFromISR(J4_BinarySemaphore, 0);
}
void J5_0_485_IN_TXE(void)
{
// vPortFree(queueRecvData.J5_0_485_data);
xSemaphoreGiveFromISR(J5_0_BinarySemaphore, 0);
}
void Upward_USART_IN_TXE(void)
{
// vPortFree(queueRecvData.upward_uart_data);
xSemaphoreGiveFromISR(upward_BinarySemaphore, 0);
}
#endif