diff --git a/TestComm/app/src/main/cpp/SensorsProtocol.cpp b/TestComm/app/src/main/cpp/SensorsProtocol.cpp index 24bb98b7..e9e7c847 100644 --- a/TestComm/app/src/main/cpp/SensorsProtocol.cpp +++ b/TestComm/app/src/main/cpp/SensorsProtocol.cpp @@ -640,12 +640,21 @@ void Gm_OpenSerialPort(int devidx) // 关闭串口通讯 void Gm_CloseSerialPort(void) { + int i; + for(i=0; i 0) + { + close(serialport[i].fd); + serialport[i].fd = -1; + } + } } /******************************************************************************* -函数名称: kal_uint16 GM_SerialComSend(const BYTE * cSendBuf, DWORD nSendLen, int commid) +函数名称: int GM_SerialComSend(const BYTE * cSendBuf, DWORD nSendLen, int commid) 功能说明:串口发送数据 返回实际发送的字节数 输入参数: 输出参数: @@ -668,9 +677,9 @@ int GM_SerialComSend(unsigned char * cSendBuf, unsigned long nSendLen, int commi } else if(len > 0) { - memset(szbuf, 0, sizeof(szbuf)); - sprintf(szbuf, "串口%d发送%d字节:", commid+1, len); - BytestreamLOG(szbuf, cSendBuf, len, 'D'); + //memset(szbuf, 0, sizeof(szbuf)); + //sprintf(szbuf, "串口%d发送%d字节:", commid+1, len); + //BytestreamLOG(szbuf, cSendBuf, len, 'D'); #if 0 for (i = 0; i < len; i++) { @@ -697,22 +706,250 @@ int Gm_SetSerialPortParam(int commid) return ret; } +void Gm_InitSerialComm_Test(void) +{ + int i, j; + + srdt.sampling = 0; + srdt.PtzCmdType = Cmd_Cancel; // 云台指令类型 + for(i=0; i*/ sprintf(devparam[i].pathname, "/dev/ttyS0"); + devparam[i].commid = 0; break; default: devparam[i].IsNoInsta = 0; @@ -834,9 +1072,10 @@ void GM_StartSerialComm(void) { int i, j; char szbuf[64]; + long polltime=0; // 测试使用初始化配置 - //Gm_InitSerialComm(); + Gm_InitSerialComm(); //DebugStringPrintf(szbuf, strlen(szbuf), 1); memset((void*)srdt.curdevidx, 0, sizeof(srdt.curdevidx)); //Gm_OpenSerialPower(); /* 不在这使用*/ @@ -853,6 +1092,7 @@ void GM_StartSerialComm(void) } for(i=0; i 0) break; flag = -1; - if(srdt.ms_dev[curidx].IsNeedSerial == 0) - continue; switch(devparam[curidx].ProtocolIdx) { case WEATHER_PROTOCOL: /* 温湿度气压*/ @@ -1079,15 +1329,18 @@ void GM_IsCloseSensors(void) case RALLY_PROTOCOL: /* 拉力*/ case WIND_PROTOCOL: /* 风速风向*/ case SLANT_PROTOCOL: /* 倾角*/ - if(srdt.ms_dev[i].FirstCmdTimeCnt >20*1000/TIMER_CNT) + if((get_msec()-srdt.ms_dev[i].FirstCmdTimeCnt > 50*1000) ||(get_msec()-srdt.ms_dev[i].FirstCmdTimeCnt < 0)) + { + srdt.ms_dev[i].FirstCmdTimeCnt = get_msec(); + break; + } + if(get_msec()- srdt.ms_dev[i].FirstCmdTimeCnt > 15*1000) { srdt.ms_dev[i].IsNeedSerial = 0; // 关闭传感器电源 - LOGI("因读取装置%d数据超过20秒,关闭装置%d电源!", i+1, i+1); + LOGI("读取装置%d数据%0.3f秒,关闭装置%d电源!", i+1, (get_msec()-srdt.ms_dev[i].FirstCmdTimeCnt)/1000.0,i+1); //Gm_CtrlCloseSensorsPower(i); } - else - srdt.ms_dev[i].FirstCmdTimeCnt++; break; case PELCO_D_PROTOCOL: /* 摄像机类型*/ case PELCO_P_PROTOCOL: /* 摄像机类型*/ @@ -1140,29 +1393,30 @@ void GM_AllSerialComRecv(void) } /******************************************************************************** -函数名称: void GM_ReadWireTemAndCloseTimer() +函数名称: int GM_CloseTimer() 功能说明: 输入参数: 输出参数: 其它说明: *********************************************************************************/ -void GM_ReadWireTemAndCloseTimer(void) +int GM_CloseTimer(void) { int i, j, iretime; char buf[256]; for(i=0; idevparam[i].ProtocolIdx))) break; } if(i < MAX_SERIAL_DEV_NUM) { - return; // 寻找 + return 1; // 寻找 } else // 关闭所有串口及电源 { +#if 0 for(i=0; iSendCmdFlag && (pPortParam->RevCmdFlag == 0)) { pPortParam->RetryTimeCnt++; - if(srdt.sendphotocmdcnt > 0) - idelay = 10*1000/TIMER_CNT; + //if(srdt.sendphotocmdcnt > 0) + // idelay = 10*1000/TIMER_CNT; + //LOGV("polltime:%ldms", get_msec()-srdt.ms_dev[0].FirstCmdTimeCnt); if(pPortParam->RetryTimeCnt < (pPortParam->RetryTime+idelay)) { return; @@ -1558,6 +1823,8 @@ void SendCmdFormPollCmdBuf( int port ) sprintf(buf, "发送串口%d 装置%d命令:", port+1, srdt.curdevidx[port]+1); BytestreamLOG(buf, &pPortParam->PollCmd[i+2], len, 'D'); + LOGW("sendtimeconst= %ld", get_msec()-lsendtime); + lsendtime = get_msec(); } pPortParam->SendCmdFlag = 1; pPortParam->ReSendCmdFlag = 0; @@ -2027,21 +2294,21 @@ BYTE Gm_Pelco_DCheck( BYTE *msg, int len ) int FindNextShxyProtocolCommand( int devidx ) { //如果命令缓冲区仍有命令,则退出本函数 - if((srdt.ms_dev[devidx].UseSerialidx < 1) || (srdt.ms_dev[devidx].UseSerialidx >= MAX_SERIAL_PORT_NUM)) + if((devparam[devidx].commid+1 < 1) || (devparam[devidx].commid+1 >= MAX_SERIAL_PORT_NUM)) return -1; - if(srdt.ms_dev[devidx].SerialCmdidx == 0) + //if(srdt.ms_dev[devidx].SerialCmdidx == 0) { - if(srdt.ms_dev[devidx].FirstCmdTimeCnt < 1*1000) + if(get_msec()-srdt.ms_dev[devidx].FirstCmdTimeCnt < 3*1000) { //srdt.ms_dev[devidx].FirstCmdTimeCnt++; return -1; } - if(SLANT_PROTOCOL == devparam[devidx].ProtocolIdx) - MakeShxyProtocolPollCommand(devidx, 0x06); - else if(WEATHER_PROTOCOL== devparam[devidx].ProtocolIdx) + //if(SLANT_PROTOCOL == devparam[devidx].ProtocolIdx) + // MakeShxyProtocolPollCommand(devidx, 0x06); + //else if(WEATHER_PROTOCOL== devparam[devidx].ProtocolIdx) MakeShxyProtocolPollCommand(devidx, 0x09); - else - MakeShxyProtocolPollCommand(devidx, 0x08); + //else + //MakeShxyProtocolPollCommand(devidx, 0x08); srdt.curdevidx[srdt.ms_dev[devidx].UseSerialidx] = devidx; return 1; } diff --git a/TestComm/app/src/main/cpp/SensorsProtocol.h b/TestComm/app/src/main/cpp/SensorsProtocol.h index 505f0226..aed28963 100644 --- a/TestComm/app/src/main/cpp/SensorsProtocol.h +++ b/TestComm/app/src/main/cpp/SensorsProtocol.h @@ -37,8 +37,6 @@ typedef unsigned char BYTE; #define MAX_SERIAL_DEV_NUM 25 /* 最大接串口传感器数量*/ #define MAX_SERIAL_PORT_NUM 3 /* 最大串口数量*/ -#define TIMER_CNT 10 // Poll命令定时器时间 50 ms - #define WEATHER_PROTOCOL 1 /* 温湿度协议序号*/ #define WIND_PROTOCOL 2 /* 风速风向协议序号*/ #define SLANT_PROTOCOL 3 /* 倾斜角协议序号*/ @@ -60,7 +58,7 @@ typedef unsigned char BYTE; #define MAX_PHOTO_FRAME_LEN 256 /* 图片数据一包最大长度*/ #define RECVDATA_MAXLENTH 2048 /* 接收数据缓冲区最大值*/ -#define TIMER_CNT 10 // Poll命令定时器时间 50 ms +#define TIMER_CNT 50 // Poll命令定时器时间 5 ms #define SENDDATA_MAXLENTH RECVDATA_MAXLENTH /* 正常发送数据缓冲区最大值*/ // 摄像机控制命令宏定义 @@ -208,7 +206,7 @@ typedef struct 2、解密1->b*/ int enrecvtime; /* 发送加密命令后接收到应答计时*/ - int FirstCmdTimeCnt; /* 读取雨量计时计数*/ + long FirstCmdTimeCnt; /* 串口读取数据起始时间*/ u_char nextcmd; /* 第二次发送读取气象雨量命令 加密使用: 0x00,无加密动作; @@ -233,7 +231,6 @@ typedef struct u_char IsGprs; /* GPRS网络是否注册*/ u_char IsHexToAt; /* 串口1是否使用At指令(0:使用At指令;1:使用16进制数据传输)*/ - u_char CommMod; /* 通讯模式(0:自动切换通讯模式;1:手动强制使用光网通讯;2:手动强制使用GPRS通讯)*/ u_char sampling; /* 正在进行采样(0:没有进行采样;1:正在进行采样;)*/ u_char clcyesampling; /* 正在进行采样(0:没有进行采样;1:正在进行采样;)*/ @@ -335,8 +332,8 @@ void Gm_FindAllSensorsCommand(void); void GM_IsCloseSensors(void); //检查所有串口是否有数据接收,有则启动接收 void GM_AllSerialComRecv(void); -//读取被动接收的测温球数据以及判断是否需要关闭定时器 -void GM_ReadWireTemAndCloseTimer(void); +//判断是否需要关闭定时器 +int GM_CloseTimer(void); // 串口接收数据处理 void SerialDataProcess(int devidx, u_char *buf, int len); diff --git a/TestComm/app/src/main/cpp/native-lib.cpp b/TestComm/app/src/main/cpp/native-lib.cpp index 9ae8fe81..0b571354 100644 --- a/TestComm/app/src/main/cpp/native-lib.cpp +++ b/TestComm/app/src/main/cpp/native-lib.cpp @@ -662,7 +662,7 @@ Java_com_xinyingpower_testcomm_MainActivity_testSpi( //set12VEnable(true); //serial_port_comm(); - + GM_StartSerialComm(); //lxy modify modify //LOGE("_test_ setRS485Enable false"); //setRS485Enable(false); diff --git a/app/src/main/cpp/SensorsProtocol.cpp b/app/src/main/cpp/SensorsProtocol.cpp index 24bb98b7..e9e7c847 100644 --- a/app/src/main/cpp/SensorsProtocol.cpp +++ b/app/src/main/cpp/SensorsProtocol.cpp @@ -640,12 +640,21 @@ void Gm_OpenSerialPort(int devidx) // 关闭串口通讯 void Gm_CloseSerialPort(void) { + int i; + for(i=0; i 0) + { + close(serialport[i].fd); + serialport[i].fd = -1; + } + } } /******************************************************************************* -函数名称: kal_uint16 GM_SerialComSend(const BYTE * cSendBuf, DWORD nSendLen, int commid) +函数名称: int GM_SerialComSend(const BYTE * cSendBuf, DWORD nSendLen, int commid) 功能说明:串口发送数据 返回实际发送的字节数 输入参数: 输出参数: @@ -668,9 +677,9 @@ int GM_SerialComSend(unsigned char * cSendBuf, unsigned long nSendLen, int commi } else if(len > 0) { - memset(szbuf, 0, sizeof(szbuf)); - sprintf(szbuf, "串口%d发送%d字节:", commid+1, len); - BytestreamLOG(szbuf, cSendBuf, len, 'D'); + //memset(szbuf, 0, sizeof(szbuf)); + //sprintf(szbuf, "串口%d发送%d字节:", commid+1, len); + //BytestreamLOG(szbuf, cSendBuf, len, 'D'); #if 0 for (i = 0; i < len; i++) { @@ -697,22 +706,250 @@ int Gm_SetSerialPortParam(int commid) return ret; } +void Gm_InitSerialComm_Test(void) +{ + int i, j; + + srdt.sampling = 0; + srdt.PtzCmdType = Cmd_Cancel; // 云台指令类型 + for(i=0; i*/ sprintf(devparam[i].pathname, "/dev/ttyS0"); + devparam[i].commid = 0; break; default: devparam[i].IsNoInsta = 0; @@ -834,9 +1072,10 @@ void GM_StartSerialComm(void) { int i, j; char szbuf[64]; + long polltime=0; // 测试使用初始化配置 - //Gm_InitSerialComm(); + Gm_InitSerialComm(); //DebugStringPrintf(szbuf, strlen(szbuf), 1); memset((void*)srdt.curdevidx, 0, sizeof(srdt.curdevidx)); //Gm_OpenSerialPower(); /* 不在这使用*/ @@ -853,6 +1092,7 @@ void GM_StartSerialComm(void) } for(i=0; i 0) break; flag = -1; - if(srdt.ms_dev[curidx].IsNeedSerial == 0) - continue; switch(devparam[curidx].ProtocolIdx) { case WEATHER_PROTOCOL: /* 温湿度气压*/ @@ -1079,15 +1329,18 @@ void GM_IsCloseSensors(void) case RALLY_PROTOCOL: /* 拉力*/ case WIND_PROTOCOL: /* 风速风向*/ case SLANT_PROTOCOL: /* 倾角*/ - if(srdt.ms_dev[i].FirstCmdTimeCnt >20*1000/TIMER_CNT) + if((get_msec()-srdt.ms_dev[i].FirstCmdTimeCnt > 50*1000) ||(get_msec()-srdt.ms_dev[i].FirstCmdTimeCnt < 0)) + { + srdt.ms_dev[i].FirstCmdTimeCnt = get_msec(); + break; + } + if(get_msec()- srdt.ms_dev[i].FirstCmdTimeCnt > 15*1000) { srdt.ms_dev[i].IsNeedSerial = 0; // 关闭传感器电源 - LOGI("因读取装置%d数据超过20秒,关闭装置%d电源!", i+1, i+1); + LOGI("读取装置%d数据%0.3f秒,关闭装置%d电源!", i+1, (get_msec()-srdt.ms_dev[i].FirstCmdTimeCnt)/1000.0,i+1); //Gm_CtrlCloseSensorsPower(i); } - else - srdt.ms_dev[i].FirstCmdTimeCnt++; break; case PELCO_D_PROTOCOL: /* 摄像机类型*/ case PELCO_P_PROTOCOL: /* 摄像机类型*/ @@ -1140,29 +1393,30 @@ void GM_AllSerialComRecv(void) } /******************************************************************************** -函数名称: void GM_ReadWireTemAndCloseTimer() +函数名称: int GM_CloseTimer() 功能说明: 输入参数: 输出参数: 其它说明: *********************************************************************************/ -void GM_ReadWireTemAndCloseTimer(void) +int GM_CloseTimer(void) { int i, j, iretime; char buf[256]; for(i=0; idevparam[i].ProtocolIdx))) break; } if(i < MAX_SERIAL_DEV_NUM) { - return; // 寻找 + return 1; // 寻找 } else // 关闭所有串口及电源 { +#if 0 for(i=0; iSendCmdFlag && (pPortParam->RevCmdFlag == 0)) { pPortParam->RetryTimeCnt++; - if(srdt.sendphotocmdcnt > 0) - idelay = 10*1000/TIMER_CNT; + //if(srdt.sendphotocmdcnt > 0) + // idelay = 10*1000/TIMER_CNT; + //LOGV("polltime:%ldms", get_msec()-srdt.ms_dev[0].FirstCmdTimeCnt); if(pPortParam->RetryTimeCnt < (pPortParam->RetryTime+idelay)) { return; @@ -1558,6 +1823,8 @@ void SendCmdFormPollCmdBuf( int port ) sprintf(buf, "发送串口%d 装置%d命令:", port+1, srdt.curdevidx[port]+1); BytestreamLOG(buf, &pPortParam->PollCmd[i+2], len, 'D'); + LOGW("sendtimeconst= %ld", get_msec()-lsendtime); + lsendtime = get_msec(); } pPortParam->SendCmdFlag = 1; pPortParam->ReSendCmdFlag = 0; @@ -2027,21 +2294,21 @@ BYTE Gm_Pelco_DCheck( BYTE *msg, int len ) int FindNextShxyProtocolCommand( int devidx ) { //如果命令缓冲区仍有命令,则退出本函数 - if((srdt.ms_dev[devidx].UseSerialidx < 1) || (srdt.ms_dev[devidx].UseSerialidx >= MAX_SERIAL_PORT_NUM)) + if((devparam[devidx].commid+1 < 1) || (devparam[devidx].commid+1 >= MAX_SERIAL_PORT_NUM)) return -1; - if(srdt.ms_dev[devidx].SerialCmdidx == 0) + //if(srdt.ms_dev[devidx].SerialCmdidx == 0) { - if(srdt.ms_dev[devidx].FirstCmdTimeCnt < 1*1000) + if(get_msec()-srdt.ms_dev[devidx].FirstCmdTimeCnt < 3*1000) { //srdt.ms_dev[devidx].FirstCmdTimeCnt++; return -1; } - if(SLANT_PROTOCOL == devparam[devidx].ProtocolIdx) - MakeShxyProtocolPollCommand(devidx, 0x06); - else if(WEATHER_PROTOCOL== devparam[devidx].ProtocolIdx) + //if(SLANT_PROTOCOL == devparam[devidx].ProtocolIdx) + // MakeShxyProtocolPollCommand(devidx, 0x06); + //else if(WEATHER_PROTOCOL== devparam[devidx].ProtocolIdx) MakeShxyProtocolPollCommand(devidx, 0x09); - else - MakeShxyProtocolPollCommand(devidx, 0x08); + //else + //MakeShxyProtocolPollCommand(devidx, 0x08); srdt.curdevidx[srdt.ms_dev[devidx].UseSerialidx] = devidx; return 1; } diff --git a/app/src/main/cpp/SensorsProtocol.h b/app/src/main/cpp/SensorsProtocol.h index 505f0226..aed28963 100644 --- a/app/src/main/cpp/SensorsProtocol.h +++ b/app/src/main/cpp/SensorsProtocol.h @@ -37,8 +37,6 @@ typedef unsigned char BYTE; #define MAX_SERIAL_DEV_NUM 25 /* 最大接串口传感器数量*/ #define MAX_SERIAL_PORT_NUM 3 /* 最大串口数量*/ -#define TIMER_CNT 10 // Poll命令定时器时间 50 ms - #define WEATHER_PROTOCOL 1 /* 温湿度协议序号*/ #define WIND_PROTOCOL 2 /* 风速风向协议序号*/ #define SLANT_PROTOCOL 3 /* 倾斜角协议序号*/ @@ -60,7 +58,7 @@ typedef unsigned char BYTE; #define MAX_PHOTO_FRAME_LEN 256 /* 图片数据一包最大长度*/ #define RECVDATA_MAXLENTH 2048 /* 接收数据缓冲区最大值*/ -#define TIMER_CNT 10 // Poll命令定时器时间 50 ms +#define TIMER_CNT 50 // Poll命令定时器时间 5 ms #define SENDDATA_MAXLENTH RECVDATA_MAXLENTH /* 正常发送数据缓冲区最大值*/ // 摄像机控制命令宏定义 @@ -208,7 +206,7 @@ typedef struct 2、解密1->b*/ int enrecvtime; /* 发送加密命令后接收到应答计时*/ - int FirstCmdTimeCnt; /* 读取雨量计时计数*/ + long FirstCmdTimeCnt; /* 串口读取数据起始时间*/ u_char nextcmd; /* 第二次发送读取气象雨量命令 加密使用: 0x00,无加密动作; @@ -233,7 +231,6 @@ typedef struct u_char IsGprs; /* GPRS网络是否注册*/ u_char IsHexToAt; /* 串口1是否使用At指令(0:使用At指令;1:使用16进制数据传输)*/ - u_char CommMod; /* 通讯模式(0:自动切换通讯模式;1:手动强制使用光网通讯;2:手动强制使用GPRS通讯)*/ u_char sampling; /* 正在进行采样(0:没有进行采样;1:正在进行采样;)*/ u_char clcyesampling; /* 正在进行采样(0:没有进行采样;1:正在进行采样;)*/ @@ -335,8 +332,8 @@ void Gm_FindAllSensorsCommand(void); void GM_IsCloseSensors(void); //检查所有串口是否有数据接收,有则启动接收 void GM_AllSerialComRecv(void); -//读取被动接收的测温球数据以及判断是否需要关闭定时器 -void GM_ReadWireTemAndCloseTimer(void); +//判断是否需要关闭定时器 +int GM_CloseTimer(void); // 串口接收数据处理 void SerialDataProcess(int devidx, u_char *buf, int len);