...
|
...
|
@@ -8,12 +8,13 @@ |
|
|
#include <termios.h>
|
|
|
#include <sys/time.h>
|
|
|
#include "JZsdk_uart/Uart_Config.h"
|
|
|
#include "JZsdk_Uart_Recv/JZsdk_Uart_RecvDeal.h"
|
|
|
|
|
|
#include "JZsdkLib.h"
|
|
|
#include "JZsdk_uart/JZsdk_Uart_Input.h"
|
|
|
#include "JZsdk_TaskManagement/TaskManagement.h"
|
|
|
#include "JZsdk_Uart_UartDeal.h"
|
|
|
|
|
|
#include "Hal_Recv/HalRecv_type1/HalRecv_type1.h"
|
|
|
|
|
|
#if APP_VERSION == APP_PSDK
|
|
|
#include "data_transmission/test_data_transmission.h"
|
...
|
...
|
@@ -301,7 +302,7 @@ static void *UartDeal_deal(void *arg) |
|
|
if (args->MessageLength > 0)
|
|
|
{
|
|
|
//处理数据
|
|
|
ResidualLength = UartDeal_Recv_interface(0, args->UartFd, args->Message, args->MessageLength);
|
|
|
ResidualLength = HalRecv_tpye1_PreliminaryScreeningOfData(args->Message, args->MessageLength, args->UartDevName);
|
|
|
|
|
|
//如果还有剩余的长度
|
|
|
if (ResidualLength != 0) //将其返还到缓冲区
|
...
|
...
|
@@ -357,346 +358,6 @@ static void *UartDeal_deal(void *arg) |
|
|
**********************************************************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
数据排出函数
|
|
|
|
|
|
*/
|
|
|
static int UartDeal_Recv_Ouput(int tpye, int fd, unsigned char *getbuf, int ReadLen)
|
|
|
{
|
|
|
//JZSDK_LOG_INFO("UartDeal_Recv_Ouput排出函数%d",ReadLen);
|
|
|
if (tpye == 0)
|
|
|
{
|
|
|
if (fd == Uart_DEV1_fd)
|
|
|
{
|
|
|
JZsdk_Uart_RecvDeal_CharmDeal(UART_DEV_1, getbuf, ReadLen);
|
|
|
|
|
|
}
|
|
|
else if (fd == Uart_DEV2_fd)
|
|
|
{
|
|
|
JZsdk_Uart_RecvDeal_CharmDeal(UART_DEV_2, getbuf, ReadLen);
|
|
|
}
|
|
|
else if (fd == Uart_4G_fd)
|
|
|
{
|
|
|
JZsdk_Uart_RecvDeal_CharmDeal(UART_4G, getbuf, ReadLen);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
JZSDK_LOG_ERROR("接收到的数据不是从正常串口来的");
|
|
|
return 0;
|
|
|
}
|
|
|
}
|
|
|
else if (tpye == 1)
|
|
|
{
|
|
|
if (fd == HAL_DATA_TRANSMISSION)
|
|
|
{
|
|
|
JZsdk_Uart_RecvDeal_CharmDeal(HAL_DATA_TRANSMISSION, getbuf, ReadLen);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
JZSDK_LOG_ERROR("接收到的数据不是从hal_transmisson来的");
|
|
|
return 0;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
|
|
|
处理数据接口,返回没有处理的数据长度
|
|
|
|
|
|
*/
|
|
|
int UartDeal_Recv_interface(int type, int Uart_fd , unsigned char *getbuf, int getbufLen)
|
|
|
{
|
|
|
//0即是串口内容
|
|
|
if (type == 0)
|
|
|
{
|
|
|
if (Uart_fd == Uart_DEV1_fd)
|
|
|
{
|
|
|
//JZSDK_LOG_INFO("串口-设备1号,接受到数据+未处理数据的长度len: %d", getbufLen);
|
|
|
}
|
|
|
else if (Uart_fd == Uart_DEV2_fd)
|
|
|
{
|
|
|
//JZSDK_LOG_INFO("串口-设备2号,接受到数据+未处理数据的长度len: %d", getbufLen);
|
|
|
}
|
|
|
else if (Uart_fd == Uart_4G_fd)
|
|
|
{
|
|
|
//JZSDK_LOG_INFO("串口-设备4G,接受到数据+未处理数据的长度len: %d", getbufLen);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
JZSDK_LOG_ERROR("接收到的数据不是从正常串口来的");
|
|
|
return 0;
|
|
|
}
|
|
|
}
|
|
|
else if (type == 1)
|
|
|
{
|
|
|
if (Uart_fd == HAL_DATA_TRANSMISSION)
|
|
|
{
|
|
|
//JZSDK_LOG_INFO("hal_data,接受到数据+未处理数据的长度len: %d", getbufLen);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
JZSDK_LOG_ERROR("接收到的数据不是从hal_transmisson来的");
|
|
|
return 0;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 是否要打印内容
|
|
|
// printf("getbuf: %s\n", getbuf);
|
|
|
// for (int i = 0; i < getbufLen; i++)
|
|
|
// {
|
|
|
// printf("%x ", getbuf[i]);
|
|
|
// }
|
|
|
// printf("\n");
|
|
|
|
|
|
int HaveReadLen = 0; // 已读长度
|
|
|
int HaveDealLen = 0; // 已处理长度
|
|
|
int FrameFlag = 0; // 帧标志
|
|
|
int FrameLen = 0;
|
|
|
|
|
|
// 检索出帧数据
|
|
|
|
|
|
// 遍历数据找帧头,直到数据的倒数第4位,如果这里有帧,帧存在帧头3位+数据长度两位
|
|
|
|
|
|
//printf("遍历开始\n");
|
|
|
for (HaveReadLen = 0; HaveReadLen < (getbufLen - 4); )
|
|
|
{
|
|
|
// 1、如果找到 5A 5B 6A 6B 判断是否是帧
|
|
|
switch (getbuf[HaveReadLen])
|
|
|
{
|
|
|
case 0x5A:
|
|
|
if ( (getbuf[HaveReadLen + 1] == 0x5A) && (getbuf[HaveReadLen + 2] == 0x77))
|
|
|
{
|
|
|
//JZSDK_LOG_INFO("输入5A");
|
|
|
FrameFlag = 0x5A;
|
|
|
break;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
FrameFlag = 0x00;
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
case 0x5B:
|
|
|
if ((getbuf[HaveReadLen + 1] == 0x5B) && (getbuf[HaveReadLen + 2] == 0x77))
|
|
|
{
|
|
|
//JZSDK_LOG_INFO("输入5B");
|
|
|
FrameFlag = 0x5B;
|
|
|
break;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
FrameFlag = 0x00;
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
case 0x6A:
|
|
|
if ((getbuf[HaveReadLen + 1] == 0x6A) && (getbuf[HaveReadLen + 2] == 0x77))
|
|
|
{
|
|
|
//JZSDK_LOG_INFO("输入6A");
|
|
|
FrameFlag = 0x6A;
|
|
|
break;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
FrameFlag = 0x00;
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
case 0x6B:
|
|
|
if ((getbuf[HaveReadLen + 1] == 0x6B) && (getbuf[HaveReadLen + 2] == 0x77))
|
|
|
{
|
|
|
//JZSDK_LOG_INFO("输入6B");
|
|
|
FrameFlag = 0x6B;
|
|
|
break;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
FrameFlag = 0x00;
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
default:
|
|
|
FrameFlag = 0x00;
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
if (FrameFlag == 0)
|
|
|
{
|
|
|
if (HaveReadLen >= (getbufLen - 5))
|
|
|
{
|
|
|
//JZSDK_LOG_INFO("没有找到帧头");
|
|
|
}
|
|
|
HaveReadLen++;
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
// 3、如果有帧头,则先判断前面有没有多余的数据残留,并将其排出到处理线程
|
|
|
if ((HaveReadLen - HaveDealLen) > 0)
|
|
|
{
|
|
|
//JZSDK_LOG_INFO("残余处理%d",(HaveReadLen - HaveDealLen));
|
|
|
UartDeal_Recv_Ouput(type, Uart_fd, &getbuf[HaveDealLen], (HaveReadLen - HaveDealLen));
|
|
|
HaveDealLen = HaveReadLen;
|
|
|
}
|
|
|
|
|
|
// 4、检查帧长度是否超过数组剩余内容
|
|
|
FrameLen = (((int)getbuf[HaveReadLen+3]) << 8) + (int)getbuf[HaveReadLen+4];
|
|
|
if (FrameLen > (getbufLen - HaveReadLen))
|
|
|
{
|
|
|
JZSDK_LOG_DEBUG("当前帧长度位长度%d 超出剩余帧长度%d ",FrameLen,(getbufLen - HaveReadLen));
|
|
|
// 直接跳出for循环
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
//5、检查帧长度是否为0,避免卡死接收串口
|
|
|
if (FrameLen == 0)
|
|
|
{
|
|
|
JZSDK_LOG_ERROR("严重错误,接收到的帧出现长度为空");
|
|
|
//直接清空接收的数组
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
// 6、以上检查都没问题,则正常输出帧
|
|
|
//JZSDK_LOG_INFO("正常输出帧%d",FrameLen);
|
|
|
UartDeal_Recv_Ouput(type, Uart_fd, &getbuf[HaveReadLen], FrameLen);
|
|
|
HaveReadLen = HaveReadLen + FrameLen;
|
|
|
HaveDealLen = HaveReadLen;
|
|
|
|
|
|
JZSDK_LOG_INFO("fd:%x f_len%d h_r%d [h_r]:%x get%d", Uart_fd,FrameLen ,HaveReadLen, getbuf[HaveReadLen-1], getbufLen);
|
|
|
|
|
|
FrameLen = 0;
|
|
|
FrameFlag = 0;
|
|
|
}
|
|
|
|
|
|
//JZSDK_LOG_INFO("UartDeal_Recv_Ouput%d %d %d",HaveDealLen,HaveReadLen , getbufLen);
|
|
|
|
|
|
// 如果没有数据残留了
|
|
|
if (HaveDealLen >= getbufLen)
|
|
|
{
|
|
|
//printf("HaveReadLen:%d HaveDealLen%d getbufLen:%d\n",HaveReadLen,HaveDealLen,getbufLen);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
// 如果是有帧头的情况跳出的,说明是帧被切了,需要返回帧长度给接收线程
|
|
|
if (FrameFlag != 0) //bu
|
|
|
{
|
|
|
// 1、判断帧的长度会不会不合理,帧的长度最大为文件名帧,其长度为9+2+400
|
|
|
if (FrameLen > (9 + 2 + 400))
|
|
|
{
|
|
|
// 将其排出不返回
|
|
|
UartDeal_Recv_Ouput(type, Uart_fd, &getbuf[HaveReadLen], (getbufLen - HaveReadLen));
|
|
|
HaveDealLen = HaveReadLen;
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
printf("切帧返回%d\n",(getbufLen - HaveDealLen));
|
|
|
|
|
|
// 2、如果合理,则返回剩余长度
|
|
|
return (getbufLen - HaveDealLen);
|
|
|
}
|
|
|
|
|
|
// 如果是没有帧头的情况下跳出的
|
|
|
// 1、先检查 未经检查最后 最后4 3位
|
|
|
//如果还有4 或者 3 位未处理
|
|
|
for (; HaveReadLen < getbufLen - 2; HaveReadLen++)
|
|
|
{
|
|
|
if ((getbuf[HaveReadLen] == 0x5A && getbuf[HaveReadLen + 1] == 0x5A && getbuf[HaveReadLen + 2] == 0x77) ||
|
|
|
(getbuf[HaveReadLen] == 0x5B && getbuf[HaveReadLen + 1] == 0x5B && getbuf[HaveReadLen + 2] == 0x77) ||
|
|
|
(getbuf[HaveReadLen] == 0x6A && getbuf[HaveReadLen + 1] == 0x6A && getbuf[HaveReadLen + 2] == 0x77) ||
|
|
|
(getbuf[HaveReadLen] == 0x6B && getbuf[HaveReadLen + 1] == 0x6B && getbuf[HaveReadLen + 2] == 0x77))
|
|
|
{
|
|
|
if ((HaveReadLen - HaveDealLen) > 0)
|
|
|
{
|
|
|
UartDeal_Recv_Ouput(type, Uart_fd, &getbuf[HaveDealLen], (HaveReadLen - HaveDealLen));
|
|
|
HaveDealLen = HaveReadLen;
|
|
|
}
|
|
|
|
|
|
printf("检查最后3 4位%d\n",(getbufLen - HaveDealLen));
|
|
|
|
|
|
return (getbufLen - HaveDealLen);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 2、检查最后两位
|
|
|
// 如果还有两位未处理
|
|
|
for (; HaveReadLen < getbufLen - 1; HaveReadLen++)
|
|
|
{
|
|
|
if ((getbuf[HaveReadLen] == 0x5A && getbuf[HaveReadLen + 1] == 0x5A) ||
|
|
|
(getbuf[HaveReadLen] == 0x5B && getbuf[HaveReadLen + 1] == 0x5B) ||
|
|
|
(getbuf[HaveReadLen] == 0x6A && getbuf[HaveReadLen + 1] == 0x6A) ||
|
|
|
(getbuf[HaveReadLen] == 0x6B && getbuf[HaveReadLen + 1] == 0x6B))
|
|
|
{
|
|
|
if ((HaveReadLen - HaveDealLen) > 0)
|
|
|
{
|
|
|
UartDeal_Recv_Ouput(type, Uart_fd, &getbuf[HaveDealLen], (HaveReadLen - HaveDealLen));
|
|
|
HaveDealLen = HaveReadLen;
|
|
|
}
|
|
|
|
|
|
printf("检查最后两位%d\n",(getbufLen - HaveDealLen));
|
|
|
|
|
|
return (getbufLen - HaveDealLen);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 2、检查最后一位
|
|
|
// 如果还有一位未处理
|
|
|
for (; HaveReadLen < getbufLen - 0; HaveReadLen++)
|
|
|
{
|
|
|
// 1、检查最后一位
|
|
|
if (getbuf[HaveReadLen] == 0x5A ||
|
|
|
getbuf[HaveReadLen] == 0x5B ||
|
|
|
getbuf[HaveReadLen] == 0x6A ||
|
|
|
getbuf[HaveReadLen] == 0x6B)
|
|
|
{
|
|
|
if ((HaveReadLen - HaveDealLen) > 0)
|
|
|
{
|
|
|
UartDeal_Recv_Ouput(type, Uart_fd, &getbuf[HaveDealLen], (HaveReadLen - HaveDealLen));
|
|
|
HaveDealLen = HaveReadLen;
|
|
|
}
|
|
|
|
|
|
printf("检查最后一位%d\n",(getbufLen - HaveDealLen));
|
|
|
|
|
|
return (getbufLen - HaveDealLen);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 都检查完了,还是没有帧头在里面, 将剩余的所有数据排出
|
|
|
UartDeal_Recv_Ouput(type, Uart_fd, &getbuf[HaveDealLen], (HaveReadLen - HaveDealLen));
|
|
|
printf("检查完毕,排出剩余数据HaveReadLen:%d HaveDealLen%d getbufLen:%d\n",HaveReadLen,HaveDealLen,getbufLen);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
/**********
|
|
|
*
|
|
|
* 无任务发送函数
|
|
|
*
|
|
|
* ***********/
|
|
|
T_JZsdkReturnCode JZsdk_Uart_UartSend_NotTask(int Uart_Name, unsigned char *str, int str_lenth)
|
|
|
{
|
|
|
if (Uart_Name == UART_4G)
|
|
|
{
|
|
|
printf("向4G设备发送\n");
|
|
|
write(Uart_4G_fd, str, str_lenth);
|
|
|
}
|
|
|
else if (Uart_Name == UART_DEV_1)
|
|
|
{
|
|
|
printf("向串口1号设备发送\n");
|
|
|
write(Uart_DEV1_fd, str, str_lenth);
|
|
|
}
|
|
|
else if (Uart_Name = UART_DEV_2)
|
|
|
{
|
|
|
printf("向串口2号设备发送\n");
|
|
|
write(Uart_DEV2_fd, str, str_lenth);
|
|
|
}
|
|
|
|
|
|
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
|
|
|
}
|
|
|
|
|
|
typedef struct {
|
|
|
char* str;
|
|
|
int str_lenth;
|
...
|
...
|
|