20230201_1811_emb/1811Project_LPc/Src/Usr/Task/Task-DianZiCang/UpcCommTask.c
Rjh913828050 fddc46ab1b 类型:更新
内容:1811项目下位机软件第一版完整程序
人员:任家豪
2024-07-31 08:45:23 +08:00

568 lines
26 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 "UpcCommTask.h"
#include "WatchdogTask.h"
#include "DpcCommTask.h"
#include "McuBspUart.h"
#include "FileSysTask.h"
#include "RunEnvTask.h"
#include "OutPutGpioTask.h"
#include "ToolDelay.h"
#include "RtcTask.h"
#include "RtcDrv.h"
#include "ToolCheck.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//#define DEVICE_YX
#define DEVICE_YS
/*******************************宏定义部分************************************/
#define TASK_UPC_COMM_HANDLE_DATA_BUFLEN 2100 // 数据处理存放缓存
#define TASK_UPC_COMM_HANDLE_DATA_COUNT 10 // 数据缓存条数
#define TASK_UPC_COMM_SEND_DATA_BUFLEN 2100
#define TASK_UPC_COMM_DATA_IDLING 0 // 空闲态
#define TASK_UPC_COMM_DATA_SORTING 1 // 分拣态
#define TASK_UPC_COMM_DATA_HANDLING 2 // 处理态
#define TASK_UPC_COMM_UART_ID MCU_BSP_UART6
#define TASK_UPC_COMM_UART_BANDRATE MCU_BSP_UART_BANDRATE_115200
#define TASK_UPC_COMM_UART_DATABIT MCU_BSP_UART_DATABIT_8
#define TASK_UPC_COMM_UART_STOPBIT MCU_BSP_UART_STOPBIT_ONE
#define TASK_UPC_COMM_UART_CHECKBIT MCU_BSP_UART_CHECKBIT_NONE
/********************************类型定义************************************/
typedef struct{
unsigned char HandleDataBuf[TASK_UPC_COMM_HANDLE_DATA_BUFLEN];
unsigned char HandleFlag;
unsigned short HandleCount;
} TASK_UPC_COMM_HANDLE;
/***************************设备类型与设备ID**********************************/
static unsigned int gDeviceType = 201; // 设备类型
#ifdef DEVICE_YS
static unsigned int gDeviceId = 1; // 设备ID
#endif
#ifdef DEVICE_YX
static unsigned int gDeviceId = 3; // 设备ID
#endif
/********************************** 接收缓存 *********************************/
static TASK_UPC_COMM_HANDLE gTaskCommHandleDataBuf[TASK_UPC_COMM_HANDLE_DATA_COUNT] = {{0}};
/********************************** 发送缓存 *********************************/
static unsigned char gTaskUpcCommSendDataBuf[TASK_UPC_COMM_SEND_DATA_BUFLEN] = {0};
static unsigned char gSendBufTmp[1050] = {0}; // 临时发送数据保存
/********************************** 看门狗定义 *******************************/
static int8_t gTaskUpcCommWatchDogId = -1; // 看门狗任务
static void TaskUpcCommUartCallback(uint8_t Data);
static void TaskUpcCommClearDataStatus(uint8_t CountId);
static void TaskUpcCommNormalAck(uint16_t PlatNum, uint16_t PlatId, uint8_t Result);
void TaskUpcCommInit(void)
{
McuBspUartInit(TASK_UPC_COMM_UART_ID, TASK_UPC_COMM_UART_BANDRATE, TASK_UPC_COMM_UART_DATABIT,
TASK_UPC_COMM_UART_STOPBIT, TASK_UPC_COMM_UART_CHECKBIT);
McuBspUartStartRecv(TASK_UPC_COMM_UART_ID, TaskUpcCommUartCallback);
gTaskUpcCommWatchDogId = TaskWatchdogRegEvent("TaskUpcComm");
}
void TaskUpcComm(void* arg)
{
unsigned int RealWbyte;
unsigned char i;
int k;
int j;
unsigned char crc = 0;
unsigned int TmpId;
unsigned int TmpType;
unsigned short MessageId;
unsigned short MessageNum;
unsigned short MessageLen;
/* 将解析数据任务开启写入日志 */
TaskFileLogWrite("TaskUpcComm: Join in!!\n", strlen("TaskUpcComm: Join in!!\n"), &RealWbyte);
while (1) {
OSTimeDly(5);
k = 0;
TaskWatchdogFreed(gTaskUpcCommWatchDogId);
for (i = 0; i < TASK_UPC_COMM_HANDLE_DATA_COUNT; i++) {
if (gTaskCommHandleDataBuf[i].HandleFlag == TASK_UPC_COMM_DATA_HANDLING) {
break;
}
}
if (i >= TASK_UPC_COMM_HANDLE_DATA_COUNT) {
continue;
}
/* 进行数据包解析 */
for (j = 1; j < gTaskCommHandleDataBuf[i].HandleCount - 1; j++) {
if (gTaskCommHandleDataBuf[i].HandleDataBuf[j] == 0x7f) {
TaskUpcCommClearDataStatus(i);
break;
} else if (gTaskCommHandleDataBuf[i].HandleDataBuf[j] == 0x7e) {
j++;
if (gTaskCommHandleDataBuf[i].HandleDataBuf[j] == 0x01) {
gTaskCommHandleDataBuf[i].HandleDataBuf[k] = 0x7e;
} else if (gTaskCommHandleDataBuf[i].HandleDataBuf[j] == 0x02) {
gTaskCommHandleDataBuf[i].HandleDataBuf[k] = 0x7f;
} else {
TaskUpcCommClearDataStatus(i);
break;
}
} else {
gTaskCommHandleDataBuf[i].HandleDataBuf[k] = gTaskCommHandleDataBuf[i].HandleDataBuf[j];
}
k++;
}
if (j < gTaskCommHandleDataBuf[i].HandleCount - 1) {
TaskFileLogWrite("TaskUpcComm: CMD illegal char!!\n", strlen("TaskUpcComm: CMD illegal char!!\n"), &RealWbyte);
TaskUpcCommClearDataStatus(i);
continue;
}
/* 提取消息中的终端消息ID */
MessageId = (unsigned short)((gTaskCommHandleDataBuf[i].HandleDataBuf[0] << 8) |
gTaskCommHandleDataBuf[i].HandleDataBuf[1]);
/* 提取消息中的终端类型 */
TmpType = (((unsigned int)gTaskCommHandleDataBuf[i].HandleDataBuf[2]) << 24) |
(((unsigned int)gTaskCommHandleDataBuf[i].HandleDataBuf[3]) << 16) |
(((unsigned int)gTaskCommHandleDataBuf[i].HandleDataBuf[4]) << 8) |
gTaskCommHandleDataBuf[i].HandleDataBuf[5];
/* 提取消息中的终端ID */
TmpId = (((unsigned int)gTaskCommHandleDataBuf[i].HandleDataBuf[6]) << 24) |
(((unsigned int)gTaskCommHandleDataBuf[i].HandleDataBuf[7]) << 16) |
(((unsigned int)gTaskCommHandleDataBuf[i].HandleDataBuf[8]) << 8) |
gTaskCommHandleDataBuf[i].HandleDataBuf[9];
/* 提取消息中的终端消息流水号 */
MessageNum = (unsigned short)((gTaskCommHandleDataBuf[i].HandleDataBuf[14] << 8) |
gTaskCommHandleDataBuf[i].HandleDataBuf[15]);
/* 提取消息的消息体长度 */
MessageLen = (unsigned short)((((unsigned short)(gTaskCommHandleDataBuf[i].HandleDataBuf[10] & 0x03)) << 8) |
gTaskCommHandleDataBuf[i].HandleDataBuf[11]);
crc = 0;
/* 比对终端类型与终端ID和测试软件是不是一致 */
if ((TmpType != gDeviceType) || (TmpId != gDeviceId)) {
TaskFileLogWrite("TaskUpcComm: Type or ID ERR!!\n", strlen("TaskUpcComm: Type or ID ERR!!\n"), &RealWbyte);
TaskUpcCommClearDataStatus(i);
continue;
}
/* 判断使用的校验方式并进行校验目前只支持Crc0x131的校验方式 */
if ((gTaskCommHandleDataBuf[i].HandleDataBuf[10] & 0x0c) == 0x0c) {
ToolCheckCrc8_0x31(gTaskCommHandleDataBuf[i].HandleDataBuf, k - 1, &crc);
if (crc != gTaskCommHandleDataBuf[i].HandleDataBuf[k - 1]) {
TaskFileLogWrite("TaskUpcComm: CRC ERR!!\n", strlen("TaskUpcComm: CRC ERR!!\n"), &RealWbyte);
TaskUpcCommClearDataStatus(i);
continue;
}
} else {
TaskFileLogWrite("TaskUpcComm: CRC TYPE ERR!!\n", strlen("TaskUpcComm: CRC TYPE ERR!!\n"), &RealWbyte);
TaskUpcCommClearDataStatus(i);
continue;
}
if ((gTaskCommHandleDataBuf[i].HandleDataBuf[10] & 0x20) == 0x20) {
if (MessageLen != (k - 19)) {
TaskFileLogWrite("TaskUpcComm: Message Len ERR!!\n", strlen("TaskUpcComm: Message Len ERR!!\n"), &RealWbyte);
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
TaskUpcCommClearDataStatus(i);
continue;
} else {
j = 18;
}
} else {
if (MessageLen != (k - 17)) {
TaskFileLogWrite("TaskUpcComm: Message Len ERR!!\n", strlen("TaskUpcComm: Message Len ERR!!\n"), &RealWbyte);
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
TaskUpcCommClearDataStatus(i);
continue;
} else {
j = 16;
}
}
if (MessageId == PLAT_ACK_MESSAGE_ID) {
/* 下面是对平台ACK的处理 */
TaskUpcCommClearDataStatus(i); // 不对ACK进行处理
} else if (MessageId == PLAT_CONF_TERMINAL_TIME_MESSAGE_ID) {
uint64_t Time;
DRV_RTC_TIME RtcTime;
// if (TaskFileMutexState()) {
// TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
// TaskUpcCommClearDataStatus(i);
// continue;
// }
TaskFileLogWrite("TaskUpcComm: CMD TIME SYNC!!\n", strlen("TaskUpcComm: CMD TIME SYNC!!\n"), &RealWbyte);
if (MessageLen != 8) {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
TaskUpcCommClearDataStatus(i);
continue;
}
Time = (((uint64_t)gTaskCommHandleDataBuf[i].HandleDataBuf[j]) << 56) |
(((uint64_t)gTaskCommHandleDataBuf[i].HandleDataBuf[j + 1]) << 48) |
(((uint64_t)gTaskCommHandleDataBuf[i].HandleDataBuf[j + 2]) << 40) |
(((uint64_t)gTaskCommHandleDataBuf[i].HandleDataBuf[j + 3]) << 32) |
(((uint64_t)gTaskCommHandleDataBuf[i].HandleDataBuf[j + 4]) << 24) |
(((uint64_t)gTaskCommHandleDataBuf[i].HandleDataBuf[j + 5]) << 16) |
(((uint64_t)gTaskCommHandleDataBuf[i].HandleDataBuf[j + 6]) << 8) |
((uint64_t)gTaskCommHandleDataBuf[i].HandleDataBuf[j + 7]);
RtcTime.year = Time / 10000000000;
RtcTime.month = (Time / 100000000) % 100;
RtcTime.date = (Time / 1000000) % 100;
RtcTime.hour = (Time / 10000) % 100;
RtcTime.minute = (Time / 100) % 100;
RtcTime.second = Time % 100;
if (0 > TaskRtcSyncSet(&RtcTime)) {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
} else {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_OK);
}
TaskUpcCommClearDataStatus(i);
} else if (MessageId == PLAT_ASK_TERMINAL_DATA_MESSAGE_ID) {
/* 平台请求数据 */
unsigned short ConfMessage;
unsigned char Num;
// if (TaskFileMutexState()) {
// TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
// TaskUpcCommClearDataStatus(i);
// continue;
// }
TaskFileLogWrite("TaskUpcComm: CMD ASK DATA!!\n", strlen("TaskUpcComm: CMD ASK DATA!!\n"), &RealWbyte);
ConfMessage = (((unsigned short)gTaskCommHandleDataBuf[i].HandleDataBuf[j]) << 8) |
((unsigned short)gTaskCommHandleDataBuf[i].HandleDataBuf[j + 1]);
Num = gTaskCommHandleDataBuf[i].HandleDataBuf[j + 2];
if (ConfMessage == TASK_RUN_ENV_MESSGAE_ID) {
if (Num == 0x01) {
TaskRunEnvEnable();
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_OK);
} else {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_NO_SUP);
}
} else if (ConfMessage == TASK_OUTPUT_GPIO_MESSGAE_ID) {
if (Num == 0x01) {
TaskOutPutGpioEnable();
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_OK);
} else {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_NO_SUP);
}
} else {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_NO_SUP);
}
TaskUpcCommClearDataStatus(i);
} else if (MessageId == PLAT_ASK_TERMINAL_FILE_MESSAGE_ID) {
/* 平台请求终端文件 */
int rt;
unsigned char FileType;
unsigned char FileOperation;
unsigned int time;
unsigned short Year;
unsigned char Mon;
unsigned char Day;
// if (TaskFileMutexState()) {
// TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
// TaskUpcCommClearDataStatus(i);
// continue;
// }
TaskFileLogWrite("TaskUpcComm: CMD ASK FILE!!\n", strlen("TaskUpcComm: CMD ASK FILE!!\n"), &RealWbyte);
if (0 == gTaskCommHandleDataBuf[i].HandleDataBuf[j]) {
FileType = FILE_LOG_TYPE;
} else if (5 == gTaskCommHandleDataBuf[i].HandleDataBuf[j]) {
FileType = FILE_DATA_TYPE;
} else {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_NO_SUP);
TaskUpcCommClearDataStatus(i);
continue;
}
if (0 == gTaskCommHandleDataBuf[i].HandleDataBuf[j + 1]) {
FileOperation = FILE_UPLOAD;
} else if (1 == gTaskCommHandleDataBuf[i].HandleDataBuf[j + 1]) {
FileOperation = FILE_DELETE;
} else {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
TaskUpcCommClearDataStatus(i);
continue;
}
time = (((unsigned int)gTaskCommHandleDataBuf[i].HandleDataBuf[j + 2]) << 24) |
(((unsigned int)gTaskCommHandleDataBuf[i].HandleDataBuf[j + 3]) << 16) |
(((unsigned int)gTaskCommHandleDataBuf[i].HandleDataBuf[j + 4]) << 8) |
((unsigned int)gTaskCommHandleDataBuf[i].HandleDataBuf[j + 5]);
Year = time / 10000;
Mon = (time % 10000) / 100;
Day = time % 100;
if (FileType == FILE_DATA_TYPE) {
if (TASK_RUN_ENV_MESSGAE_ID == ((((unsigned short)gTaskCommHandleDataBuf[i].HandleDataBuf[j + 6]) << 8) |
((unsigned short)gTaskCommHandleDataBuf[i].HandleDataBuf[j + 7]))) {
while (1) {
rt = TaskFileEnableSend(FILE_DATA_TYPE, Year, Mon, Day, FileOperation, TASK_RUN_FILE_TYPE);
if (rt == 0) {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_OK);
break;
} else {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
break;
}
}
} else if (TASK_OUTPUT_GPIO_MESSGAE_ID == ((((unsigned short)gTaskCommHandleDataBuf[i].HandleDataBuf[j + 6]) << 8) |
((unsigned short)gTaskCommHandleDataBuf[i].HandleDataBuf[j + 7]))) {
while (1) {
rt = TaskFileEnableSend(FILE_DATA_TYPE, Year, Mon, Day, FileOperation, TASK_OUTPUT_GPIO_FILE_TYPE);
if (rt == 0) {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_OK);
break;
} else {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
break;
}
}
} else {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_NO_SUP);
TaskUpcCommClearDataStatus(i);
continue;
}
} else if (FileType == FILE_LOG_TYPE) {
while (1) {
rt = TaskFileEnableSend(FILE_LOG_TYPE, Year, Mon, Day, FileOperation, NULL);
if (rt == 0) {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_OK);
break;
} else {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
break;
}
}
} else {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
}
TaskUpcCommClearDataStatus(i);
} else if (MessageId == PLAT_ASK_TERMINAL_RESTART_MESSAGE_ID) {
TaskFileLogWrite("TaskUpcComm: CMD ASK RESTART!!\n", strlen("TaskUpcComm: CMD ASK RESTART!!\n"), &RealWbyte);
/* 平台请求重启设备 */
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_OK);
TaskUpcCommClearDataStatus(i);
while (1) {
OSTimeDly(100);
TaskWatchdogFreed(gTaskUpcCommWatchDogId);
if (0 == TaskDpcCommSetAskEnable(RESTART_CMD_ID)) {
TaskDpcCommClearSendEndSta();
while (1 != TaskDpcCommGetSendEndSta()) {
OSTimeDly(100);
TaskWatchdogFreed(gTaskUpcCommWatchDogId);
}
break;
}
}
ToolDelayMs(1000);
SysCtlReset();
} else if (MessageId == PLAT_CONF_RELAY_CONTROL_MESSAGE_ID) {
// if (TaskFileMutexState()) {
// TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
// TaskUpcCommClearDataStatus(i);
// continue;
// }
TaskFileLogWrite("TaskUpcComm: CMD CTRL GPIO!!\n", strlen("TaskUpcComm: CMD CTRL GPIO!!\n"), &RealWbyte);
TaskOutPutGpioSet(CTD_CHANNEL_ID, gTaskCommHandleDataBuf[i].HandleDataBuf[j]);
TaskOutPutGpioSet(MANYPARA_CHANNEL_ID, gTaskCommHandleDataBuf[i].HandleDataBuf[j + 1]);
TaskOutPutGpioSet(CO2_CHANNEL_ID, gTaskCommHandleDataBuf[i].HandleDataBuf[j + 2]);
TaskOutPutGpioSet(ADCP_CHANNEL_ID, gTaskCommHandleDataBuf[i].HandleDataBuf[j + 3]);
TaskOutPutGpioSet(UV1_CHANNEL_ID, gTaskCommHandleDataBuf[i].HandleDataBuf[j + 4]);
TaskOutPutGpioSet(UV2_CHANNEL_ID, gTaskCommHandleDataBuf[i].HandleDataBuf[j + 5]);
TaskOutPutGpioSet(UV3_CHANNEL_ID, gTaskCommHandleDataBuf[i].HandleDataBuf[j + 6]);
TaskOutPutGpioSet(UV4_CHANNEL_ID, gTaskCommHandleDataBuf[i].HandleDataBuf[j + 7]);
TaskOutPutGpioSet(RESERVED_12V_CHANNEL_ID, gTaskCommHandleDataBuf[i].HandleDataBuf[j + 10]);
TaskOutPutGpioSet(RESERVED_24V_CHANNEL_ID, gTaskCommHandleDataBuf[i].HandleDataBuf[j + 9]);
TaskOutPutGpioSet(RESERVED_48V_CHANNEL_ID, gTaskCommHandleDataBuf[i].HandleDataBuf[j + 8]);
TaskOutPutGpioSet(LAMP_CHANNEL_ID, gTaskCommHandleDataBuf[i].HandleDataBuf[j + 11]);
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_OK);
TaskUpcCommClearDataStatus(i);
} else {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
TaskUpcCommClearDataStatus(i);
}
}
}
/* 发送函数 */
uint32_t TaskUpcCommSendMessage(uint16_t MessageId, uint16_t *Serial, uint8_t *SendBuf, uint32_t SendBufLen)
{
uint32_t i = 0;
uint32_t j = 0;
uint32_t k = 0;
uint32_t e =0;
uint32_t RealSendLen = 0;
uint16_t SendPiece = 0; // 发送条数,用来记录是否具有分包
uint16_t MessageProperties = 0; // 消息属性
if (Serial == NULL) {
return 0;
}
SendPiece = (SendBufLen / 1023) + 1; //计算总共需要发几条信息
for (i = 0; i < SendPiece; i++) {
if (SendPiece != 1) {
if (i != (SendPiece - 1)) {
MessageProperties = 0x2000 | 0x0c00 | 1023;
} else {
MessageProperties = 0x2000 | 0x0c00 | (SendBufLen % 1023);
}
} else {
MessageProperties = 0x0000 | 0x0c00 | SendBufLen;
}
j = 0;
/* 消息ID */
gSendBufTmp[j] = (uint8_t)((MessageId & 0xff00) >> 8);
j++;
gSendBufTmp[j] = (uint8_t)(MessageId & 0x00ff);
j++;
/* 设备类型 */
gSendBufTmp[j] = (uint8_t)((gDeviceType & 0xff000000) >> 24);
j++;
gSendBufTmp[j] = (uint8_t)((gDeviceType & 0x00ff0000) >> 16);
j++;
gSendBufTmp[j] = (uint8_t)((gDeviceType & 0x0000ff00) >> 8);
j++;
gSendBufTmp[j] = (uint8_t)(gDeviceType & 0x000000ff);
j++;
/* 设备ID号 */
gSendBufTmp[j] = (uint8_t)((gDeviceId & 0xff000000) >> 24);
j++;
gSendBufTmp[j] = (uint8_t)((gDeviceId & 0x00ff0000) >> 16);
j++;
gSendBufTmp[j] = (uint8_t)((gDeviceId & 0x0000ff00) >> 8);
j++;
gSendBufTmp[j] = (uint8_t)(gDeviceId & 0x000000ff);
j++;
/* 消息体属性 */
gSendBufTmp[j] = (uint8_t)((MessageProperties & 0xff00) >> 8);
j++;
gSendBufTmp[j] = (uint8_t)(MessageProperties & 0x00ff);
j++;
/* 协议版本号 */
gSendBufTmp[j] = 0x00;
j++;
gSendBufTmp[j] = 0x01;
j++;
/* 消息流水号 */
gSendBufTmp[j] = (uint8_t)(((*Serial) & 0xff00) >> 8);
j++;
gSendBufTmp[j] = (uint8_t)((*Serial) & 0x00ff);
j++;
/* 消息包装项 + 消息内容 */
if (SendPiece != 1) {
/* 消息总包数 */
gSendBufTmp[j] = (uint8_t)((SendPiece & 0xff00) >> 8);
j++;
gSendBufTmp[j] = (uint8_t)(SendPiece & 0x00ff);
j++;
/* 包序号 */
gSendBufTmp[j] = (uint8_t)(((i + 1) & 0xff00) >> 8);
j++;
gSendBufTmp[j] = (uint8_t)((i + 1) & 0x00ff);
j++;
if (i != (SendPiece - 1)) {
memcpy(&gSendBufTmp[j], &(SendBuf[1023 * i]), 1023);
j += 1023;
} else {
memcpy(&gSendBufTmp[j], &(SendBuf[1023 * i]), SendBufLen % 1023);
j += (SendBufLen % 1023);
}
} else {
if ((SendBuf != NULL) && (SendBufLen != 0)) {
memcpy(&gSendBufTmp[j], SendBuf, SendBufLen);
j += SendBufLen;
}
}
/* 进行校验 */
gSendBufTmp[j] = 0;
ToolCheckCrc8_0x31(gSendBufTmp, j, &gSendBufTmp[j]);
j++;
/* 进行转义 */
e = 0;
gTaskUpcCommSendDataBuf[e] = 0x7f; // 标志位
e++;
for (k = 0; k < j; k++) {
if (gSendBufTmp[k] == 0x7e) {
gTaskUpcCommSendDataBuf[e] = 0x7e;
e++;
gTaskUpcCommSendDataBuf[e] = 0x01;
e++;
} else if (gSendBufTmp[k] == 0x7f) {
gTaskUpcCommSendDataBuf[e] = 0x7e;
e++;
gTaskUpcCommSendDataBuf[e] = 0x02;
e++;
} else {
gTaskUpcCommSendDataBuf[e] = gSendBufTmp[k];
e++;
}
}
gTaskUpcCommSendDataBuf[e] = 0x7f; // 标志位
e++;
/* 发送数据 */
McuBspUartSendData(TASK_UPC_COMM_UART_ID, gTaskUpcCommSendDataBuf, e);
RealSendLen += e;
}
return RealSendLen;
}
static void TaskUpcCommUartCallback(uint8_t Data)
{
if (Data == 0x7f) {
int i;
for (i = 0; i < TASK_UPC_COMM_HANDLE_DATA_COUNT; i++) {
if (gTaskCommHandleDataBuf[i].HandleFlag == TASK_UPC_COMM_DATA_SORTING) {
if (gTaskCommHandleDataBuf[i].HandleCount < 18) { // 18为数据包最小单位长度
/* 该帧数据错误,将该帧数据变成空闲态,并清空内部长度 */
gTaskCommHandleDataBuf[i].HandleFlag = TASK_UPC_COMM_DATA_IDLING;
gTaskCommHandleDataBuf[i].HandleCount = 0;
break;
} else {
/* 将数据保存在帧数据中,表示一帧数据的完成 */
gTaskCommHandleDataBuf[i].HandleDataBuf[gTaskCommHandleDataBuf[i].HandleCount] = Data;
gTaskCommHandleDataBuf[i].HandleCount++;
gTaskCommHandleDataBuf[i].HandleCount = (unsigned short)(gTaskCommHandleDataBuf[i].HandleCount % TASK_UPC_COMM_HANDLE_DATA_BUFLEN);
gTaskCommHandleDataBuf[i].HandleFlag = TASK_UPC_COMM_DATA_HANDLING;
return;
}
}
}
for (i = 0; i < TASK_UPC_COMM_HANDLE_DATA_COUNT; i++) {
/* 上面的逻辑排除了接收态,所以只剩空闲态 */
if (gTaskCommHandleDataBuf[i].HandleFlag == TASK_UPC_COMM_DATA_IDLING) {
gTaskCommHandleDataBuf[i].HandleDataBuf[gTaskCommHandleDataBuf[i].HandleCount] = Data;
gTaskCommHandleDataBuf[i].HandleCount++;
gTaskCommHandleDataBuf[i].HandleCount = (unsigned short)(gTaskCommHandleDataBuf[i].HandleCount % TASK_UPC_COMM_HANDLE_DATA_BUFLEN);
gTaskCommHandleDataBuf[i].HandleFlag = TASK_UPC_COMM_DATA_SORTING;
break;
}
}
} else {
int i;
for (i = 0; i < TASK_UPC_COMM_HANDLE_DATA_COUNT; i++) {
if (gTaskCommHandleDataBuf[i].HandleFlag == TASK_UPC_COMM_DATA_SORTING) {
gTaskCommHandleDataBuf[i].HandleDataBuf[gTaskCommHandleDataBuf[i].HandleCount] = Data;
gTaskCommHandleDataBuf[i].HandleCount++;
gTaskCommHandleDataBuf[i].HandleCount = (unsigned short)(gTaskCommHandleDataBuf[i].HandleCount % TASK_UPC_COMM_HANDLE_DATA_BUFLEN);
break;
}
}
}
}
static void TaskUpcCommNormalAck(uint16_t PlatNum, uint16_t PlatId, uint8_t Result)
{
uint8_t Ack[5] = {0};
static uint16_t Serial = 0;
Ack[0] = (uint8_t)((PlatNum & 0xff00) >> 8);
Ack[1] = (uint8_t)(PlatNum & 0x00ff);
Ack[2] = (uint8_t)((PlatId & 0xff00) >> 8);
Ack[3] = (uint8_t)(PlatId & 0x00ff);
Ack[4] = Result;
TaskUpcCommSendMessage(0x0000, &Serial, Ack, sizeof(Ack));
Serial++;
}
/* 清除接收buf */
static void TaskUpcCommClearDataStatus(uint8_t CountId)
{
gTaskCommHandleDataBuf[CountId].HandleFlag = TASK_UPC_COMM_DATA_IDLING;
gTaskCommHandleDataBuf[CountId].HandleCount = 0;
}