gateway_mcu/CH32V303-FreeRTOS/App/application/Slave/Src/slave485DataParse.c

429 lines
12 KiB
C
Raw 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 "slave485DataParse.h"
#include "slaveQueueUart.h"
#include "mcu_common.h"
/**
* @brief 接收J1口传来的数据
* @param
* @retval
*/
void J1_SensorDataAnalysis(void)
{
static uint32_t tick;
if (J1_485RxBufferIndex == 0) {
tick = xTaskGetTickCount();
}
/* 单次进入最多6ms3个时钟周期串口中有数据 */
uint32_t nowTick = xTaskGetTickCount();
while ((getTickDiff(nowTick) < 3)
&& (uart_dev_char_present(g_J1_handle) == 1)
&& (maxdataLen > J1_485RxBufferIndex)) {
J1_485RxBuffer[J1_485RxBufferIndex++] = uart_dev_in_char(g_J1_handle);
}
/* 当时间到达或者数据量到达,就打包发送给智能模块 */
if ((J1_485RxBufferIndex >= maxdataLen) || (getTickDiff(tick) > delayTick)) {
uint32_t tempLen = 6 + J1_485RxBufferIndex + slaveQueueUartSendInfoSize;
if (xPortGetFreeHeapSize() < tempLen + 1024) {
J1_485RxBufferIndex = 0;
return;
}
uint8_t *Buff = (uint8_t *)pvPortMalloc(tempLen);
slaveQueueUartSendInfo *sendBuff = (slaveQueueUartSendInfo *)Buff;
sendBuff->length = 6 + J1_485RxBufferIndex;
sendBuff->data = Buff + sizeof(slaveQueueUartSendInfo);
uint8_t *send = sendBuff->data;
/* 起始标志 */
*send = 'S';
*(send + 1) = 'L';
/* 端口号 */
send += 2;
*send = J1;
/* 数据包长度 */
send += 1;
*send = (uint8_t)(J1_485RxBufferIndex >> 8);
*(send + 1) = (uint8_t)(J1_485RxBufferIndex);
/* 数据包 */
send += 2;
memcpy((char *)send, (char *)J1_485RxBuffer, J1_485RxBufferIndex);
/* 结束标志 */
send += J1_485RxBufferIndex;
*send = 0x17;
/* 队列中有空间,则将发送数据 */
if (uxQueueSpacesAvailable(mcu_uart_Queue)) {
xQueueSend(mcu_uart_Queue, &Buff, 10);
}
/* 队列无空间,将数据丢弃 */
else {
vPortFree(Buff);
}
/* 发送完成或遇到问题将buff中的数据清零 */
J1_485RxBufferIndex = 0;
}
}
/**
* @brief 接收J3口传来的数据
* @param
* @retval
*/
void J3_SensorDataAnalysis(void)
{
static uint32_t tick;
if (J3_485RxBufferIndex == 0) {
tick = xTaskGetTickCount();
}
/* 单次进入最多6ms3个时钟周期串口中有数据 */
uint32_t nowTick = xTaskGetTickCount();
while ((getTickDiff(nowTick) < 3)
&& (uart_dev_char_present(g_J3_handle) == 1)
&& (maxdataLen > J3_485RxBufferIndex)) {
J3_485RxBuffer[J3_485RxBufferIndex++] = uart_dev_in_char(g_J3_handle);
}
/* 当时间到达或者数据量到达,就打包发送给智能模块 */
if ((J3_485RxBufferIndex >= maxdataLen) || (getTickDiff(tick) > delayTick)) {
uint32_t tempLen = 6 + J3_485RxBufferIndex + slaveQueueUartSendInfoSize;
if (xPortGetFreeHeapSize() < tempLen + 1024) {
J3_485RxBufferIndex = 0;
return;
}
uint8_t *Buff = (uint8_t *)pvPortMalloc(tempLen);
slaveQueueUartSendInfo *sendBuff = (slaveQueueUartSendInfo *)Buff;
sendBuff->length = 6 + J3_485RxBufferIndex;
sendBuff->data = Buff + sizeof(slaveQueueUartSendInfo);
uint8_t *send = sendBuff->data;
/* 起始标志 */
*send = 'S';
*(send + 1) = 'L';
/* 端口号 */
send += 2;
*send = J3;
/* 数据包长度 */
send += 1;
*send = (uint8_t)(J3_485RxBufferIndex >> 8);
*(send + 1) = (uint8_t)(J3_485RxBufferIndex);
/* 数据包 */
send += 2;
memcpy((char *)send, (char *)J3_485RxBuffer, J3_485RxBufferIndex);
/* 结束标志 */
send += J3_485RxBufferIndex;
*send = 0x17;
/* 队列中有空间,则将发送数据 */
if (uxQueueSpacesAvailable(mcu_uart_Queue)) {
xQueueSend(mcu_uart_Queue, &Buff, 10);
}
/* 队列无空间,将数据丢弃 */
else {
vPortFree(Buff);
}
/* 发送完成或遇到问题将buff中的数据清零 */
J3_485RxBufferIndex = 0;
}
}
/**
* @brief 接收J5口传来的数据
* @param
* @retval
*/
void J5_SensorDataAnalysis(void)
{
static uint32_t tick;
if (J5_485RxBufferIndex == 0) {
tick = xTaskGetTickCount();
}
/* 单次进入最多6ms3个时钟周期串口中有数据 */
uint32_t nowTick = xTaskGetTickCount();
while ((getTickDiff(nowTick) < 3)
&& (uart_dev_char_present(g_J5_handle) == 1)
&& (maxdataLen > J5_485RxBufferIndex)) {
J5_485RxBuffer[J5_485RxBufferIndex++] = uart_dev_in_char(g_J5_handle);
}
/* 当时间到达或者数据量到达,就打包发送给智能模块 */
if ((J5_485RxBufferIndex >= maxdataLen) || (getTickDiff(tick) > delayTick)) {
uint32_t tempLen = 6 + J5_485RxBufferIndex + slaveQueueUartSendInfoSize;
if (xPortGetFreeHeapSize() < tempLen + 1024) {
J5_485RxBufferIndex = 0;
return;
}
uint8_t *Buff = (uint8_t *)pvPortMalloc(tempLen);
slaveQueueUartSendInfo *sendBuff = (slaveQueueUartSendInfo *)Buff;
sendBuff->length = 6 + J5_485RxBufferIndex;
sendBuff->data = Buff + sizeof(slaveQueueUartSendInfo);
uint8_t *send = sendBuff->data;
/* 起始标志 */
*send = 'S';
*(send + 1) = 'L';
/* 端口号 */
send += 2;
*send = J5;
/* 数据包长度 */
send += 1;
*send = (uint8_t)(J5_485RxBufferIndex >> 8);
*(send + 1) = (uint8_t)(J5_485RxBufferIndex);
/* 数据包 */
send += 2;
memcpy((char *)send, (char *)J5_485RxBuffer, J5_485RxBufferIndex);
/* 结束标志 */
send += J5_485RxBufferIndex;
*send = 0x17;
/* 队列中有空间,则将发送数据 */
if (uxQueueSpacesAvailable(mcu_uart_Queue)) {
xQueueSend(mcu_uart_Queue, &Buff, 10);
}
/* 队列无空间,将数据丢弃 */
else {
vPortFree(Buff);
}
/* 发送完成或遇到问题将buff中的数据清零 */
J5_485RxBufferIndex = 0;
}
}
/**
* @brief 接收J7口传来的数据
* @param
* @retval
*/
void J7_SensorDataAnalysis(void)
{
static uint32_t tick;
if (J7_485RxBufferIndex == 0) {
tick = xTaskGetTickCount();
}
/* 单次进入最多6ms3个时钟周期串口中有数据 */
uint32_t nowTick = xTaskGetTickCount();
while ((getTickDiff(nowTick) < 3)
&& (uart_dev_char_present(g_J7_handle) == 1)
&& (maxdataLen > J7_485RxBufferIndex)) {
J7_485RxBuffer[J7_485RxBufferIndex++] = uart_dev_in_char(g_J7_handle);
}
/* 当时间到达或者数据量到达,就打包发送给智能模块 */
if ((J7_485RxBufferIndex >= maxdataLen) || (getTickDiff(tick) > delayTick)) {
uint32_t tempLen = 6 + J7_485RxBufferIndex + slaveQueueUartSendInfoSize;
if (xPortGetFreeHeapSize() < tempLen + 1024) {
J7_485RxBufferIndex = 0;
return;
}
uint8_t *Buff = (uint8_t *)pvPortMalloc(tempLen);
slaveQueueUartSendInfo *sendBuff = (slaveQueueUartSendInfo *)Buff;
sendBuff->length = 6 + J7_485RxBufferIndex;
sendBuff->data = Buff + sizeof(slaveQueueUartSendInfo);
uint8_t *send = sendBuff->data;
/* 起始标志 */
*send = 'S';
*(send + 1) = 'L';
/* 端口号 */
send += 2;
*send = J7;
/* 数据包长度 */
send += 1;
*send = (uint8_t)(J7_485RxBufferIndex >> 8);
*(send + 1) = (uint8_t)(J7_485RxBufferIndex);
/* 数据包 */
send += 2;
memcpy((char *)send, (char *)J7_485RxBuffer, J7_485RxBufferIndex);
/* 结束标志 */
send += J7_485RxBufferIndex;
*send = 0x17;
/* 队列中有空间,则将发送数据 */
if (uxQueueSpacesAvailable(mcu_uart_Queue)) {
xQueueSend(mcu_uart_Queue, &Buff, 10);
}
/* 队列无空间,将数据丢弃 */
else {
vPortFree(Buff);
}
/* 发送完成或遇到问题将buff中的数据清零 */
J7_485RxBufferIndex = 0;
}
}
/**
* @brief 接收J8口传来的数据
* @param
* @retval
*/
void J8_SensorDataAnalysis(void)
{
static uint32_t tick;
if (J8_485RxBufferIndex == 0) {
tick = xTaskGetTickCount();
}
/* 单次进入最多6ms3个时钟周期串口中有数据 */
uint32_t nowTick = xTaskGetTickCount();
while ((getTickDiff(nowTick) < 3)
&& (uart_dev_char_present(g_J8_handle) == 1)
&& (maxdataLen > J8_485RxBufferIndex)) {
J8_485RxBuffer[J8_485RxBufferIndex++] = uart_dev_in_char(g_J8_handle);
}
/* 当时间到达或者数据量到达,就打包发送给智能模块 */
if ((J8_485RxBufferIndex >= maxdataLen) || (getTickDiff(tick) > delayTick)) {
uint32_t tempLen = 6 + J8_485RxBufferIndex + slaveQueueUartSendInfoSize;
if (xPortGetFreeHeapSize() < tempLen + 1024) {
J8_485RxBufferIndex = 0;
return;
}
uint8_t *Buff = (uint8_t *)pvPortMalloc(tempLen);
slaveQueueUartSendInfo *sendBuff = (slaveQueueUartSendInfo *)Buff;
sendBuff->length = 6 + J8_485RxBufferIndex;
sendBuff->data = Buff + sizeof(slaveQueueUartSendInfo);
uint8_t *send = sendBuff->data;
/* 起始标志 */
*send = 'S';
*(send + 1) = 'L';
/* 端口号 */
send += 2;
*send = J8;
/* 数据包长度 */
send += 1;
*send = (uint8_t)(J8_485RxBufferIndex >> 8);
*(send + 1) = (uint8_t)(J8_485RxBufferIndex);
/* 数据包 */
send += 2;
memcpy((char *)send, (char *)J8_485RxBuffer, J8_485RxBufferIndex);
/* 结束标志 */
send += J8_485RxBufferIndex;
*send = 0x17;
/* 队列中有空间,则将发送数据 */
if (uxQueueSpacesAvailable(mcu_uart_Queue)) {
xQueueSend(mcu_uart_Queue, &Buff, 10);
}
/* 队列无空间,将数据丢弃 */
else {
vPortFree(Buff);
}
/* 发送完成或遇到问题将buff中的数据清零 */
J8_485RxBufferIndex = 0;
}
}
/**
* @brief 接收J9口传来的数据
* @param
* @retval
*/
void J9_SensorDataAnalysis(void)
{
static uint32_t tick;
if (J9_485RxBufferIndex == 0) {
tick = xTaskGetTickCount();
}
/* 单次进入最多6ms3个时钟周期串口中有数据 */
uint32_t nowTick = xTaskGetTickCount();
while ((getTickDiff(nowTick) < 3)
&& (uart_dev_char_present(g_J9_handle) == 1)
&& (maxdataLen > J9_485RxBufferIndex)) {
J9_485RxBuffer[J9_485RxBufferIndex++] = uart_dev_in_char(g_J9_handle);
}
/* 当时间到达或者数据量到达,就打包发送给智能模块 */
if ((J9_485RxBufferIndex >= maxdataLen) || (getTickDiff(tick) > delayTick)) {
uint32_t tempLen = 6 + J9_485RxBufferIndex + slaveQueueUartSendInfoSize;
if (xPortGetFreeHeapSize() < tempLen + 1024) {
J9_485RxBufferIndex = 0;
return;
}
uint8_t *Buff = (uint8_t *)pvPortMalloc(tempLen);
slaveQueueUartSendInfo *sendBuff = (slaveQueueUartSendInfo *)Buff;
sendBuff->length = 6 + J9_485RxBufferIndex;
sendBuff->data = Buff + sizeof(slaveQueueUartSendInfo);
uint8_t *send = sendBuff->data;
/* 起始标志 */
*send = 'S';
*(send + 1) = 'L';
/* 端口号 */
send += 2;
*send = J9;
/* 数据包长度 */
send += 1;
*send = (uint8_t)(J9_485RxBufferIndex >> 8);
*(send + 1) = (uint8_t)(J9_485RxBufferIndex);
/* 数据包 */
send += 2;
memcpy((char *)send, (char *)J9_485RxBuffer, J9_485RxBufferIndex);
/* 结束标志 */
send += J9_485RxBufferIndex;
*send = 0x17;
/* 队列中有空间,则将发送数据 */
if (uxQueueSpacesAvailable(mcu_uart_Queue)) {
xQueueSend(mcu_uart_Queue, &Buff, 10);
}
/* 队列无空间,将数据丢弃 */
else {
vPortFree(Buff);
}
/* 发送完成或遇到问题将buff中的数据清零 */
J9_485RxBufferIndex = 0;
}
}