完善多串口多装置轮询采样逻辑

serial
huyizhong 1 year ago
parent 1e8704e60e
commit 5c0e8b3abf

@ -640,12 +640,21 @@ void Gm_OpenSerialPort(int devidx)
// 关闭串口通讯 // 关闭串口通讯
void Gm_CloseSerialPort(void) void Gm_CloseSerialPort(void)
{ {
int i;
for(i=0; i<MAX_SERIAL_PORT_NUM; i++)
{
if(serialport[i].fd > 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) else if(len > 0)
{ {
memset(szbuf, 0, sizeof(szbuf)); //memset(szbuf, 0, sizeof(szbuf));
sprintf(szbuf, "串口%d发送%d字节", commid+1, len); //sprintf(szbuf, "串口%d发送%d字节", commid+1, len);
BytestreamLOG(szbuf, cSendBuf, len, 'D'); //BytestreamLOG(szbuf, cSendBuf, len, 'D');
#if 0 #if 0
for (i = 0; i < len; i++) for (i = 0; i < len; i++)
{ {
@ -697,22 +706,250 @@ int Gm_SetSerialPortParam(int commid)
return ret; return ret;
} }
void Gm_InitSerialComm_Test(void)
{
int i, j;
srdt.sampling = 0;
srdt.PtzCmdType = Cmd_Cancel; // 云台指令类型
for(i=0; i<MAX_SERIAL_PORT_NUM; i++)
{
//***************** 串行端口信息 ************************
//g_serialparam[i].Baud = 1200;
//g_serialparam[i].dataBits = 8;
//g_serialparam[i].stopBits = 1;
//g_serialparam[i].parity = 0;
//******************** Poll Cmd ****************************
serialport[i].Retry = 0;
//serialport[i].RetryTime = 500/TIMER_CNT;
j = TIMER_CNT;
serialport[i].RetryTime = 300/TIMER_CNT;
j = 1500/TIMER_CNT;
serialport[i].WaitTime = 0;
memset(serialport[i].m_au8RecvBuf, 0, RECVDATA_MAXLENTH); // 接收数据缓存区
ClearCmdFormPollCmdBuf(i);
}
//g_serialparam[1].Baud = 1200;
for(i=0; i<MAX_SERIAL_DEV_NUM; i++)
devparam[i].IsNoInsta = 0;
devparam[0].ProtocolIdx = WEATHER_PROTOCOL;
devparam[0].baudrate = B9600;
devparam[0].databit = 8;
memset(devparam[0].stopbit, 0, sizeof(devparam[0].stopbit));
sprintf(devparam[0].stopbit, "1");
devparam[0].parity = 0;
devparam[0].IsNoInsta = 1;
//devparam[0].PowerPort = 2;
devparam[0].devaddr = 4;
devparam[1].ProtocolIdx = WEATHER_PROTOCOL;
devparam[1].baudrate = B9600;
devparam[1].databit = 8;
memset(devparam[1].stopbit, 0, sizeof(devparam[1].stopbit));
sprintf(devparam[1].stopbit, "1");
devparam[1].parity = 0;
devparam[1].IsNoInsta = 1;
//devparam[1].PowerPort = 14;
devparam[1].devaddr = 1;
#if 0
devparam[2].ProtocolIdx = SLANT_PROTOCOL;
devparam[2].baudrate = 1200;
devparam[2].databit = 8;
devparam[2].stopbit = 1;
devparam[2].parity = 0;
devparam[2].IsNoInsta = 0;
//devparam[2].PowerPort = 3;
devparam[2].devaddr = 2;
devparam[3].ProtocolIdx = PELCO_P_PROTOCOL;
devparam[3].baudrate = 9600;
devparam[3].databit = 8;
devparam[3].stopbit = 1;
devparam[3].parity = 0;
devparam[3].IsNoInsta = 0;
//devparam[3].PowerPort = 15;
devparam[3].CameraChannel = 1;
devparam[3].devaddr = 0;
devparam[4].ProtocolIdx = WDIITEMP_PROTOCOL_NEW;
devparam[4].baudrate = 1200;
devparam[4].databit = 8;
devparam[4].stopbit = 1;
devparam[4].parity = 0;
devparam[4].IsNoInsta = 0;
//devparam[4].PowerPort = 17;
devparam[4].devaddr = 4;
devparam[5].ProtocolIdx = RALLY_PROTOCOL_NEW;
devparam[5].baudrate = 9600;
devparam[5].databit = 8;
devparam[5].stopbit = 1;
devparam[5].parity = 0;
devparam[5].IsNoInsta = 1;
//devparam[5].PowerPort = 6;
devparam[5].devaddr = 11;
devparam[6].ProtocolIdx = RALLY_PROTOCOL_NEW;
devparam[6].baudrate = 9600;
devparam[6].databit = 8;
devparam[6].stopbit = 1;
devparam[6].parity = 0;
devparam[6].IsNoInsta = 1;
//devparam[6].PowerPort = 6;
devparam[6].devaddr = 12;
devparam[7].ProtocolIdx = RALLY_PROTOCOL_NEW;
devparam[7].baudrate = 9600;
devparam[7].databit = 8;
devparam[7].stopbit = 1;
devparam[7].parity = 0;
devparam[7].IsNoInsta = 1;
//devparam[7].PowerPort = 6;
devparam[7].devaddr = 10;
devparam[8].ProtocolIdx = PELCO_P_PROTOCOL;
devparam[8].baudrate = 9600;
devparam[8].databit = 8;
devparam[8].stopbit = 1;
devparam[8].parity = 0;
devparam[8].IsNoInsta = 0;
//devparam[8].PowerPort = 10;
devparam[8].CameraChannel = 2;
devparam[8].devaddr = 0;
devparam[9].ProtocolIdx = WDIITEMP_PROTOCOL_NEW;
devparam[9].baudrate = 9600;
devparam[9].databit = 8;
devparam[9].stopbit = 1;
devparam[9].parity = 0;
devparam[9].IsNoInsta = 1;
//devparam[9].PowerPort = 17;
devparam[9].devaddr = 47;
devparam[10].ProtocolIdx = LCURRENT_PROTOCOL;
devparam[10].baudrate = 9600;
devparam[10].databit = 8;
devparam[10].stopbit = 1;
devparam[10].parity = 0;
devparam[10].IsNoInsta = 1;
//devparam[10].PowerPort = 5;
devparam[10].devaddr = 7;
devparam[11].ProtocolIdx = LCURRENT_PROTOCOL;
devparam[11].baudrate = 9600;
devparam[11].databit = 8;
devparam[11].stopbit = 1;
devparam[11].parity = 0;
devparam[11].IsNoInsta = 1;
//devparam[11].PowerPort = 6;
devparam[11].devaddr = 6;
devparam[12].ProtocolIdx = LCURRENT_PROTOCOL;
devparam[12].baudrate = 9600;
devparam[12].databit = 8;
devparam[12].stopbit = 1;
devparam[12].parity = 0;
devparam[12].IsNoInsta = 1;
//devparam[12].PowerPort = 8;
devparam[12].devaddr = 5;
devparam[13].ProtocolIdx = SLANT_PROTOCOL;
devparam[13].baudrate = 1200;
devparam[13].databit = 8;
devparam[13].stopbit = 1;
devparam[13].parity = 0;
//devparam[13].PowerPort = 4;
devparam[13].IsNoInsta = 1;
devparam[13].devaddr = 2;
devparam[14].ProtocolIdx = SLANT_PROTOCOL;
devparam[14].baudrate = 1200;
devparam[14].databit = 8;
devparam[14].stopbit = 1;
devparam[14].parity = 0;
devparam[14].IsNoInsta = 1;
//devparam[14].PowerPort = 2;
devparam[14].devaddr = 3;
#endif
#if 0
devparam[15].ProtocolIdx = LEIRALLY_PROTOCOL;
//#endif
devparam[15].ProtocolIdx = WIND_PROTOCOL;
devparam[15].baudrate = 9600;
devparam[15].databit = 8;
devparam[15].stopbit = 1;
devparam[15].parity = 0;
devparam[15].IsNoInsta = 1;
devparam[15].PowerPort = 14;
devparam[15].devaddr = 1;
// 6 气象
// 空气温度
weatherpntmsg[0].AiParam.fFactor = 1.0;
weatherpntmsg[0].AiParam.EuValueDelta = 50;
// 相对湿度
weatherpntmsg[1].AiParam.fFactor = 1.0;
weatherpntmsg[1].AiParam.EuValueDelta = 0;
// 风速
weatherpntmsg[2].AiParam.fFactor = 0.01;
weatherpntmsg[2].AiParam.EuValueDelta = 0;
// 风向
weatherpntmsg[3].AiParam.fFactor = 0.001;
weatherpntmsg[3].AiParam.EuValueDelta = 0;
// 降水强度
weatherpntmsg[4].AiParam.fFactor = 60;
weatherpntmsg[4].AiParam.EuValueDelta = 0;
// 相对空气压力
weatherpntmsg[5].AiParam.fFactor = 1.0;
weatherpntmsg[5].AiParam.EuValueDelta = 0;
// 备用
weatherpntmsg[6].AiParam.fFactor = 1.0;
weatherpntmsg[6].AiParam.EuValueDelta = 0;
// 备用
weatherpntmsg[7].AiParam.fFactor = 1.0;
weatherpntmsg[7].AiParam.EuValueDelta = 0;
smokepntmsg[0].AiParam.EuValueDelta = 0;
smokepntmsg[0].AiParam.fFactor = 0.1;
rizhaopntmsg[0].AiParam.fFactor = 1.0;
rizhaopntmsg[0].AiParam.EuValueDelta = 0;
rizhaopntmsg[1].AiParam.fFactor = 2.5;
rizhaopntmsg[1].AiParam.EuValueDelta = 0;
slantpntmsg[0][0].AiParam.fFactor = 100.0;
slantpntmsg[0][0].AiParam.EuValueDelta = 0;
slantpntmsg[0][1].AiParam.fFactor = 100.0;
slantpntmsg[0][1].AiParam.EuValueDelta = 0;
slantpntmsg[1][0].AiParam.fFactor = 100.0;
slantpntmsg[1][0].AiParam.EuValueDelta = 0;
slantpntmsg[1][1].AiParam.fFactor = 100.0;
slantpntmsg[1][1].AiParam.EuValueDelta = 0;
for(i=0; i<6; i++)
for(j=0; j<RALLY_DATA_NUM; j++)
{
rallypntmsg[i][j].AiParam.fFactor = 1.0;
rallypntmsg[i][j].AiParam.EuValueDelta = 0;
}
#endif
}
// 初始化所有串口及所接传感器的配置 // 初始化所有串口及所接传感器的配置
void Gm_InitSerialComm(void) void Gm_InitSerialComm(void)
{ {
int i; int i;
char szbuf[128]; char szbuf[128];
//Gm_InitSerialComm_Test(); Gm_InitSerialComm_Test();
// srdt 配置 // srdt 配置
//srdt.sampling = 0; //srdt.sampling = 0;
//srdt.PtzCmdType = Cmd_Cancel; // 云台指令类型 //srdt.PtzCmdType = Cmd_Cancel; // 云台指令类型
//srdt.SendStopPtzCmdTimeCnt=-1; // 发送云台停止指令计数 //srdt.SendStopPtzCmdTimeCnt=-1; // 发送云台停止指令计数
//srdt.uRunMode = 0; //srdt.uRunMode = 0;
srdt.CommMod = 0; //srdt.CommMod = 0;
// 查找装置使用的串口序号 // 查找装置使用的串口序号
FindDevUseSerialCommNo(); //FindDevUseSerialCommNo();
#if 0 #if 0
for(i=0; i<MAX_SERIAL_DEV_NUM; i++) for(i=0; i<MAX_SERIAL_DEV_NUM; i++)
@ -822,6 +1059,7 @@ void FindDevUseSerialCommNo(void)
memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname)); memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname));
/* 目前还不确定具体串口分配暂时默认使用串口1</dev/ttyS0>*/ /* 目前还不确定具体串口分配暂时默认使用串口1</dev/ttyS0>*/
sprintf(devparam[i].pathname, "/dev/ttyS0"); sprintf(devparam[i].pathname, "/dev/ttyS0");
devparam[i].commid = 0;
break; break;
default: default:
devparam[i].IsNoInsta = 0; devparam[i].IsNoInsta = 0;
@ -834,9 +1072,10 @@ void GM_StartSerialComm(void)
{ {
int i, j; int i, j;
char szbuf[64]; char szbuf[64];
long polltime=0;
// 测试使用初始化配置 // 测试使用初始化配置
//Gm_InitSerialComm(); Gm_InitSerialComm();
//DebugStringPrintf(szbuf, strlen(szbuf), 1); //DebugStringPrintf(szbuf, strlen(szbuf), 1);
memset((void*)srdt.curdevidx, 0, sizeof(srdt.curdevidx)); memset((void*)srdt.curdevidx, 0, sizeof(srdt.curdevidx));
//Gm_OpenSerialPower(); /* 不在这使用*/ //Gm_OpenSerialPower(); /* 不在这使用*/
@ -853,6 +1092,7 @@ void GM_StartSerialComm(void)
} }
for(i=0; i<MAX_SERIAL_DEV_NUM; i++) for(i=0; i<MAX_SERIAL_DEV_NUM; i++)
{ {
srdt.ms_dev[i].FirstCmdTimeCnt = get_msec();
memset(szbuf, 0, sizeof(szbuf)); memset(szbuf, 0, sizeof(szbuf));
switch(devparam[i].ProtocolIdx) switch(devparam[i].ProtocolIdx)
{ {
@ -896,11 +1136,17 @@ void GM_StartSerialComm(void)
LOGI("启动数据采样!"); LOGI("启动数据采样!");
/* 直接使用循环进行采样处理*/ /* 直接使用循环进行采样处理*/
polltime = get_msec();
for(;;) for(;;)
{ {
usleep(5000); usleep(TIMER_CNT*100);
//LOGW("polltime=%ldms", get_msec()-polltime);
polltime = get_msec();
if(GM_SerialTimer() < 0) if(GM_SerialTimer() < 0)
{
LOGV("退出采样流程!");
break; break;
}
} }
return; return;
} }
@ -994,11 +1240,13 @@ void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx)
int GM_SerialTimer(void) int GM_SerialTimer(void)
{ {
int flag = -1;
Gm_FindAllSensorsCommand(); Gm_FindAllSensorsCommand();
GM_IsCloseSensors(); GM_IsCloseSensors();
GM_AllSerialComRecv(); GM_AllSerialComRecv();
GM_ReadWireTemAndCloseTimer(); flag = GM_CloseTimer();
return 1; return flag;
} }
/******************************************************************************** /********************************************************************************
@ -1024,12 +1272,14 @@ void Gm_FindAllSensorsCommand(void)
curidx = (curidx+1)%MAX_SERIAL_DEV_NUM; curidx = (curidx+1)%MAX_SERIAL_DEV_NUM;
if(j != devparam[curidx].commid) if(j != devparam[curidx].commid)
continue; continue;
if(srdt.ms_dev[curidx].IsNeedSerial == 0)
continue;
if(serialport[devparam[curidx].commid].fd < 0)
Gm_OpenSerialPort(curidx);
if(serialport[devparam[curidx].commid].cmdlen > 0) if(serialport[devparam[curidx].commid].cmdlen > 0)
break; break;
flag = -1; flag = -1;
if(srdt.ms_dev[curidx].IsNeedSerial == 0)
continue;
switch(devparam[curidx].ProtocolIdx) switch(devparam[curidx].ProtocolIdx)
{ {
case WEATHER_PROTOCOL: /* 温湿度气压*/ case WEATHER_PROTOCOL: /* 温湿度气压*/
@ -1079,15 +1329,18 @@ void GM_IsCloseSensors(void)
case RALLY_PROTOCOL: /* 拉力*/ case RALLY_PROTOCOL: /* 拉力*/
case WIND_PROTOCOL: /* 风速风向*/ case WIND_PROTOCOL: /* 风速风向*/
case SLANT_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; 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); //Gm_CtrlCloseSensorsPower(i);
} }
else
srdt.ms_dev[i].FirstCmdTimeCnt++;
break; break;
case PELCO_D_PROTOCOL: /* 摄像机类型*/ case PELCO_D_PROTOCOL: /* 摄像机类型*/
case PELCO_P_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; int i, j, iretime;
char buf[256]; char buf[256];
for(i=0; i<MAX_SERIAL_DEV_NUM; i++) for(i=0; i<MAX_SERIAL_DEV_NUM; i++)
{ {
if(((srdt.ms_dev[i].IsNeedSerial == 1) || ((srdt.sampling & 0x02) == 0x02)) if((srdt.ms_dev[i].IsNeedSerial == 1)
&& ((0<devparam[i].ProtocolIdx)&&(INVALID_PROTOCOL >devparam[i].ProtocolIdx))) && ((0<devparam[i].ProtocolIdx)&&(INVALID_PROTOCOL >devparam[i].ProtocolIdx)))
break; break;
} }
if(i < MAX_SERIAL_DEV_NUM) if(i < MAX_SERIAL_DEV_NUM)
{ {
return; // 寻找 return 1; // 寻找
} }
else // 关闭所有串口及电源 else // 关闭所有串口及电源
{ {
#if 0
for(i=0; i<MAX_SERIAL_DEV_NUM; i++) for(i=0; i<MAX_SERIAL_DEV_NUM; i++)
{ {
if((srdt.ms_dev[i].IsNeedSerial == 1) && (7 == devparam[i].ProtocolIdx)) if((srdt.ms_dev[i].IsNeedSerial == 1) && (7 == devparam[i].ProtocolIdx))
@ -1215,7 +1469,10 @@ void GM_ReadWireTemAndCloseTimer(void)
//StartTimer(GM_SERIAL_START, TIMER_CNT, GM_SerialTimer); //StartTimer(GM_SERIAL_START, TIMER_CNT, GM_SerialTimer);
} }
else else
{ {
#endif
#if 0
for(i=0; i<MAX_SERIAL_DEV_NUM; i++) for(i=0; i<MAX_SERIAL_DEV_NUM; i++)
{ {
if((srdt.ms_dev[i].IsNeedSerial == 1) && (RESERVE5_PROTOCOL == devparam[i].ProtocolIdx)) if((srdt.ms_dev[i].IsNeedSerial == 1) && (RESERVE5_PROTOCOL == devparam[i].ProtocolIdx))
@ -1225,12 +1482,14 @@ void GM_ReadWireTemAndCloseTimer(void)
return; return;
else else
{ {
#endif
Gm_CloseSerialPort(); Gm_CloseSerialPort();
for(j=0; j<MAX_SERIAL_PORT_NUM; j++) for(j=0; j<MAX_SERIAL_PORT_NUM; j++)
ClearCmdFormPollCmdBuf(j); ClearCmdFormPollCmdBuf(j);
sprintf(buf, "关闭串口定时器!"); sprintf(buf, "关闭串口定时器!");
LOGI("%s", buf); LOGI("%s", buf);
//StopTimer(GM_SERIAL_START); return -1;
#if 0
//g_usleep &= 0xFE; //g_usleep &= 0xFE;
//if(0 == g_usleep) //if(0 == g_usleep)
{ {
@ -1242,6 +1501,7 @@ void GM_ReadWireTemAndCloseTimer(void)
//sprintf(buf, "usleep=%d", g_usleep); //sprintf(buf, "usleep=%d", g_usleep);
//DebugStringPrintf(buf, strlen(buf), 1); //DebugStringPrintf(buf, strlen(buf), 1);
srdt.sampling &= 0xFA; srdt.sampling &= 0xFA;
if(1 == srdt.uRunMode) if(1 == srdt.uRunMode)
{ {
GM_StartSerialComm(); GM_StartSerialComm();
@ -1251,16 +1511,19 @@ void GM_ReadWireTemAndCloseTimer(void)
} }
} }
srdt.tempsamplingstartime = -1; srdt.tempsamplingstartime = -1;
} }
#endif
#if 0
if(0 == srdt.selfflag) if(0 == srdt.selfflag)
; ;
else else
;//Gm_CloseSerialPower(); ;//Gm_CloseSerialPower();
srdt.clcyesampling = 0; //srdt.clcyesampling = 0;
//Gm_CloseAllSensorsPower(); //Gm_CloseAllSensorsPower();
srdt.selfflag = 0; //srdt.selfflag = 0;
} //}
#endif
} }
} }
@ -1476,6 +1739,7 @@ void CameraPhotoPortDataProcess( int port)
} }
} }
long lsendtime=0;
/********************************************************************************* /*********************************************************************************
**********************************************************************************/ **********************************************************************************/
@ -1497,8 +1761,9 @@ void SendCmdFormPollCmdBuf( int port )
if(pPortParam->SendCmdFlag && (pPortParam->RevCmdFlag == 0)) if(pPortParam->SendCmdFlag && (pPortParam->RevCmdFlag == 0))
{ {
pPortParam->RetryTimeCnt++; pPortParam->RetryTimeCnt++;
if(srdt.sendphotocmdcnt > 0) //if(srdt.sendphotocmdcnt > 0)
idelay = 10*1000/TIMER_CNT; // idelay = 10*1000/TIMER_CNT;
//LOGV("polltime:%ldms", get_msec()-srdt.ms_dev[0].FirstCmdTimeCnt);
if(pPortParam->RetryTimeCnt < (pPortParam->RetryTime+idelay)) if(pPortParam->RetryTimeCnt < (pPortParam->RetryTime+idelay))
{ {
return; return;
@ -1558,6 +1823,8 @@ void SendCmdFormPollCmdBuf( int port )
sprintf(buf, "发送串口%d 装置%d命令:", port+1, srdt.curdevidx[port]+1); sprintf(buf, "发送串口%d 装置%d命令:", port+1, srdt.curdevidx[port]+1);
BytestreamLOG(buf, &pPortParam->PollCmd[i+2], len, 'D'); BytestreamLOG(buf, &pPortParam->PollCmd[i+2], len, 'D');
LOGW("sendtimeconst= %ld", get_msec()-lsendtime);
lsendtime = get_msec();
} }
pPortParam->SendCmdFlag = 1; pPortParam->SendCmdFlag = 1;
pPortParam->ReSendCmdFlag = 0; pPortParam->ReSendCmdFlag = 0;
@ -2027,21 +2294,21 @@ BYTE Gm_Pelco_DCheck( BYTE *msg, int len )
int FindNextShxyProtocolCommand( int devidx ) 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; 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++; //srdt.ms_dev[devidx].FirstCmdTimeCnt++;
return -1; return -1;
} }
if(SLANT_PROTOCOL == devparam[devidx].ProtocolIdx) //if(SLANT_PROTOCOL == devparam[devidx].ProtocolIdx)
MakeShxyProtocolPollCommand(devidx, 0x06); // MakeShxyProtocolPollCommand(devidx, 0x06);
else if(WEATHER_PROTOCOL== devparam[devidx].ProtocolIdx) //else if(WEATHER_PROTOCOL== devparam[devidx].ProtocolIdx)
MakeShxyProtocolPollCommand(devidx, 0x09); MakeShxyProtocolPollCommand(devidx, 0x09);
else //else
MakeShxyProtocolPollCommand(devidx, 0x08); //MakeShxyProtocolPollCommand(devidx, 0x08);
srdt.curdevidx[srdt.ms_dev[devidx].UseSerialidx] = devidx; srdt.curdevidx[srdt.ms_dev[devidx].UseSerialidx] = devidx;
return 1; return 1;
} }

@ -37,8 +37,6 @@ typedef unsigned char BYTE;
#define MAX_SERIAL_DEV_NUM 25 /* 最大接串口传感器数量*/ #define MAX_SERIAL_DEV_NUM 25 /* 最大接串口传感器数量*/
#define MAX_SERIAL_PORT_NUM 3 /* 最大串口数量*/ #define MAX_SERIAL_PORT_NUM 3 /* 最大串口数量*/
#define TIMER_CNT 10 // Poll命令定时器时间 50 ms
#define WEATHER_PROTOCOL 1 /* 温湿度协议序号*/ #define WEATHER_PROTOCOL 1 /* 温湿度协议序号*/
#define WIND_PROTOCOL 2 /* 风速风向协议序号*/ #define WIND_PROTOCOL 2 /* 风速风向协议序号*/
#define SLANT_PROTOCOL 3 /* 倾斜角协议序号*/ #define SLANT_PROTOCOL 3 /* 倾斜角协议序号*/
@ -60,7 +58,7 @@ typedef unsigned char BYTE;
#define MAX_PHOTO_FRAME_LEN 256 /* 图片数据一包最大长度*/ #define MAX_PHOTO_FRAME_LEN 256 /* 图片数据一包最大长度*/
#define RECVDATA_MAXLENTH 2048 /* 接收数据缓冲区最大值*/ #define RECVDATA_MAXLENTH 2048 /* 接收数据缓冲区最大值*/
#define TIMER_CNT 10 // Poll命令定时器时间 50 ms #define TIMER_CNT 50 // Poll命令定时器时间 5 ms
#define SENDDATA_MAXLENTH RECVDATA_MAXLENTH /* 正常发送数据缓冲区最大值*/ #define SENDDATA_MAXLENTH RECVDATA_MAXLENTH /* 正常发送数据缓冲区最大值*/
// 摄像机控制命令宏定义 // 摄像机控制命令宏定义
@ -208,7 +206,7 @@ typedef struct
21->b*/ 21->b*/
int enrecvtime; /* 发送加密命令后接收到应答计时*/ int enrecvtime; /* 发送加密命令后接收到应答计时*/
int FirstCmdTimeCnt; /* 读取雨量计时计数*/ long FirstCmdTimeCnt; /* 串口读取数据起始时间*/
u_char nextcmd; /* 第二次发送读取气象雨量命令 u_char nextcmd; /* 第二次发送读取气象雨量命令
使: 使:
0x00; 0x00;
@ -233,7 +231,6 @@ typedef struct
u_char IsGprs; /* GPRS网络是否注册*/ u_char IsGprs; /* GPRS网络是否注册*/
u_char IsHexToAt; /* 串口1是否使用At指令(0:使用At指令;1:使用16进制数据传输)*/ u_char IsHexToAt; /* 串口1是否使用At指令(0:使用At指令;1:使用16进制数据传输)*/
u_char CommMod; /* 通讯模式(0:自动切换通讯模式;1:手动强制使用光网通讯;2:手动强制使用GPRS通讯)*/
u_char sampling; /* 正在进行采样(0:没有进行采样;1:正在进行采样;)*/ u_char sampling; /* 正在进行采样(0:没有进行采样;1:正在进行采样;)*/
u_char clcyesampling; /* 正在进行采样(0:没有进行采样;1:正在进行采样;)*/ u_char clcyesampling; /* 正在进行采样(0:没有进行采样;1:正在进行采样;)*/
@ -335,8 +332,8 @@ void Gm_FindAllSensorsCommand(void);
void GM_IsCloseSensors(void); void GM_IsCloseSensors(void);
//检查所有串口是否有数据接收,有则启动接收 //检查所有串口是否有数据接收,有则启动接收
void GM_AllSerialComRecv(void); void GM_AllSerialComRecv(void);
//读取被动接收的测温球数据以及判断是否需要关闭定时器 //判断是否需要关闭定时器
void GM_ReadWireTemAndCloseTimer(void); int GM_CloseTimer(void);
// 串口接收数据处理 // 串口接收数据处理
void SerialDataProcess(int devidx, u_char *buf, int len); void SerialDataProcess(int devidx, u_char *buf, int len);

@ -662,7 +662,7 @@ Java_com_xinyingpower_testcomm_MainActivity_testSpi(
//set12VEnable(true); //set12VEnable(true);
//serial_port_comm(); //serial_port_comm();
GM_StartSerialComm();
//lxy modify modify //lxy modify modify
//LOGE("_test_ setRS485Enable false"); //LOGE("_test_ setRS485Enable false");
//setRS485Enable(false); //setRS485Enable(false);

@ -640,12 +640,21 @@ void Gm_OpenSerialPort(int devidx)
// 关闭串口通讯 // 关闭串口通讯
void Gm_CloseSerialPort(void) void Gm_CloseSerialPort(void)
{ {
int i;
for(i=0; i<MAX_SERIAL_PORT_NUM; i++)
{
if(serialport[i].fd > 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) else if(len > 0)
{ {
memset(szbuf, 0, sizeof(szbuf)); //memset(szbuf, 0, sizeof(szbuf));
sprintf(szbuf, "串口%d发送%d字节", commid+1, len); //sprintf(szbuf, "串口%d发送%d字节", commid+1, len);
BytestreamLOG(szbuf, cSendBuf, len, 'D'); //BytestreamLOG(szbuf, cSendBuf, len, 'D');
#if 0 #if 0
for (i = 0; i < len; i++) for (i = 0; i < len; i++)
{ {
@ -697,22 +706,250 @@ int Gm_SetSerialPortParam(int commid)
return ret; return ret;
} }
void Gm_InitSerialComm_Test(void)
{
int i, j;
srdt.sampling = 0;
srdt.PtzCmdType = Cmd_Cancel; // 云台指令类型
for(i=0; i<MAX_SERIAL_PORT_NUM; i++)
{
//***************** 串行端口信息 ************************
//g_serialparam[i].Baud = 1200;
//g_serialparam[i].dataBits = 8;
//g_serialparam[i].stopBits = 1;
//g_serialparam[i].parity = 0;
//******************** Poll Cmd ****************************
serialport[i].Retry = 0;
//serialport[i].RetryTime = 500/TIMER_CNT;
j = TIMER_CNT;
serialport[i].RetryTime = 300/TIMER_CNT;
j = 1500/TIMER_CNT;
serialport[i].WaitTime = 0;
memset(serialport[i].m_au8RecvBuf, 0, RECVDATA_MAXLENTH); // 接收数据缓存区
ClearCmdFormPollCmdBuf(i);
}
//g_serialparam[1].Baud = 1200;
for(i=0; i<MAX_SERIAL_DEV_NUM; i++)
devparam[i].IsNoInsta = 0;
devparam[0].ProtocolIdx = WEATHER_PROTOCOL;
devparam[0].baudrate = B9600;
devparam[0].databit = 8;
memset(devparam[0].stopbit, 0, sizeof(devparam[0].stopbit));
sprintf(devparam[0].stopbit, "1");
devparam[0].parity = 0;
devparam[0].IsNoInsta = 1;
//devparam[0].PowerPort = 2;
devparam[0].devaddr = 4;
devparam[1].ProtocolIdx = WEATHER_PROTOCOL;
devparam[1].baudrate = B9600;
devparam[1].databit = 8;
memset(devparam[1].stopbit, 0, sizeof(devparam[1].stopbit));
sprintf(devparam[1].stopbit, "1");
devparam[1].parity = 0;
devparam[1].IsNoInsta = 1;
//devparam[1].PowerPort = 14;
devparam[1].devaddr = 1;
#if 0
devparam[2].ProtocolIdx = SLANT_PROTOCOL;
devparam[2].baudrate = 1200;
devparam[2].databit = 8;
devparam[2].stopbit = 1;
devparam[2].parity = 0;
devparam[2].IsNoInsta = 0;
//devparam[2].PowerPort = 3;
devparam[2].devaddr = 2;
devparam[3].ProtocolIdx = PELCO_P_PROTOCOL;
devparam[3].baudrate = 9600;
devparam[3].databit = 8;
devparam[3].stopbit = 1;
devparam[3].parity = 0;
devparam[3].IsNoInsta = 0;
//devparam[3].PowerPort = 15;
devparam[3].CameraChannel = 1;
devparam[3].devaddr = 0;
devparam[4].ProtocolIdx = WDIITEMP_PROTOCOL_NEW;
devparam[4].baudrate = 1200;
devparam[4].databit = 8;
devparam[4].stopbit = 1;
devparam[4].parity = 0;
devparam[4].IsNoInsta = 0;
//devparam[4].PowerPort = 17;
devparam[4].devaddr = 4;
devparam[5].ProtocolIdx = RALLY_PROTOCOL_NEW;
devparam[5].baudrate = 9600;
devparam[5].databit = 8;
devparam[5].stopbit = 1;
devparam[5].parity = 0;
devparam[5].IsNoInsta = 1;
//devparam[5].PowerPort = 6;
devparam[5].devaddr = 11;
devparam[6].ProtocolIdx = RALLY_PROTOCOL_NEW;
devparam[6].baudrate = 9600;
devparam[6].databit = 8;
devparam[6].stopbit = 1;
devparam[6].parity = 0;
devparam[6].IsNoInsta = 1;
//devparam[6].PowerPort = 6;
devparam[6].devaddr = 12;
devparam[7].ProtocolIdx = RALLY_PROTOCOL_NEW;
devparam[7].baudrate = 9600;
devparam[7].databit = 8;
devparam[7].stopbit = 1;
devparam[7].parity = 0;
devparam[7].IsNoInsta = 1;
//devparam[7].PowerPort = 6;
devparam[7].devaddr = 10;
devparam[8].ProtocolIdx = PELCO_P_PROTOCOL;
devparam[8].baudrate = 9600;
devparam[8].databit = 8;
devparam[8].stopbit = 1;
devparam[8].parity = 0;
devparam[8].IsNoInsta = 0;
//devparam[8].PowerPort = 10;
devparam[8].CameraChannel = 2;
devparam[8].devaddr = 0;
devparam[9].ProtocolIdx = WDIITEMP_PROTOCOL_NEW;
devparam[9].baudrate = 9600;
devparam[9].databit = 8;
devparam[9].stopbit = 1;
devparam[9].parity = 0;
devparam[9].IsNoInsta = 1;
//devparam[9].PowerPort = 17;
devparam[9].devaddr = 47;
devparam[10].ProtocolIdx = LCURRENT_PROTOCOL;
devparam[10].baudrate = 9600;
devparam[10].databit = 8;
devparam[10].stopbit = 1;
devparam[10].parity = 0;
devparam[10].IsNoInsta = 1;
//devparam[10].PowerPort = 5;
devparam[10].devaddr = 7;
devparam[11].ProtocolIdx = LCURRENT_PROTOCOL;
devparam[11].baudrate = 9600;
devparam[11].databit = 8;
devparam[11].stopbit = 1;
devparam[11].parity = 0;
devparam[11].IsNoInsta = 1;
//devparam[11].PowerPort = 6;
devparam[11].devaddr = 6;
devparam[12].ProtocolIdx = LCURRENT_PROTOCOL;
devparam[12].baudrate = 9600;
devparam[12].databit = 8;
devparam[12].stopbit = 1;
devparam[12].parity = 0;
devparam[12].IsNoInsta = 1;
//devparam[12].PowerPort = 8;
devparam[12].devaddr = 5;
devparam[13].ProtocolIdx = SLANT_PROTOCOL;
devparam[13].baudrate = 1200;
devparam[13].databit = 8;
devparam[13].stopbit = 1;
devparam[13].parity = 0;
//devparam[13].PowerPort = 4;
devparam[13].IsNoInsta = 1;
devparam[13].devaddr = 2;
devparam[14].ProtocolIdx = SLANT_PROTOCOL;
devparam[14].baudrate = 1200;
devparam[14].databit = 8;
devparam[14].stopbit = 1;
devparam[14].parity = 0;
devparam[14].IsNoInsta = 1;
//devparam[14].PowerPort = 2;
devparam[14].devaddr = 3;
#endif
#if 0
devparam[15].ProtocolIdx = LEIRALLY_PROTOCOL;
//#endif
devparam[15].ProtocolIdx = WIND_PROTOCOL;
devparam[15].baudrate = 9600;
devparam[15].databit = 8;
devparam[15].stopbit = 1;
devparam[15].parity = 0;
devparam[15].IsNoInsta = 1;
devparam[15].PowerPort = 14;
devparam[15].devaddr = 1;
// 6 气象
// 空气温度
weatherpntmsg[0].AiParam.fFactor = 1.0;
weatherpntmsg[0].AiParam.EuValueDelta = 50;
// 相对湿度
weatherpntmsg[1].AiParam.fFactor = 1.0;
weatherpntmsg[1].AiParam.EuValueDelta = 0;
// 风速
weatherpntmsg[2].AiParam.fFactor = 0.01;
weatherpntmsg[2].AiParam.EuValueDelta = 0;
// 风向
weatherpntmsg[3].AiParam.fFactor = 0.001;
weatherpntmsg[3].AiParam.EuValueDelta = 0;
// 降水强度
weatherpntmsg[4].AiParam.fFactor = 60;
weatherpntmsg[4].AiParam.EuValueDelta = 0;
// 相对空气压力
weatherpntmsg[5].AiParam.fFactor = 1.0;
weatherpntmsg[5].AiParam.EuValueDelta = 0;
// 备用
weatherpntmsg[6].AiParam.fFactor = 1.0;
weatherpntmsg[6].AiParam.EuValueDelta = 0;
// 备用
weatherpntmsg[7].AiParam.fFactor = 1.0;
weatherpntmsg[7].AiParam.EuValueDelta = 0;
smokepntmsg[0].AiParam.EuValueDelta = 0;
smokepntmsg[0].AiParam.fFactor = 0.1;
rizhaopntmsg[0].AiParam.fFactor = 1.0;
rizhaopntmsg[0].AiParam.EuValueDelta = 0;
rizhaopntmsg[1].AiParam.fFactor = 2.5;
rizhaopntmsg[1].AiParam.EuValueDelta = 0;
slantpntmsg[0][0].AiParam.fFactor = 100.0;
slantpntmsg[0][0].AiParam.EuValueDelta = 0;
slantpntmsg[0][1].AiParam.fFactor = 100.0;
slantpntmsg[0][1].AiParam.EuValueDelta = 0;
slantpntmsg[1][0].AiParam.fFactor = 100.0;
slantpntmsg[1][0].AiParam.EuValueDelta = 0;
slantpntmsg[1][1].AiParam.fFactor = 100.0;
slantpntmsg[1][1].AiParam.EuValueDelta = 0;
for(i=0; i<6; i++)
for(j=0; j<RALLY_DATA_NUM; j++)
{
rallypntmsg[i][j].AiParam.fFactor = 1.0;
rallypntmsg[i][j].AiParam.EuValueDelta = 0;
}
#endif
}
// 初始化所有串口及所接传感器的配置 // 初始化所有串口及所接传感器的配置
void Gm_InitSerialComm(void) void Gm_InitSerialComm(void)
{ {
int i; int i;
char szbuf[128]; char szbuf[128];
//Gm_InitSerialComm_Test(); Gm_InitSerialComm_Test();
// srdt 配置 // srdt 配置
//srdt.sampling = 0; //srdt.sampling = 0;
//srdt.PtzCmdType = Cmd_Cancel; // 云台指令类型 //srdt.PtzCmdType = Cmd_Cancel; // 云台指令类型
//srdt.SendStopPtzCmdTimeCnt=-1; // 发送云台停止指令计数 //srdt.SendStopPtzCmdTimeCnt=-1; // 发送云台停止指令计数
//srdt.uRunMode = 0; //srdt.uRunMode = 0;
srdt.CommMod = 0; //srdt.CommMod = 0;
// 查找装置使用的串口序号 // 查找装置使用的串口序号
FindDevUseSerialCommNo(); //FindDevUseSerialCommNo();
#if 0 #if 0
for(i=0; i<MAX_SERIAL_DEV_NUM; i++) for(i=0; i<MAX_SERIAL_DEV_NUM; i++)
@ -822,6 +1059,7 @@ void FindDevUseSerialCommNo(void)
memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname)); memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname));
/* 目前还不确定具体串口分配暂时默认使用串口1</dev/ttyS0>*/ /* 目前还不确定具体串口分配暂时默认使用串口1</dev/ttyS0>*/
sprintf(devparam[i].pathname, "/dev/ttyS0"); sprintf(devparam[i].pathname, "/dev/ttyS0");
devparam[i].commid = 0;
break; break;
default: default:
devparam[i].IsNoInsta = 0; devparam[i].IsNoInsta = 0;
@ -834,9 +1072,10 @@ void GM_StartSerialComm(void)
{ {
int i, j; int i, j;
char szbuf[64]; char szbuf[64];
long polltime=0;
// 测试使用初始化配置 // 测试使用初始化配置
//Gm_InitSerialComm(); Gm_InitSerialComm();
//DebugStringPrintf(szbuf, strlen(szbuf), 1); //DebugStringPrintf(szbuf, strlen(szbuf), 1);
memset((void*)srdt.curdevidx, 0, sizeof(srdt.curdevidx)); memset((void*)srdt.curdevidx, 0, sizeof(srdt.curdevidx));
//Gm_OpenSerialPower(); /* 不在这使用*/ //Gm_OpenSerialPower(); /* 不在这使用*/
@ -853,6 +1092,7 @@ void GM_StartSerialComm(void)
} }
for(i=0; i<MAX_SERIAL_DEV_NUM; i++) for(i=0; i<MAX_SERIAL_DEV_NUM; i++)
{ {
srdt.ms_dev[i].FirstCmdTimeCnt = get_msec();
memset(szbuf, 0, sizeof(szbuf)); memset(szbuf, 0, sizeof(szbuf));
switch(devparam[i].ProtocolIdx) switch(devparam[i].ProtocolIdx)
{ {
@ -896,11 +1136,17 @@ void GM_StartSerialComm(void)
LOGI("启动数据采样!"); LOGI("启动数据采样!");
/* 直接使用循环进行采样处理*/ /* 直接使用循环进行采样处理*/
polltime = get_msec();
for(;;) for(;;)
{ {
usleep(5000); usleep(TIMER_CNT*100);
//LOGW("polltime=%ldms", get_msec()-polltime);
polltime = get_msec();
if(GM_SerialTimer() < 0) if(GM_SerialTimer() < 0)
{
LOGV("退出采样流程!");
break; break;
}
} }
return; return;
} }
@ -994,11 +1240,13 @@ void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx)
int GM_SerialTimer(void) int GM_SerialTimer(void)
{ {
int flag = -1;
Gm_FindAllSensorsCommand(); Gm_FindAllSensorsCommand();
GM_IsCloseSensors(); GM_IsCloseSensors();
GM_AllSerialComRecv(); GM_AllSerialComRecv();
GM_ReadWireTemAndCloseTimer(); flag = GM_CloseTimer();
return 1; return flag;
} }
/******************************************************************************** /********************************************************************************
@ -1024,12 +1272,14 @@ void Gm_FindAllSensorsCommand(void)
curidx = (curidx+1)%MAX_SERIAL_DEV_NUM; curidx = (curidx+1)%MAX_SERIAL_DEV_NUM;
if(j != devparam[curidx].commid) if(j != devparam[curidx].commid)
continue; continue;
if(srdt.ms_dev[curidx].IsNeedSerial == 0)
continue;
if(serialport[devparam[curidx].commid].fd < 0)
Gm_OpenSerialPort(curidx);
if(serialport[devparam[curidx].commid].cmdlen > 0) if(serialport[devparam[curidx].commid].cmdlen > 0)
break; break;
flag = -1; flag = -1;
if(srdt.ms_dev[curidx].IsNeedSerial == 0)
continue;
switch(devparam[curidx].ProtocolIdx) switch(devparam[curidx].ProtocolIdx)
{ {
case WEATHER_PROTOCOL: /* 温湿度气压*/ case WEATHER_PROTOCOL: /* 温湿度气压*/
@ -1079,15 +1329,18 @@ void GM_IsCloseSensors(void)
case RALLY_PROTOCOL: /* 拉力*/ case RALLY_PROTOCOL: /* 拉力*/
case WIND_PROTOCOL: /* 风速风向*/ case WIND_PROTOCOL: /* 风速风向*/
case SLANT_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; 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); //Gm_CtrlCloseSensorsPower(i);
} }
else
srdt.ms_dev[i].FirstCmdTimeCnt++;
break; break;
case PELCO_D_PROTOCOL: /* 摄像机类型*/ case PELCO_D_PROTOCOL: /* 摄像机类型*/
case PELCO_P_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; int i, j, iretime;
char buf[256]; char buf[256];
for(i=0; i<MAX_SERIAL_DEV_NUM; i++) for(i=0; i<MAX_SERIAL_DEV_NUM; i++)
{ {
if(((srdt.ms_dev[i].IsNeedSerial == 1) || ((srdt.sampling & 0x02) == 0x02)) if((srdt.ms_dev[i].IsNeedSerial == 1)
&& ((0<devparam[i].ProtocolIdx)&&(INVALID_PROTOCOL >devparam[i].ProtocolIdx))) && ((0<devparam[i].ProtocolIdx)&&(INVALID_PROTOCOL >devparam[i].ProtocolIdx)))
break; break;
} }
if(i < MAX_SERIAL_DEV_NUM) if(i < MAX_SERIAL_DEV_NUM)
{ {
return; // 寻找 return 1; // 寻找
} }
else // 关闭所有串口及电源 else // 关闭所有串口及电源
{ {
#if 0
for(i=0; i<MAX_SERIAL_DEV_NUM; i++) for(i=0; i<MAX_SERIAL_DEV_NUM; i++)
{ {
if((srdt.ms_dev[i].IsNeedSerial == 1) && (7 == devparam[i].ProtocolIdx)) if((srdt.ms_dev[i].IsNeedSerial == 1) && (7 == devparam[i].ProtocolIdx))
@ -1215,7 +1469,10 @@ void GM_ReadWireTemAndCloseTimer(void)
//StartTimer(GM_SERIAL_START, TIMER_CNT, GM_SerialTimer); //StartTimer(GM_SERIAL_START, TIMER_CNT, GM_SerialTimer);
} }
else else
{ {
#endif
#if 0
for(i=0; i<MAX_SERIAL_DEV_NUM; i++) for(i=0; i<MAX_SERIAL_DEV_NUM; i++)
{ {
if((srdt.ms_dev[i].IsNeedSerial == 1) && (RESERVE5_PROTOCOL == devparam[i].ProtocolIdx)) if((srdt.ms_dev[i].IsNeedSerial == 1) && (RESERVE5_PROTOCOL == devparam[i].ProtocolIdx))
@ -1225,12 +1482,14 @@ void GM_ReadWireTemAndCloseTimer(void)
return; return;
else else
{ {
#endif
Gm_CloseSerialPort(); Gm_CloseSerialPort();
for(j=0; j<MAX_SERIAL_PORT_NUM; j++) for(j=0; j<MAX_SERIAL_PORT_NUM; j++)
ClearCmdFormPollCmdBuf(j); ClearCmdFormPollCmdBuf(j);
sprintf(buf, "关闭串口定时器!"); sprintf(buf, "关闭串口定时器!");
LOGI("%s", buf); LOGI("%s", buf);
//StopTimer(GM_SERIAL_START); return -1;
#if 0
//g_usleep &= 0xFE; //g_usleep &= 0xFE;
//if(0 == g_usleep) //if(0 == g_usleep)
{ {
@ -1242,6 +1501,7 @@ void GM_ReadWireTemAndCloseTimer(void)
//sprintf(buf, "usleep=%d", g_usleep); //sprintf(buf, "usleep=%d", g_usleep);
//DebugStringPrintf(buf, strlen(buf), 1); //DebugStringPrintf(buf, strlen(buf), 1);
srdt.sampling &= 0xFA; srdt.sampling &= 0xFA;
if(1 == srdt.uRunMode) if(1 == srdt.uRunMode)
{ {
GM_StartSerialComm(); GM_StartSerialComm();
@ -1251,16 +1511,19 @@ void GM_ReadWireTemAndCloseTimer(void)
} }
} }
srdt.tempsamplingstartime = -1; srdt.tempsamplingstartime = -1;
} }
#endif
#if 0
if(0 == srdt.selfflag) if(0 == srdt.selfflag)
; ;
else else
;//Gm_CloseSerialPower(); ;//Gm_CloseSerialPower();
srdt.clcyesampling = 0; //srdt.clcyesampling = 0;
//Gm_CloseAllSensorsPower(); //Gm_CloseAllSensorsPower();
srdt.selfflag = 0; //srdt.selfflag = 0;
} //}
#endif
} }
} }
@ -1476,6 +1739,7 @@ void CameraPhotoPortDataProcess( int port)
} }
} }
long lsendtime=0;
/********************************************************************************* /*********************************************************************************
**********************************************************************************/ **********************************************************************************/
@ -1497,8 +1761,9 @@ void SendCmdFormPollCmdBuf( int port )
if(pPortParam->SendCmdFlag && (pPortParam->RevCmdFlag == 0)) if(pPortParam->SendCmdFlag && (pPortParam->RevCmdFlag == 0))
{ {
pPortParam->RetryTimeCnt++; pPortParam->RetryTimeCnt++;
if(srdt.sendphotocmdcnt > 0) //if(srdt.sendphotocmdcnt > 0)
idelay = 10*1000/TIMER_CNT; // idelay = 10*1000/TIMER_CNT;
//LOGV("polltime:%ldms", get_msec()-srdt.ms_dev[0].FirstCmdTimeCnt);
if(pPortParam->RetryTimeCnt < (pPortParam->RetryTime+idelay)) if(pPortParam->RetryTimeCnt < (pPortParam->RetryTime+idelay))
{ {
return; return;
@ -1558,6 +1823,8 @@ void SendCmdFormPollCmdBuf( int port )
sprintf(buf, "发送串口%d 装置%d命令:", port+1, srdt.curdevidx[port]+1); sprintf(buf, "发送串口%d 装置%d命令:", port+1, srdt.curdevidx[port]+1);
BytestreamLOG(buf, &pPortParam->PollCmd[i+2], len, 'D'); BytestreamLOG(buf, &pPortParam->PollCmd[i+2], len, 'D');
LOGW("sendtimeconst= %ld", get_msec()-lsendtime);
lsendtime = get_msec();
} }
pPortParam->SendCmdFlag = 1; pPortParam->SendCmdFlag = 1;
pPortParam->ReSendCmdFlag = 0; pPortParam->ReSendCmdFlag = 0;
@ -2027,21 +2294,21 @@ BYTE Gm_Pelco_DCheck( BYTE *msg, int len )
int FindNextShxyProtocolCommand( int devidx ) 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; 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++; //srdt.ms_dev[devidx].FirstCmdTimeCnt++;
return -1; return -1;
} }
if(SLANT_PROTOCOL == devparam[devidx].ProtocolIdx) //if(SLANT_PROTOCOL == devparam[devidx].ProtocolIdx)
MakeShxyProtocolPollCommand(devidx, 0x06); // MakeShxyProtocolPollCommand(devidx, 0x06);
else if(WEATHER_PROTOCOL== devparam[devidx].ProtocolIdx) //else if(WEATHER_PROTOCOL== devparam[devidx].ProtocolIdx)
MakeShxyProtocolPollCommand(devidx, 0x09); MakeShxyProtocolPollCommand(devidx, 0x09);
else //else
MakeShxyProtocolPollCommand(devidx, 0x08); //MakeShxyProtocolPollCommand(devidx, 0x08);
srdt.curdevidx[srdt.ms_dev[devidx].UseSerialidx] = devidx; srdt.curdevidx[srdt.ms_dev[devidx].UseSerialidx] = devidx;
return 1; return 1;
} }

@ -37,8 +37,6 @@ typedef unsigned char BYTE;
#define MAX_SERIAL_DEV_NUM 25 /* 最大接串口传感器数量*/ #define MAX_SERIAL_DEV_NUM 25 /* 最大接串口传感器数量*/
#define MAX_SERIAL_PORT_NUM 3 /* 最大串口数量*/ #define MAX_SERIAL_PORT_NUM 3 /* 最大串口数量*/
#define TIMER_CNT 10 // Poll命令定时器时间 50 ms
#define WEATHER_PROTOCOL 1 /* 温湿度协议序号*/ #define WEATHER_PROTOCOL 1 /* 温湿度协议序号*/
#define WIND_PROTOCOL 2 /* 风速风向协议序号*/ #define WIND_PROTOCOL 2 /* 风速风向协议序号*/
#define SLANT_PROTOCOL 3 /* 倾斜角协议序号*/ #define SLANT_PROTOCOL 3 /* 倾斜角协议序号*/
@ -60,7 +58,7 @@ typedef unsigned char BYTE;
#define MAX_PHOTO_FRAME_LEN 256 /* 图片数据一包最大长度*/ #define MAX_PHOTO_FRAME_LEN 256 /* 图片数据一包最大长度*/
#define RECVDATA_MAXLENTH 2048 /* 接收数据缓冲区最大值*/ #define RECVDATA_MAXLENTH 2048 /* 接收数据缓冲区最大值*/
#define TIMER_CNT 10 // Poll命令定时器时间 50 ms #define TIMER_CNT 50 // Poll命令定时器时间 5 ms
#define SENDDATA_MAXLENTH RECVDATA_MAXLENTH /* 正常发送数据缓冲区最大值*/ #define SENDDATA_MAXLENTH RECVDATA_MAXLENTH /* 正常发送数据缓冲区最大值*/
// 摄像机控制命令宏定义 // 摄像机控制命令宏定义
@ -208,7 +206,7 @@ typedef struct
21->b*/ 21->b*/
int enrecvtime; /* 发送加密命令后接收到应答计时*/ int enrecvtime; /* 发送加密命令后接收到应答计时*/
int FirstCmdTimeCnt; /* 读取雨量计时计数*/ long FirstCmdTimeCnt; /* 串口读取数据起始时间*/
u_char nextcmd; /* 第二次发送读取气象雨量命令 u_char nextcmd; /* 第二次发送读取气象雨量命令
使: 使:
0x00; 0x00;
@ -233,7 +231,6 @@ typedef struct
u_char IsGprs; /* GPRS网络是否注册*/ u_char IsGprs; /* GPRS网络是否注册*/
u_char IsHexToAt; /* 串口1是否使用At指令(0:使用At指令;1:使用16进制数据传输)*/ u_char IsHexToAt; /* 串口1是否使用At指令(0:使用At指令;1:使用16进制数据传输)*/
u_char CommMod; /* 通讯模式(0:自动切换通讯模式;1:手动强制使用光网通讯;2:手动强制使用GPRS通讯)*/
u_char sampling; /* 正在进行采样(0:没有进行采样;1:正在进行采样;)*/ u_char sampling; /* 正在进行采样(0:没有进行采样;1:正在进行采样;)*/
u_char clcyesampling; /* 正在进行采样(0:没有进行采样;1:正在进行采样;)*/ u_char clcyesampling; /* 正在进行采样(0:没有进行采样;1:正在进行采样;)*/
@ -335,8 +332,8 @@ void Gm_FindAllSensorsCommand(void);
void GM_IsCloseSensors(void); void GM_IsCloseSensors(void);
//检查所有串口是否有数据接收,有则启动接收 //检查所有串口是否有数据接收,有则启动接收
void GM_AllSerialComRecv(void); void GM_AllSerialComRecv(void);
//读取被动接收的测温球数据以及判断是否需要关闭定时器 //判断是否需要关闭定时器
void GM_ReadWireTemAndCloseTimer(void); int GM_CloseTimer(void);
// 串口接收数据处理 // 串口接收数据处理
void SerialDataProcess(int devidx, u_char *buf, int len); void SerialDataProcess(int devidx, u_char *buf, int len);

Loading…
Cancel
Save