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

serial
huyizhong 1 year ago
parent 1e8704e60e
commit 5c0e8b3abf

@ -640,12 +640,21 @@ void Gm_OpenSerialPort(int devidx)
// 关闭串口通讯
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)
{
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<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)
{
int i;
char szbuf[128];
//Gm_InitSerialComm_Test();
Gm_InitSerialComm_Test();
// srdt 配置
//srdt.sampling = 0;
//srdt.PtzCmdType = Cmd_Cancel; // 云台指令类型
//srdt.SendStopPtzCmdTimeCnt=-1; // 发送云台停止指令计数
//srdt.uRunMode = 0;
srdt.CommMod = 0;
//srdt.CommMod = 0;
// 查找装置使用的串口序号
FindDevUseSerialCommNo();
//FindDevUseSerialCommNo();
#if 0
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));
/* 目前还不确定具体串口分配暂时默认使用串口1</dev/ttyS0>*/
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<MAX_SERIAL_DEV_NUM; i++)
{
srdt.ms_dev[i].FirstCmdTimeCnt = get_msec();
memset(szbuf, 0, sizeof(szbuf));
switch(devparam[i].ProtocolIdx)
{
@ -896,12 +1136,18 @@ void GM_StartSerialComm(void)
LOGI("启动数据采样!");
/* 直接使用循环进行采样处理*/
polltime = get_msec();
for(;;)
{
usleep(5000);
usleep(TIMER_CNT*100);
//LOGW("polltime=%ldms", get_msec()-polltime);
polltime = get_msec();
if(GM_SerialTimer() < 0)
{
LOGV("退出采样流程!");
break;
}
}
return;
}
@ -994,11 +1240,13 @@ void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx)
int GM_SerialTimer(void)
{
int flag = -1;
Gm_FindAllSensorsCommand();
GM_IsCloseSensors();
GM_AllSerialComRecv();
GM_ReadWireTemAndCloseTimer();
return 1;
flag = GM_CloseTimer();
return flag;
}
/********************************************************************************
@ -1024,12 +1272,14 @@ void Gm_FindAllSensorsCommand(void)
curidx = (curidx+1)%MAX_SERIAL_DEV_NUM;
if(j != devparam[curidx].commid)
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)
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; 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)))
break;
}
if(i < MAX_SERIAL_DEV_NUM)
{
return; // 寻找
return 1; // 寻找
}
else // 关闭所有串口及电源
{
#if 0
for(i=0; i<MAX_SERIAL_DEV_NUM; i++)
{
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);
}
else
{
#endif
#if 0
for(i=0; i<MAX_SERIAL_DEV_NUM; i++)
{
if((srdt.ms_dev[i].IsNeedSerial == 1) && (RESERVE5_PROTOCOL == devparam[i].ProtocolIdx))
@ -1225,12 +1482,14 @@ void GM_ReadWireTemAndCloseTimer(void)
return;
else
{
#endif
Gm_CloseSerialPort();
for(j=0; j<MAX_SERIAL_PORT_NUM; j++)
ClearCmdFormPollCmdBuf(j);
sprintf(buf, "关闭串口定时器!");
LOGI("%s", buf);
//StopTimer(GM_SERIAL_START);
return -1;
#if 0
//g_usleep &= 0xFE;
//if(0 == g_usleep)
{
@ -1242,6 +1501,7 @@ void GM_ReadWireTemAndCloseTimer(void)
//sprintf(buf, "usleep=%d", g_usleep);
//DebugStringPrintf(buf, strlen(buf), 1);
srdt.sampling &= 0xFA;
if(1 == srdt.uRunMode)
{
GM_StartSerialComm();
@ -1252,15 +1512,18 @@ void GM_ReadWireTemAndCloseTimer(void)
}
srdt.tempsamplingstartime = -1;
}
#endif
#if 0
if(0 == srdt.selfflag)
;
else
;//Gm_CloseSerialPower();
srdt.clcyesampling = 0;
//srdt.clcyesampling = 0;
//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))
{
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;
}

@ -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
21->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);

@ -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);

@ -640,12 +640,21 @@ void Gm_OpenSerialPort(int devidx)
// 关闭串口通讯
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)
{
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<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)
{
int i;
char szbuf[128];
//Gm_InitSerialComm_Test();
Gm_InitSerialComm_Test();
// srdt 配置
//srdt.sampling = 0;
//srdt.PtzCmdType = Cmd_Cancel; // 云台指令类型
//srdt.SendStopPtzCmdTimeCnt=-1; // 发送云台停止指令计数
//srdt.uRunMode = 0;
srdt.CommMod = 0;
//srdt.CommMod = 0;
// 查找装置使用的串口序号
FindDevUseSerialCommNo();
//FindDevUseSerialCommNo();
#if 0
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));
/* 目前还不确定具体串口分配暂时默认使用串口1</dev/ttyS0>*/
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<MAX_SERIAL_DEV_NUM; i++)
{
srdt.ms_dev[i].FirstCmdTimeCnt = get_msec();
memset(szbuf, 0, sizeof(szbuf));
switch(devparam[i].ProtocolIdx)
{
@ -896,12 +1136,18 @@ void GM_StartSerialComm(void)
LOGI("启动数据采样!");
/* 直接使用循环进行采样处理*/
polltime = get_msec();
for(;;)
{
usleep(5000);
usleep(TIMER_CNT*100);
//LOGW("polltime=%ldms", get_msec()-polltime);
polltime = get_msec();
if(GM_SerialTimer() < 0)
{
LOGV("退出采样流程!");
break;
}
}
return;
}
@ -994,11 +1240,13 @@ void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx)
int GM_SerialTimer(void)
{
int flag = -1;
Gm_FindAllSensorsCommand();
GM_IsCloseSensors();
GM_AllSerialComRecv();
GM_ReadWireTemAndCloseTimer();
return 1;
flag = GM_CloseTimer();
return flag;
}
/********************************************************************************
@ -1024,12 +1272,14 @@ void Gm_FindAllSensorsCommand(void)
curidx = (curidx+1)%MAX_SERIAL_DEV_NUM;
if(j != devparam[curidx].commid)
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)
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; 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)))
break;
}
if(i < MAX_SERIAL_DEV_NUM)
{
return; // 寻找
return 1; // 寻找
}
else // 关闭所有串口及电源
{
#if 0
for(i=0; i<MAX_SERIAL_DEV_NUM; i++)
{
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);
}
else
{
#endif
#if 0
for(i=0; i<MAX_SERIAL_DEV_NUM; i++)
{
if((srdt.ms_dev[i].IsNeedSerial == 1) && (RESERVE5_PROTOCOL == devparam[i].ProtocolIdx))
@ -1225,12 +1482,14 @@ void GM_ReadWireTemAndCloseTimer(void)
return;
else
{
#endif
Gm_CloseSerialPort();
for(j=0; j<MAX_SERIAL_PORT_NUM; j++)
ClearCmdFormPollCmdBuf(j);
sprintf(buf, "关闭串口定时器!");
LOGI("%s", buf);
//StopTimer(GM_SERIAL_START);
return -1;
#if 0
//g_usleep &= 0xFE;
//if(0 == g_usleep)
{
@ -1242,6 +1501,7 @@ void GM_ReadWireTemAndCloseTimer(void)
//sprintf(buf, "usleep=%d", g_usleep);
//DebugStringPrintf(buf, strlen(buf), 1);
srdt.sampling &= 0xFA;
if(1 == srdt.uRunMode)
{
GM_StartSerialComm();
@ -1252,15 +1512,18 @@ void GM_ReadWireTemAndCloseTimer(void)
}
srdt.tempsamplingstartime = -1;
}
#endif
#if 0
if(0 == srdt.selfflag)
;
else
;//Gm_CloseSerialPower();
srdt.clcyesampling = 0;
//srdt.clcyesampling = 0;
//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))
{
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;
}

@ -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
21->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);

Loading…
Cancel
Save