完善多串口多装置代码,可以下发命令,查找轮询空循环问题,测试IO查询,确定电源状态不能查询

serial
huyizhong 1 year ago
parent 5c0e8b3abf
commit 61999c7836

@ -23,8 +23,8 @@
SIO_PARAM_SERIAL_DEF serialport[MAX_SERIAL_PORT_NUM]; SIO_PARAM_SERIAL_DEF serialport[MAX_SERIAL_PORT_NUM];
SERIAL_PARAM devparam[MAX_SERIAL_DEV_NUM]; SERIAL_PARAM devparam[MAX_SERIAL_DEV_NUM];
#if 0
float weatherpntmsg[10]; //float weatherpntmsg[10];
static void setInt(int cmd, int value) static void setInt(int cmd, int value)
{ {
@ -35,12 +35,31 @@ static void setInt(int cmd, int value)
// LOGE("set_int fd=%d,cmd=%d,value=%d\r\n",fd, cmd, value); // LOGE("set_int fd=%d,cmd=%d,value=%d\r\n",fd, cmd, value);
if( fd > 0 ) if( fd > 0 )
{ {
int res = ioctl(fd, IOT_PARAM_WRITE, &param); ioctl(fd, IOT_PARAM_WRITE, &param);
// LOGE("set_int22 cmd=%d,value=%d,result=%d\r\n",param.cmd, param.value, param.result); // LOGE("set_int22 cmd=%d,value=%d,result=%d\r\n",param.cmd, param.value, param.result);
close(fd); close(fd);
} }
return; //return;
}
int getInt(int cmd)
{
int fd = open("/dev/mtkgpioctrl", O_RDONLY);
// LOGE("get_int fd=%d,cmd=%d\r\n",fd, cmd);
if( fd > 0 )
{
IOT_PARAM param;
param.cmd = cmd;
ioctl(fd, IOT_PARAM_READ, &param);
#ifdef _DEBUG
ALOGI("getInt cmd=%d,value=%d,result=%d\r\n",param.cmd, param.value, param.result);
#endif
close(fd);
return param.value;
}
return -1;
} }
static void setRS485Enable(bool z) { static void setRS485Enable(bool z) {
setInt(CMD_SET_485_EN_STATE, z ? 1 : 0); setInt(CMD_SET_485_EN_STATE, z ? 1 : 0);
} }
@ -60,6 +79,8 @@ static void setCam3V3Enable(bool enabled)
{ {
setInt(CMD_SET_CAM_3V3_EN_STATE, enabled ? 1 : 0); setInt(CMD_SET_CAM_3V3_EN_STATE, enabled ? 1 : 0);
} }
#if 0
/********************************************************************************* /*********************************************************************************
* * * *
**********************************************************************************/ **********************************************************************************/
@ -510,13 +531,13 @@ AI_DEF rallypntmsg[6][RALLY_DATA_NUM];
AI_DEF slantpntmsg[6][SLANTANGLE_DATA_NUM]; AI_DEF slantpntmsg[6][SLANTANGLE_DATA_NUM];
//extern void * memset(void *m, int c, unsigned int n); //extern void * memset(void *m, int c, unsigned int n);
extern int atoi(const char *s); //extern int atoi(const char *s);
//extern int Gm_GetSamplingTimeSec(void); //extern int Gm_GetSamplingTimeSec(void);
//extern void Delayms(kal_uint32 time); //extern void Delayms(kal_uint32 time);
extern void srand( unsigned int seed ); //extern void srand( unsigned int seed );
extern int rand( void ); //extern int rand( void );
static long get_msec(void ) static long get_msec()
{ {
struct timeval tv; struct timeval tv;
@ -529,40 +550,48 @@ static long get_msec(void )
/* /*
*/ */
void Gm_OpenSerialPower(void) void Gm_OpenSerialPower()
{ {
/*由传送的主站的地方来控制串口电源,这里不实现*/; /*由传送的主站的地方来控制串口电源,这里不实现*/;
} }
// 关闭串口电源 // 关闭串口电源
void Gm_CloseSerialPower(void) void Gm_CloseSerialPower()
{ {
} }
// 关闭传感器电源 // 关闭传感器电源
void Gm_CloseSensorsPower(int port) void Gm_CloseSensorsPower(int port)
{ {
char iIoNo; //char iIoNo;
char szbuf[128]; char szbuf[128];
sprintf(szbuf, "Close Sensors port %d Power!", port); sprintf(szbuf, "Close Sensors port %d Power!", port);
/* 关闭电源*/ /* 关闭电源*/
//switch(port) //switch(port)
/* 根据硬件具体布置最后调整,目前是微拍板子的来控制*/
set12VEnable(false);
setCam3V3Enable(false);
setRS485Enable(false);
} }
// 打开传感器电源 // 打开传感器电源
void Gm_OpenSensorsPower(int port) void Gm_OpenSensorsPower(int port)
{ {
char iIoNo; //char iIoNo;
char szbuf[128]; char szbuf[128];
if(0 == port) if(0 == port)
return; return;
sprintf(szbuf, "Open Sensors port %d Power!", port); sprintf(szbuf, "Open Sensors port %d Power!", port);
/* 打开电源*/
set12VEnable(true);
setCam3V3Enable(true);
setRS485Enable(true);
/* 打开电源*/
//switch(port) //switch(port)
} }
@ -638,7 +667,7 @@ void Gm_OpenSerialPort(int devidx)
} }
// 关闭串口通讯 // 关闭串口通讯
void Gm_CloseSerialPort(void) void Gm_CloseSerialPort()
{ {
int i; int i;
@ -706,7 +735,7 @@ int Gm_SetSerialPortParam(int commid)
return ret; return ret;
} }
void Gm_InitSerialComm_Test(void) void Gm_InitSerialComm_Test()
{ {
int i, j; int i, j;
@ -740,7 +769,8 @@ void Gm_InitSerialComm_Test(void)
devparam[0].parity = 0; devparam[0].parity = 0;
devparam[0].IsNoInsta = 1; devparam[0].IsNoInsta = 1;
//devparam[0].PowerPort = 2; //devparam[0].PowerPort = 2;
devparam[0].devaddr = 4; //devparam[0].devaddr = 4;
devparam[0].devaddr = 2;
devparam[1].ProtocolIdx = WEATHER_PROTOCOL; devparam[1].ProtocolIdx = WEATHER_PROTOCOL;
devparam[1].baudrate = B9600; devparam[1].baudrate = B9600;
@ -750,17 +780,20 @@ void Gm_InitSerialComm_Test(void)
devparam[1].parity = 0; devparam[1].parity = 0;
devparam[1].IsNoInsta = 1; devparam[1].IsNoInsta = 1;
//devparam[1].PowerPort = 14; //devparam[1].PowerPort = 14;
devparam[1].devaddr = 1; //devparam[1].devaddr = 1;
#if 0 devparam[1].devaddr = 13;
devparam[2].ProtocolIdx = SLANT_PROTOCOL;
devparam[2].baudrate = 1200; devparam[2].ProtocolIdx = RALLY_PROTOCOL;
devparam[2].baudrate = B9600;
devparam[2].databit = 8; devparam[2].databit = 8;
devparam[2].stopbit = 1; memset(devparam[2].stopbit, 0, sizeof(devparam[2].stopbit));
sprintf(devparam[2].stopbit, "1");
devparam[2].parity = 0; devparam[2].parity = 0;
devparam[2].IsNoInsta = 0; devparam[2].IsNoInsta = 1;
//devparam[2].PowerPort = 3; //devparam[2].PowerPort = 3;
devparam[2].devaddr = 2; //devparam[2].devaddr = 13;
devparam[2].devaddr = 13;
#if 0
devparam[3].ProtocolIdx = PELCO_P_PROTOCOL; devparam[3].ProtocolIdx = PELCO_P_PROTOCOL;
devparam[3].baudrate = 9600; devparam[3].baudrate = 9600;
devparam[3].databit = 8; devparam[3].databit = 8;
@ -852,16 +885,18 @@ void Gm_InitSerialComm_Test(void)
devparam[12].IsNoInsta = 1; devparam[12].IsNoInsta = 1;
//devparam[12].PowerPort = 8; //devparam[12].PowerPort = 8;
devparam[12].devaddr = 5; devparam[12].devaddr = 5;
#endif
devparam[13].ProtocolIdx = SLANT_PROTOCOL; devparam[13].ProtocolIdx = SLANT_PROTOCOL;
devparam[13].baudrate = 1200; devparam[13].baudrate = B9600;
devparam[13].databit = 8; devparam[13].databit = 8;
devparam[13].stopbit = 1; memset(devparam[13].stopbit, 0, sizeof(devparam[13].stopbit));
sprintf(devparam[13].stopbit, "1");
devparam[13].parity = 0; devparam[13].parity = 0;
//devparam[13].PowerPort = 4; //devparam[13].PowerPort = 4;
devparam[13].IsNoInsta = 1; devparam[13].IsNoInsta = 1;
devparam[13].devaddr = 2; devparam[13].devaddr = 2;
#if 0
devparam[14].ProtocolIdx = SLANT_PROTOCOL; devparam[14].ProtocolIdx = SLANT_PROTOCOL;
devparam[14].baudrate = 1200; devparam[14].baudrate = 1200;
devparam[14].databit = 8; devparam[14].databit = 8;
@ -935,7 +970,7 @@ void Gm_InitSerialComm_Test(void)
} }
// 初始化所有串口及所接传感器的配置 // 初始化所有串口及所接传感器的配置
void Gm_InitSerialComm(void) void Gm_InitSerialComm()
{ {
int i; int i;
char szbuf[128]; char szbuf[128];
@ -1003,7 +1038,6 @@ void Gm_InitSerialComm(void)
else else
sprintf(szbuf, "已启用!"); sprintf(szbuf, "已启用!");
LOGI("%s", szbuf); LOGI("%s", szbuf);
} }
#endif #endif
#if 0 #if 0
@ -1041,7 +1075,7 @@ void Gm_InitSerialComm(void)
} }
// 通过传感器名称来确定使用的串口号 // 通过传感器名称来确定使用的串口号
void FindDevUseSerialCommNo(void) void FindDevUseSerialCommNo()
{ {
int i; int i;
@ -1068,7 +1102,7 @@ void FindDevUseSerialCommNo(void)
} }
} }
void GM_StartSerialComm(void) void GM_StartSerialComm()
{ {
int i, j; int i, j;
char szbuf[64]; char szbuf[64];
@ -1128,10 +1162,37 @@ void GM_StartSerialComm(void)
srdt.ms_dev[i].IsNeedSerial = 0; srdt.ms_dev[i].IsNeedSerial = 0;
continue; continue;
} }
// 测试查询传感器电源状态
#if 0
LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE));
LOGE("3.3V state= %d", getInt(CMD_SET_CAM_3V3_EN_STATE));
LOGE("485 state=%d", getInt(CMD_SET_485_EN_STATE));
set12VEnable(true);
setCam3V3Enable(true);
setRS485Enable(true);
sleep(1);
LOGV("12V state=%d", getInt(CMD_SET_12V_EN_STATE));
LOGV("3.3V state= %d", getInt(CMD_SET_CAM_3V3_EN_STATE));
LOGV("485 state=%d", getInt(CMD_SET_485_EN_STATE));
set12VEnable(false);
setCam3V3Enable(false);
setRS485Enable(false);
sleep(1);
LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE));
LOGE("3.3V state= %d", getInt(CMD_SET_CAM_3V3_EN_STATE));
LOGE("485 state=%d", getInt(CMD_SET_485_EN_STATE));
#endif
// 打开传感器电源 // 打开传感器电源
// 打开对应的485电源 // 打开对应的485电源
// 打开串口通讯 // 打开串口通讯
Gm_OpenSerialPort(i); if(1 == srdt.ms_dev[i].IsNeedSerial)
{
Gm_OpenSensorsPower(i);
Gm_OpenSerialPort(i);
}
//LOGV("12V state=%d", getInt(CMD_SET_12V_EN_STATE));
} }
LOGI("启动数据采样!"); LOGI("启动数据采样!");
@ -1139,11 +1200,12 @@ void GM_StartSerialComm(void)
polltime = get_msec(); polltime = get_msec();
for(;;) for(;;)
{ {
usleep(TIMER_CNT*100); usleep(10);
//LOGW("polltime=%ldms", get_msec()-polltime); LOGW("polltime=%ldms", get_msec()-polltime);
polltime = get_msec(); polltime = get_msec();
if(GM_SerialTimer() < 0) if(GM_SerialTimer() < 0)
{ {
//LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE));
LOGV("退出采样流程!"); LOGV("退出采样流程!");
break; break;
} }
@ -1165,7 +1227,8 @@ void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx)
//DebugStringPrintf(szbuf, strlen(szbuf), 1); //DebugStringPrintf(szbuf, strlen(szbuf), 1);
if(0 == srdt.selfflag) if(0 == srdt.selfflag)
srdt.selfflag = 1; srdt.selfflag = 1;
Gm_OpenSerialPower(); //Gm_OpenSerialPower();
//Gm_OpenSensorsPower();
//if(0x00 == srdt.sampling) //if(0x00 == srdt.sampling)
//{ //{
// Gm_OpenSerialPort(); // Gm_OpenSerialPort();
@ -1242,10 +1305,12 @@ int GM_SerialTimer(void)
{ {
int flag = -1; int flag = -1;
Gm_FindAllSensorsCommand(); GM_AllSerialComRecv();
GM_IsCloseSensors(); GM_IsCloseSensors();
Gm_FindAllSensorsCommand();
GM_AllSerialComRecv(); GM_AllSerialComRecv();
flag = GM_CloseTimer(); flag = GM_CloseTimer();
//LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE));
return flag; return flag;
} }
@ -1263,7 +1328,7 @@ void Gm_FindAllSensorsCommand(void)
//Gm_CheckSensorsPower(); /* 暂时不考虑电源控制*/ //Gm_CheckSensorsPower(); /* 暂时不考虑电源控制*/
for(j=0; j<MAX_SERIAL_PORT_NUM; j++) for(j=0; j<MAX_SERIAL_PORT_NUM; j++)
{ {
// 发送缓冲区中命令 // 发送缓冲区中命令 接收到了应答报文,紧接着进行缓冲区清理
SendCmdFormPollCmdBuf(j); SendCmdFormPollCmdBuf(j);
// 串口已经被占用则直接跳过 // 串口已经被占用则直接跳过
curidx = srdt.curdevidx[j]; curidx = srdt.curdevidx[j];
@ -1278,6 +1343,10 @@ void Gm_FindAllSensorsCommand(void)
Gm_OpenSerialPort(curidx); Gm_OpenSerialPort(curidx);
if(serialport[devparam[curidx].commid].cmdlen > 0) if(serialport[devparam[curidx].commid].cmdlen > 0)
break; break;
//LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE));
//LOGE("3.3V state= %d", getInt(CMD_SET_CAM_3V3_EN_STATE));
//LOGE("485 state=%d", getInt(CMD_SET_485_EN_STATE));
flag = -1; flag = -1;
switch(devparam[curidx].ProtocolIdx) switch(devparam[curidx].ProtocolIdx)
@ -1304,6 +1373,8 @@ void Gm_FindAllSensorsCommand(void)
srdt.curdevidx[j] = curidx; srdt.curdevidx[j] = curidx;
break; break;
} }
// 发送缓冲区中命令 生成了命令之后紧接着进行命令发送
SendCmdFormPollCmdBuf(j);
} }
} }
@ -1382,13 +1453,17 @@ void GM_AllSerialComRecv(void)
memset(recvbuf, 0, sizeof(recvbuf)); memset(recvbuf, 0, sizeof(recvbuf));
if(serialport[j].fd < 0) if(serialport[j].fd < 0)
continue; continue;
recvlen = read(serialport[j].fd, recvbuf, sizeof(recvbuf));/* 在串口读取字符串 */ for(;;)
{
recvlen = read(serialport[j].fd, recvbuf, sizeof(recvbuf));/* 在串口读取字符串 */
if(recvlen < 1) if(recvlen < 1)
continue; break;
sprintf(buf, "收到串口%d, %d字节数据:", j+1, recvlen); sprintf(buf, "收到串口%d, %d字节数据:", j+1, recvlen);
BytestreamLOG(buf, recvbuf, recvlen, 'I'); BytestreamLOG(buf, recvbuf, recvlen, 'I');
SerialDataProcess(srdt.curdevidx[j], recvbuf, recvlen); SerialDataProcess(srdt.curdevidx[j], recvbuf, recvlen);
}
} }
} }
@ -1484,6 +1559,8 @@ int GM_CloseTimer(void)
{ {
#endif #endif
Gm_CloseSerialPort(); Gm_CloseSerialPort();
for(j=0; j< MAX_SERIAL_DEV_NUM; j++)
Gm_CloseSensorsPower(j);
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, "关闭串口定时器!");
@ -1531,11 +1608,10 @@ void SerialDataProcess(int devidx, u_char *buf, int len)
{ {
switch(devparam[devidx].ProtocolIdx) switch(devparam[devidx].ProtocolIdx)
{ {
#if 1
case WEATHER_PROTOCOL: /* 气象*/ case WEATHER_PROTOCOL: /* 气象*/
case RALLY_PROTOCOL: /* 拉力*/ case RALLY_PROTOCOL: /* 拉力*/
case WIND_PROTOCOL: /* 风速风向*/ case WIND_PROTOCOL: /* 风速风向*/
#endif
case SLANT_PROTOCOL: /* 倾角*/ case SLANT_PROTOCOL: /* 倾角*/
ShxyProtocolRecvData(devidx, buf, len); ShxyProtocolRecvData(devidx, buf, len);
break; break;
@ -1746,7 +1822,7 @@ long lsendtime=0;
void SendCmdFormPollCmdBuf( int port ) void SendCmdFormPollCmdBuf( int port )
{ {
char buf[64]; char buf[64];
int len, idelay=0, i, ret; int len, idelay=0, ret;
SIO_PARAM_SERIAL_DEF *pPortParam; SIO_PARAM_SERIAL_DEF *pPortParam;
//int recvlen; //int recvlen;
//u_char recvbuf[300]; //u_char recvbuf[300];
@ -1822,7 +1898,7 @@ 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[2], len, 'D');
LOGW("sendtimeconst= %ld", get_msec()-lsendtime); LOGW("sendtimeconst= %ld", get_msec()-lsendtime);
lsendtime = get_msec(); lsendtime = get_msec();
} }
@ -2303,12 +2379,18 @@ int FindNextShxyProtocolCommand( int devidx )
//srdt.ms_dev[devidx].FirstCmdTimeCnt++; //srdt.ms_dev[devidx].FirstCmdTimeCnt++;
return -1; return -1;
} }
//if(SLANT_PROTOCOL == devparam[devidx].ProtocolIdx) #if 0
// MakeShxyProtocolPollCommand(devidx, 0x06); if(SLANT_PROTOCOL == devparam[devidx].ProtocolIdx)
{
devparam[devidx].devaddr = 0xFF;
MakeShxyProtocolPollCommand(devidx, 0x02);
}
//else if(WEATHER_PROTOCOL== devparam[devidx].ProtocolIdx) //else if(WEATHER_PROTOCOL== devparam[devidx].ProtocolIdx)
// MakeShxyProtocolPollCommand(devidx, 0x09);
else
#endif
MakeShxyProtocolPollCommand(devidx, 0x09); MakeShxyProtocolPollCommand(devidx, 0x09);
//else
//MakeShxyProtocolPollCommand(devidx, 0x08);
srdt.curdevidx[srdt.ms_dev[devidx].UseSerialidx] = devidx; srdt.curdevidx[srdt.ms_dev[devidx].UseSerialidx] = devidx;
return 1; return 1;
} }
@ -2488,28 +2570,27 @@ void ShxyProtocolDataProcess( int commid)
BYTE cmdidx; BYTE cmdidx;
int i, j, aipnt, datanum; int i, j, aipnt, datanum;
SERIAL_DEV_DEF *pPortParam; SERIAL_DEV_DEF *pPortParam;
SIO_PARAM_SERIAL_DEF *serialport; SIO_PARAM_SERIAL_DEF *curserial;
char szbuf[64]; char szbuf[64];
pPortParam = &srdt.ms_dev[commid]; pPortParam = &srdt.ms_dev[commid];
serialport = &serialport[pPortParam->UseSerialidx]; curserial = &serialport[devparam[commid].commid];
//取出装置地址,开始处理地址+++ //取出装置地址,开始处理地址+++
if(0x02 == serialport->m_au8RecvBuf[5]) if(0x02 == curserial->m_au8RecvBuf[5])
{ {
devparam[commid].devaddr = serialport->m_au8RecvBuf[4]; devparam[commid].devaddr = curserial->m_au8RecvBuf[4];
//pPortParam->LinkOk = TRUE;
return; return;
} }
cmdidx = serialport->m_au8RecvBuf[5]; cmdidx = curserial->m_au8RecvBuf[5];
aipnt = pPortParam->SameTypeDevIdx; aipnt = pPortParam->SameTypeDevIdx;
uDevAddr = serialport->m_au8RecvBuf[4]; uDevAddr = curserial->m_au8RecvBuf[4];
fvalua = &fvalue; fvalua = &fvalue;
if(0x06 == cmdidx) if(0x06 == cmdidx)
{ {
if(0x08 !=serialport->m_au8RecvBuf[1]) if(0x08 !=curserial->m_au8RecvBuf[1])
return; return;
pPortParam->recvdatacnt++; pPortParam->recvdatacnt++;
if(pPortParam->recvdatacnt < 2) if(pPortParam->recvdatacnt < 2)
@ -2517,10 +2598,10 @@ void ShxyProtocolDataProcess( int commid)
// ++++++++++++++++++++++++++++ // ++++++++++++++++++++++++++++
//g_SelfTest.SensorsFault |= (0x800<<aipnt); //g_SelfTest.SensorsFault |= (0x800<<aipnt);
*(BYTE*)fvalua = serialport->m_au8RecvBuf[9]; *(BYTE*)fvalua = curserial->m_au8RecvBuf[9];
*((BYTE*)fvalua+1) = serialport->m_au8RecvBuf[8]; *((BYTE*)fvalua+1) = curserial->m_au8RecvBuf[8];
*((BYTE*)fvalua+2) = serialport->m_au8RecvBuf[7]; *((BYTE*)fvalua+2) = curserial->m_au8RecvBuf[7];
*((BYTE*)fvalua+3) = serialport->m_au8RecvBuf[6]; *((BYTE*)fvalua+3) = curserial->m_au8RecvBuf[6];
if((fvalue < -59) ||(fvalue > 59)) if((fvalue < -59) ||(fvalue > 59))
{ {
frnb = (GeneratingRandomNumber()%101-50)/1000.0; frnb = (GeneratingRandomNumber()%101-50)/1000.0;
@ -2538,10 +2619,10 @@ void ShxyProtocolDataProcess( int commid)
//XslantSec[aipnt][srdt.SectimesamplingCnt[0]] = (short)slantpntmsg[aipnt][0].EuValue; //XslantSec[aipnt][srdt.SectimesamplingCnt[0]] = (short)slantpntmsg[aipnt][0].EuValue;
//srdt.SectimesamplingCnt[0] += 1; //srdt.SectimesamplingCnt[0] += 1;
*(BYTE*)fvalua = serialport->m_au8RecvBuf[13]; *(BYTE*)fvalua = curserial->m_au8RecvBuf[13];
*((BYTE*)fvalua+1) = serialport->m_au8RecvBuf[12]; *((BYTE*)fvalua+1) = curserial->m_au8RecvBuf[12];
*((BYTE*)fvalua+2) = serialport->m_au8RecvBuf[11]; *((BYTE*)fvalua+2) = curserial->m_au8RecvBuf[11];
*((BYTE*)fvalua+3) = serialport->m_au8RecvBuf[10]; *((BYTE*)fvalua+3) = curserial->m_au8RecvBuf[10];
//if ((gDisSunRain & 0x20) == 0x20) //if ((gDisSunRain & 0x20) == 0x20)
{ {
sprintf(szbuf, "Y =%0.3f ", fvalue); sprintf(szbuf, "Y =%0.3f ", fvalue);
@ -2559,7 +2640,7 @@ void ShxyProtocolDataProcess( int commid)
//YslantSec[aipnt][srdt.SectimesamplingCnt[1]] = (short)slantpntmsg[aipnt][1].EuValue; //YslantSec[aipnt][srdt.SectimesamplingCnt[1]] = (short)slantpntmsg[aipnt][1].EuValue;
srdt.SectimesamplingCnt[1] += 1; srdt.SectimesamplingCnt[1] += 1;
} }
datanum = serialport->m_au8RecvBuf[6]; datanum = curserial->m_au8RecvBuf[6];
if((0x08 != cmdidx) && (0x09 != cmdidx)) if((0x08 != cmdidx) && (0x09 != cmdidx))
return; return;
@ -2577,19 +2658,19 @@ void ShxyProtocolDataProcess( int commid)
aipnt = pPortParam->SameTypeDevIdx; aipnt = pPortParam->SameTypeDevIdx;
} }
#endif #endif
for(i = 0, j=7; (i<datanum) && (j<6+serialport->m_au8RecvBuf[1]); i++, j+=5 ) for(i = 0, j=7; (i<datanum) && (j<6+curserial->m_au8RecvBuf[1]); i++, j+=5 )
{ {
if(0x08 == cmdidx) if(0x08 == cmdidx)
fvalue = (serialport->m_au8RecvBuf[j+1]<<24)+(serialport->m_au8RecvBuf[j+2]<<16) fvalue = (curserial->m_au8RecvBuf[j+1]<<24)+(curserial->m_au8RecvBuf[j+2]<<16)
+(serialport->m_au8RecvBuf[j+3]<<8)+serialport->m_au8RecvBuf[j+4]; +(curserial->m_au8RecvBuf[j+3]<<8)+curserial->m_au8RecvBuf[j+4];
else else
{ {
*(BYTE*)fvalua = serialport->m_au8RecvBuf[j+4]; *(BYTE*)fvalua = curserial->m_au8RecvBuf[j+4];
*((BYTE*)fvalua+1) = serialport->m_au8RecvBuf[j+3]; *((BYTE*)fvalua+1) = curserial->m_au8RecvBuf[j+3];
*((BYTE*)fvalua+2) = serialport->m_au8RecvBuf[j+2]; *((BYTE*)fvalua+2) = curserial->m_au8RecvBuf[j+2];
*((BYTE*)fvalua+3) = serialport->m_au8RecvBuf[j+1]; *((BYTE*)fvalua+3) = curserial->m_au8RecvBuf[j+1];
} }
switch(serialport->m_au8RecvBuf[j]) switch(curserial->m_au8RecvBuf[j])
{ {
case 1: /*温度*/ case 1: /*温度*/
if((fvalue < -40) ||(fvalue > 85)) if((fvalue < -40) ||(fvalue > 85))
@ -2659,7 +2740,7 @@ void ShxyProtocolDataProcess( int commid)
//if(fvalue/1000 > 25) //if(fvalue/1000 > 25)
// fwind -= 1.2; // fwind -= 1.2;
//sprintf(szbuf, "风速:%0.3f ", fwind); //sprintf(szbuf, "风速:%0.3f ", fwind);
sprintf(szbuf, "风速:%0.3f ", fvalue/1000); sprintf(szbuf, "风速:%0.3f ", fvalue);
LOGV("%s", szbuf); LOGV("%s", szbuf);
} }
break; break;
@ -2675,7 +2756,7 @@ void ShxyProtocolDataProcess( int commid)
//g_SelfTest.SensorsFault |= (0x08); //g_SelfTest.SensorsFault |= (0x08);
//if ((gDisSunRain & 0x10) == 0x10) //if ((gDisSunRain & 0x10) == 0x10)
{ {
sprintf(szbuf, "风向:%0.3f ", fvalue/1000); sprintf(szbuf, "风向:%0.3f ", fvalue);
LOGV("%s", szbuf); LOGV("%s", szbuf);
} }
break; break;
@ -2708,7 +2789,7 @@ void ShxyProtocolDataProcess( int commid)
rallypntmsg[aipnt][0].AiState = 1; rallypntmsg[aipnt][0].AiState = 1;
//if ((gDisSunRain & 0x10) == 0x10) //if ((gDisSunRain & 0x10) == 0x10)
{ {
sprintf(szbuf, "地址%d拉力:%0.3fKg ", devparam[commid].devaddr, fvalue/1000.0); sprintf(szbuf, "地址%d拉力:%0.3fKg ", devparam[commid].devaddr, fvalue);
LOGV("%s", szbuf); LOGV("%s", szbuf);
} }
// yizhonghu 20110629 // yizhonghu 20110629
@ -2717,8 +2798,35 @@ void ShxyProtocolDataProcess( int commid)
//} //}
break; break;
case 9: /*倾角传感器X轴倾角*/ case 9: /*倾角传感器X轴倾角*/
if((fvalue < -59) ||(fvalue > 59))
{
frnb = (GeneratingRandomNumber()%101-50)/1000.0;
slantpntmsg[aipnt][0].EuValue *= (1+frnb);
}
else
slantpntmsg[aipnt][0].EuValue = fvalue*slantpntmsg[aipnt][0].AiParam.fFactor\
+slantpntmsg[aipnt][0].AiParam.EuValueDelta;
slantpntmsg[aipnt][0].AiState = 1;
//if ((gDisSunRain & 0x20) == 0x20)
{
sprintf(szbuf, "倾角ID:%d slantangle X=%0.3f ", devparam[commid].devaddr, fvalue);
LOGV("%s", szbuf);
}
break; break;
case 10: /*倾角传感器Y轴倾角*/ case 10: /*倾角传感器Y轴倾角*/
{
sprintf(szbuf, "Y =%0.3f ", fvalue);
LOGV("%s", szbuf);
}
if((fvalue < -59) ||(fvalue > 59))
{
frnb = (GeneratingRandomNumber()%101-50)/1000.0;
slantpntmsg[aipnt][1].EuValue *= (1+frnb);
}
else
slantpntmsg[aipnt][1].EuValue = fvalue*slantpntmsg[aipnt][1].AiParam.fFactor\
+slantpntmsg[aipnt][1].AiParam.EuValueDelta;
slantpntmsg[aipnt][1].AiState = 1;
break; break;
#if 0 #if 0
case 11: /*测温球导线温度*/ case 11: /*测温球导线温度*/

@ -296,7 +296,7 @@ typedef struct
} SRDT_DEF; } SRDT_DEF;
static void PortDataProcess( void ); static void PortDataProcess( void );
static long get_msec(void ); static long get_msec();
int serial_port_comm(); int serial_port_comm();
static int weather_comm(SERIAL_PARAM weatherport); static int weather_comm(SERIAL_PARAM weatherport);
@ -310,6 +310,11 @@ static void setCam3V3Enable(bool enabled);
/* 打开串口电源*/ /* 打开串口电源*/
void Gm_OpenSerialPower(void); void Gm_OpenSerialPower(void);
// 打开传感器电源
void Gm_OpenSensorsPower(int port);
// 关闭传感器电源
void Gm_CloseSensorsPower(int port);
// 打开串口通讯 // 打开串口通讯
void Gm_OpenSerialPort(int devidx); void Gm_OpenSerialPort(int devidx);

@ -91,7 +91,7 @@ static void set_stopbit (struct termios *opt, const char *stopbit)
} }
} }
int set_port_attr (int fd, int baudrate, int databit, const char *stopbit, char parity, int vtime, int vmin ) int set_port_attr (int fd, unsigned int baudrate, int databit, const char *stopbit, char parity, int vtime, int vmin )
{ {
struct termios opt; struct termios opt;
tcgetattr(fd, &opt); tcgetattr(fd, &opt);

@ -14,6 +14,6 @@
#define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, "serial_port_comm", fmt, ##args) #define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, "serial_port_comm", fmt, ##args)
int set_port_attr (int fd, int baudrate, int databit, const char *stopbit, char parity, int vtime, int vmin ); int set_port_attr (int fd, unsigned int baudrate, int databit, const char *stopbit, char parity, int vtime, int vmin );
#endif //SERIAL_COMM_BASE89656_H #endif //SERIAL_COMM_BASE89656_H

@ -23,8 +23,8 @@
SIO_PARAM_SERIAL_DEF serialport[MAX_SERIAL_PORT_NUM]; SIO_PARAM_SERIAL_DEF serialport[MAX_SERIAL_PORT_NUM];
SERIAL_PARAM devparam[MAX_SERIAL_DEV_NUM]; SERIAL_PARAM devparam[MAX_SERIAL_DEV_NUM];
#if 0
float weatherpntmsg[10]; //float weatherpntmsg[10];
static void setInt(int cmd, int value) static void setInt(int cmd, int value)
{ {
@ -35,12 +35,31 @@ static void setInt(int cmd, int value)
// LOGE("set_int fd=%d,cmd=%d,value=%d\r\n",fd, cmd, value); // LOGE("set_int fd=%d,cmd=%d,value=%d\r\n",fd, cmd, value);
if( fd > 0 ) if( fd > 0 )
{ {
int res = ioctl(fd, IOT_PARAM_WRITE, &param); ioctl(fd, IOT_PARAM_WRITE, &param);
// LOGE("set_int22 cmd=%d,value=%d,result=%d\r\n",param.cmd, param.value, param.result); // LOGE("set_int22 cmd=%d,value=%d,result=%d\r\n",param.cmd, param.value, param.result);
close(fd); close(fd);
} }
return; //return;
}
int getInt(int cmd)
{
int fd = open("/dev/mtkgpioctrl", O_RDONLY);
// LOGE("get_int fd=%d,cmd=%d\r\n",fd, cmd);
if( fd > 0 )
{
IOT_PARAM param;
param.cmd = cmd;
ioctl(fd, IOT_PARAM_READ, &param);
#ifdef _DEBUG
ALOGI("getInt cmd=%d,value=%d,result=%d\r\n",param.cmd, param.value, param.result);
#endif
close(fd);
return param.value;
}
return -1;
} }
static void setRS485Enable(bool z) { static void setRS485Enable(bool z) {
setInt(CMD_SET_485_EN_STATE, z ? 1 : 0); setInt(CMD_SET_485_EN_STATE, z ? 1 : 0);
} }
@ -60,6 +79,8 @@ static void setCam3V3Enable(bool enabled)
{ {
setInt(CMD_SET_CAM_3V3_EN_STATE, enabled ? 1 : 0); setInt(CMD_SET_CAM_3V3_EN_STATE, enabled ? 1 : 0);
} }
#if 0
/********************************************************************************* /*********************************************************************************
* * * *
**********************************************************************************/ **********************************************************************************/
@ -510,13 +531,13 @@ AI_DEF rallypntmsg[6][RALLY_DATA_NUM];
AI_DEF slantpntmsg[6][SLANTANGLE_DATA_NUM]; AI_DEF slantpntmsg[6][SLANTANGLE_DATA_NUM];
//extern void * memset(void *m, int c, unsigned int n); //extern void * memset(void *m, int c, unsigned int n);
extern int atoi(const char *s); //extern int atoi(const char *s);
//extern int Gm_GetSamplingTimeSec(void); //extern int Gm_GetSamplingTimeSec(void);
//extern void Delayms(kal_uint32 time); //extern void Delayms(kal_uint32 time);
extern void srand( unsigned int seed ); //extern void srand( unsigned int seed );
extern int rand( void ); //extern int rand( void );
static long get_msec(void ) static long get_msec()
{ {
struct timeval tv; struct timeval tv;
@ -529,40 +550,48 @@ static long get_msec(void )
/* /*
*/ */
void Gm_OpenSerialPower(void) void Gm_OpenSerialPower()
{ {
/*由传送的主站的地方来控制串口电源,这里不实现*/; /*由传送的主站的地方来控制串口电源,这里不实现*/;
} }
// 关闭串口电源 // 关闭串口电源
void Gm_CloseSerialPower(void) void Gm_CloseSerialPower()
{ {
} }
// 关闭传感器电源 // 关闭传感器电源
void Gm_CloseSensorsPower(int port) void Gm_CloseSensorsPower(int port)
{ {
char iIoNo; //char iIoNo;
char szbuf[128]; char szbuf[128];
sprintf(szbuf, "Close Sensors port %d Power!", port); sprintf(szbuf, "Close Sensors port %d Power!", port);
/* 关闭电源*/ /* 关闭电源*/
//switch(port) //switch(port)
/* 根据硬件具体布置最后调整,目前是微拍板子的来控制*/
set12VEnable(false);
setCam3V3Enable(false);
setRS485Enable(false);
} }
// 打开传感器电源 // 打开传感器电源
void Gm_OpenSensorsPower(int port) void Gm_OpenSensorsPower(int port)
{ {
char iIoNo; //char iIoNo;
char szbuf[128]; char szbuf[128];
if(0 == port) if(0 == port)
return; return;
sprintf(szbuf, "Open Sensors port %d Power!", port); sprintf(szbuf, "Open Sensors port %d Power!", port);
/* 打开电源*/
set12VEnable(true);
setCam3V3Enable(true);
setRS485Enable(true);
/* 打开电源*/
//switch(port) //switch(port)
} }
@ -638,7 +667,7 @@ void Gm_OpenSerialPort(int devidx)
} }
// 关闭串口通讯 // 关闭串口通讯
void Gm_CloseSerialPort(void) void Gm_CloseSerialPort()
{ {
int i; int i;
@ -706,7 +735,7 @@ int Gm_SetSerialPortParam(int commid)
return ret; return ret;
} }
void Gm_InitSerialComm_Test(void) void Gm_InitSerialComm_Test()
{ {
int i, j; int i, j;
@ -740,7 +769,8 @@ void Gm_InitSerialComm_Test(void)
devparam[0].parity = 0; devparam[0].parity = 0;
devparam[0].IsNoInsta = 1; devparam[0].IsNoInsta = 1;
//devparam[0].PowerPort = 2; //devparam[0].PowerPort = 2;
devparam[0].devaddr = 4; //devparam[0].devaddr = 4;
devparam[0].devaddr = 2;
devparam[1].ProtocolIdx = WEATHER_PROTOCOL; devparam[1].ProtocolIdx = WEATHER_PROTOCOL;
devparam[1].baudrate = B9600; devparam[1].baudrate = B9600;
@ -750,17 +780,20 @@ void Gm_InitSerialComm_Test(void)
devparam[1].parity = 0; devparam[1].parity = 0;
devparam[1].IsNoInsta = 1; devparam[1].IsNoInsta = 1;
//devparam[1].PowerPort = 14; //devparam[1].PowerPort = 14;
devparam[1].devaddr = 1; //devparam[1].devaddr = 1;
#if 0 devparam[1].devaddr = 13;
devparam[2].ProtocolIdx = SLANT_PROTOCOL;
devparam[2].baudrate = 1200; devparam[2].ProtocolIdx = RALLY_PROTOCOL;
devparam[2].baudrate = B9600;
devparam[2].databit = 8; devparam[2].databit = 8;
devparam[2].stopbit = 1; memset(devparam[2].stopbit, 0, sizeof(devparam[2].stopbit));
sprintf(devparam[2].stopbit, "1");
devparam[2].parity = 0; devparam[2].parity = 0;
devparam[2].IsNoInsta = 0; devparam[2].IsNoInsta = 1;
//devparam[2].PowerPort = 3; //devparam[2].PowerPort = 3;
devparam[2].devaddr = 2; //devparam[2].devaddr = 13;
devparam[2].devaddr = 13;
#if 0
devparam[3].ProtocolIdx = PELCO_P_PROTOCOL; devparam[3].ProtocolIdx = PELCO_P_PROTOCOL;
devparam[3].baudrate = 9600; devparam[3].baudrate = 9600;
devparam[3].databit = 8; devparam[3].databit = 8;
@ -852,16 +885,18 @@ void Gm_InitSerialComm_Test(void)
devparam[12].IsNoInsta = 1; devparam[12].IsNoInsta = 1;
//devparam[12].PowerPort = 8; //devparam[12].PowerPort = 8;
devparam[12].devaddr = 5; devparam[12].devaddr = 5;
#endif
devparam[13].ProtocolIdx = SLANT_PROTOCOL; devparam[13].ProtocolIdx = SLANT_PROTOCOL;
devparam[13].baudrate = 1200; devparam[13].baudrate = B9600;
devparam[13].databit = 8; devparam[13].databit = 8;
devparam[13].stopbit = 1; memset(devparam[13].stopbit, 0, sizeof(devparam[13].stopbit));
sprintf(devparam[13].stopbit, "1");
devparam[13].parity = 0; devparam[13].parity = 0;
//devparam[13].PowerPort = 4; //devparam[13].PowerPort = 4;
devparam[13].IsNoInsta = 1; devparam[13].IsNoInsta = 1;
devparam[13].devaddr = 2; devparam[13].devaddr = 2;
#if 0
devparam[14].ProtocolIdx = SLANT_PROTOCOL; devparam[14].ProtocolIdx = SLANT_PROTOCOL;
devparam[14].baudrate = 1200; devparam[14].baudrate = 1200;
devparam[14].databit = 8; devparam[14].databit = 8;
@ -935,7 +970,7 @@ void Gm_InitSerialComm_Test(void)
} }
// 初始化所有串口及所接传感器的配置 // 初始化所有串口及所接传感器的配置
void Gm_InitSerialComm(void) void Gm_InitSerialComm()
{ {
int i; int i;
char szbuf[128]; char szbuf[128];
@ -1003,7 +1038,6 @@ void Gm_InitSerialComm(void)
else else
sprintf(szbuf, "已启用!"); sprintf(szbuf, "已启用!");
LOGI("%s", szbuf); LOGI("%s", szbuf);
} }
#endif #endif
#if 0 #if 0
@ -1041,7 +1075,7 @@ void Gm_InitSerialComm(void)
} }
// 通过传感器名称来确定使用的串口号 // 通过传感器名称来确定使用的串口号
void FindDevUseSerialCommNo(void) void FindDevUseSerialCommNo()
{ {
int i; int i;
@ -1068,7 +1102,7 @@ void FindDevUseSerialCommNo(void)
} }
} }
void GM_StartSerialComm(void) void GM_StartSerialComm()
{ {
int i, j; int i, j;
char szbuf[64]; char szbuf[64];
@ -1128,10 +1162,37 @@ void GM_StartSerialComm(void)
srdt.ms_dev[i].IsNeedSerial = 0; srdt.ms_dev[i].IsNeedSerial = 0;
continue; continue;
} }
// 测试查询传感器电源状态
#if 0
LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE));
LOGE("3.3V state= %d", getInt(CMD_SET_CAM_3V3_EN_STATE));
LOGE("485 state=%d", getInt(CMD_SET_485_EN_STATE));
set12VEnable(true);
setCam3V3Enable(true);
setRS485Enable(true);
sleep(1);
LOGV("12V state=%d", getInt(CMD_SET_12V_EN_STATE));
LOGV("3.3V state= %d", getInt(CMD_SET_CAM_3V3_EN_STATE));
LOGV("485 state=%d", getInt(CMD_SET_485_EN_STATE));
set12VEnable(false);
setCam3V3Enable(false);
setRS485Enable(false);
sleep(1);
LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE));
LOGE("3.3V state= %d", getInt(CMD_SET_CAM_3V3_EN_STATE));
LOGE("485 state=%d", getInt(CMD_SET_485_EN_STATE));
#endif
// 打开传感器电源 // 打开传感器电源
// 打开对应的485电源 // 打开对应的485电源
// 打开串口通讯 // 打开串口通讯
Gm_OpenSerialPort(i); if(1 == srdt.ms_dev[i].IsNeedSerial)
{
Gm_OpenSensorsPower(i);
Gm_OpenSerialPort(i);
}
//LOGV("12V state=%d", getInt(CMD_SET_12V_EN_STATE));
} }
LOGI("启动数据采样!"); LOGI("启动数据采样!");
@ -1139,11 +1200,12 @@ void GM_StartSerialComm(void)
polltime = get_msec(); polltime = get_msec();
for(;;) for(;;)
{ {
usleep(TIMER_CNT*100); usleep(10);
//LOGW("polltime=%ldms", get_msec()-polltime); LOGW("polltime=%ldms", get_msec()-polltime);
polltime = get_msec(); polltime = get_msec();
if(GM_SerialTimer() < 0) if(GM_SerialTimer() < 0)
{ {
//LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE));
LOGV("退出采样流程!"); LOGV("退出采样流程!");
break; break;
} }
@ -1165,7 +1227,8 @@ void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx)
//DebugStringPrintf(szbuf, strlen(szbuf), 1); //DebugStringPrintf(szbuf, strlen(szbuf), 1);
if(0 == srdt.selfflag) if(0 == srdt.selfflag)
srdt.selfflag = 1; srdt.selfflag = 1;
Gm_OpenSerialPower(); //Gm_OpenSerialPower();
//Gm_OpenSensorsPower();
//if(0x00 == srdt.sampling) //if(0x00 == srdt.sampling)
//{ //{
// Gm_OpenSerialPort(); // Gm_OpenSerialPort();
@ -1242,10 +1305,12 @@ int GM_SerialTimer(void)
{ {
int flag = -1; int flag = -1;
Gm_FindAllSensorsCommand(); GM_AllSerialComRecv();
GM_IsCloseSensors(); GM_IsCloseSensors();
Gm_FindAllSensorsCommand();
GM_AllSerialComRecv(); GM_AllSerialComRecv();
flag = GM_CloseTimer(); flag = GM_CloseTimer();
//LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE));
return flag; return flag;
} }
@ -1263,7 +1328,7 @@ void Gm_FindAllSensorsCommand(void)
//Gm_CheckSensorsPower(); /* 暂时不考虑电源控制*/ //Gm_CheckSensorsPower(); /* 暂时不考虑电源控制*/
for(j=0; j<MAX_SERIAL_PORT_NUM; j++) for(j=0; j<MAX_SERIAL_PORT_NUM; j++)
{ {
// 发送缓冲区中命令 // 发送缓冲区中命令 接收到了应答报文,紧接着进行缓冲区清理
SendCmdFormPollCmdBuf(j); SendCmdFormPollCmdBuf(j);
// 串口已经被占用则直接跳过 // 串口已经被占用则直接跳过
curidx = srdt.curdevidx[j]; curidx = srdt.curdevidx[j];
@ -1278,6 +1343,10 @@ void Gm_FindAllSensorsCommand(void)
Gm_OpenSerialPort(curidx); Gm_OpenSerialPort(curidx);
if(serialport[devparam[curidx].commid].cmdlen > 0) if(serialport[devparam[curidx].commid].cmdlen > 0)
break; break;
//LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE));
//LOGE("3.3V state= %d", getInt(CMD_SET_CAM_3V3_EN_STATE));
//LOGE("485 state=%d", getInt(CMD_SET_485_EN_STATE));
flag = -1; flag = -1;
switch(devparam[curidx].ProtocolIdx) switch(devparam[curidx].ProtocolIdx)
@ -1304,6 +1373,8 @@ void Gm_FindAllSensorsCommand(void)
srdt.curdevidx[j] = curidx; srdt.curdevidx[j] = curidx;
break; break;
} }
// 发送缓冲区中命令 生成了命令之后紧接着进行命令发送
SendCmdFormPollCmdBuf(j);
} }
} }
@ -1382,13 +1453,17 @@ void GM_AllSerialComRecv(void)
memset(recvbuf, 0, sizeof(recvbuf)); memset(recvbuf, 0, sizeof(recvbuf));
if(serialport[j].fd < 0) if(serialport[j].fd < 0)
continue; continue;
recvlen = read(serialport[j].fd, recvbuf, sizeof(recvbuf));/* 在串口读取字符串 */ for(;;)
{
recvlen = read(serialport[j].fd, recvbuf, sizeof(recvbuf));/* 在串口读取字符串 */
if(recvlen < 1) if(recvlen < 1)
continue; break;
sprintf(buf, "收到串口%d, %d字节数据:", j+1, recvlen); sprintf(buf, "收到串口%d, %d字节数据:", j+1, recvlen);
BytestreamLOG(buf, recvbuf, recvlen, 'I'); BytestreamLOG(buf, recvbuf, recvlen, 'I');
SerialDataProcess(srdt.curdevidx[j], recvbuf, recvlen); SerialDataProcess(srdt.curdevidx[j], recvbuf, recvlen);
}
} }
} }
@ -1484,6 +1559,8 @@ int GM_CloseTimer(void)
{ {
#endif #endif
Gm_CloseSerialPort(); Gm_CloseSerialPort();
for(j=0; j< MAX_SERIAL_DEV_NUM; j++)
Gm_CloseSensorsPower(j);
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, "关闭串口定时器!");
@ -1531,11 +1608,10 @@ void SerialDataProcess(int devidx, u_char *buf, int len)
{ {
switch(devparam[devidx].ProtocolIdx) switch(devparam[devidx].ProtocolIdx)
{ {
#if 1
case WEATHER_PROTOCOL: /* 气象*/ case WEATHER_PROTOCOL: /* 气象*/
case RALLY_PROTOCOL: /* 拉力*/ case RALLY_PROTOCOL: /* 拉力*/
case WIND_PROTOCOL: /* 风速风向*/ case WIND_PROTOCOL: /* 风速风向*/
#endif
case SLANT_PROTOCOL: /* 倾角*/ case SLANT_PROTOCOL: /* 倾角*/
ShxyProtocolRecvData(devidx, buf, len); ShxyProtocolRecvData(devidx, buf, len);
break; break;
@ -1746,7 +1822,7 @@ long lsendtime=0;
void SendCmdFormPollCmdBuf( int port ) void SendCmdFormPollCmdBuf( int port )
{ {
char buf[64]; char buf[64];
int len, idelay=0, i, ret; int len, idelay=0, ret;
SIO_PARAM_SERIAL_DEF *pPortParam; SIO_PARAM_SERIAL_DEF *pPortParam;
//int recvlen; //int recvlen;
//u_char recvbuf[300]; //u_char recvbuf[300];
@ -1822,7 +1898,7 @@ 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[2], len, 'D');
LOGW("sendtimeconst= %ld", get_msec()-lsendtime); LOGW("sendtimeconst= %ld", get_msec()-lsendtime);
lsendtime = get_msec(); lsendtime = get_msec();
} }
@ -2303,12 +2379,18 @@ int FindNextShxyProtocolCommand( int devidx )
//srdt.ms_dev[devidx].FirstCmdTimeCnt++; //srdt.ms_dev[devidx].FirstCmdTimeCnt++;
return -1; return -1;
} }
//if(SLANT_PROTOCOL == devparam[devidx].ProtocolIdx) #if 0
// MakeShxyProtocolPollCommand(devidx, 0x06); if(SLANT_PROTOCOL == devparam[devidx].ProtocolIdx)
{
devparam[devidx].devaddr = 0xFF;
MakeShxyProtocolPollCommand(devidx, 0x02);
}
//else if(WEATHER_PROTOCOL== devparam[devidx].ProtocolIdx) //else if(WEATHER_PROTOCOL== devparam[devidx].ProtocolIdx)
// MakeShxyProtocolPollCommand(devidx, 0x09);
else
#endif
MakeShxyProtocolPollCommand(devidx, 0x09); MakeShxyProtocolPollCommand(devidx, 0x09);
//else
//MakeShxyProtocolPollCommand(devidx, 0x08);
srdt.curdevidx[srdt.ms_dev[devidx].UseSerialidx] = devidx; srdt.curdevidx[srdt.ms_dev[devidx].UseSerialidx] = devidx;
return 1; return 1;
} }
@ -2488,28 +2570,27 @@ void ShxyProtocolDataProcess( int commid)
BYTE cmdidx; BYTE cmdidx;
int i, j, aipnt, datanum; int i, j, aipnt, datanum;
SERIAL_DEV_DEF *pPortParam; SERIAL_DEV_DEF *pPortParam;
SIO_PARAM_SERIAL_DEF *serialport; SIO_PARAM_SERIAL_DEF *curserial;
char szbuf[64]; char szbuf[64];
pPortParam = &srdt.ms_dev[commid]; pPortParam = &srdt.ms_dev[commid];
serialport = &serialport[pPortParam->UseSerialidx]; curserial = &serialport[devparam[commid].commid];
//取出装置地址,开始处理地址+++ //取出装置地址,开始处理地址+++
if(0x02 == serialport->m_au8RecvBuf[5]) if(0x02 == curserial->m_au8RecvBuf[5])
{ {
devparam[commid].devaddr = serialport->m_au8RecvBuf[4]; devparam[commid].devaddr = curserial->m_au8RecvBuf[4];
//pPortParam->LinkOk = TRUE;
return; return;
} }
cmdidx = serialport->m_au8RecvBuf[5]; cmdidx = curserial->m_au8RecvBuf[5];
aipnt = pPortParam->SameTypeDevIdx; aipnt = pPortParam->SameTypeDevIdx;
uDevAddr = serialport->m_au8RecvBuf[4]; uDevAddr = curserial->m_au8RecvBuf[4];
fvalua = &fvalue; fvalua = &fvalue;
if(0x06 == cmdidx) if(0x06 == cmdidx)
{ {
if(0x08 !=serialport->m_au8RecvBuf[1]) if(0x08 !=curserial->m_au8RecvBuf[1])
return; return;
pPortParam->recvdatacnt++; pPortParam->recvdatacnt++;
if(pPortParam->recvdatacnt < 2) if(pPortParam->recvdatacnt < 2)
@ -2517,10 +2598,10 @@ void ShxyProtocolDataProcess( int commid)
// ++++++++++++++++++++++++++++ // ++++++++++++++++++++++++++++
//g_SelfTest.SensorsFault |= (0x800<<aipnt); //g_SelfTest.SensorsFault |= (0x800<<aipnt);
*(BYTE*)fvalua = serialport->m_au8RecvBuf[9]; *(BYTE*)fvalua = curserial->m_au8RecvBuf[9];
*((BYTE*)fvalua+1) = serialport->m_au8RecvBuf[8]; *((BYTE*)fvalua+1) = curserial->m_au8RecvBuf[8];
*((BYTE*)fvalua+2) = serialport->m_au8RecvBuf[7]; *((BYTE*)fvalua+2) = curserial->m_au8RecvBuf[7];
*((BYTE*)fvalua+3) = serialport->m_au8RecvBuf[6]; *((BYTE*)fvalua+3) = curserial->m_au8RecvBuf[6];
if((fvalue < -59) ||(fvalue > 59)) if((fvalue < -59) ||(fvalue > 59))
{ {
frnb = (GeneratingRandomNumber()%101-50)/1000.0; frnb = (GeneratingRandomNumber()%101-50)/1000.0;
@ -2538,10 +2619,10 @@ void ShxyProtocolDataProcess( int commid)
//XslantSec[aipnt][srdt.SectimesamplingCnt[0]] = (short)slantpntmsg[aipnt][0].EuValue; //XslantSec[aipnt][srdt.SectimesamplingCnt[0]] = (short)slantpntmsg[aipnt][0].EuValue;
//srdt.SectimesamplingCnt[0] += 1; //srdt.SectimesamplingCnt[0] += 1;
*(BYTE*)fvalua = serialport->m_au8RecvBuf[13]; *(BYTE*)fvalua = curserial->m_au8RecvBuf[13];
*((BYTE*)fvalua+1) = serialport->m_au8RecvBuf[12]; *((BYTE*)fvalua+1) = curserial->m_au8RecvBuf[12];
*((BYTE*)fvalua+2) = serialport->m_au8RecvBuf[11]; *((BYTE*)fvalua+2) = curserial->m_au8RecvBuf[11];
*((BYTE*)fvalua+3) = serialport->m_au8RecvBuf[10]; *((BYTE*)fvalua+3) = curserial->m_au8RecvBuf[10];
//if ((gDisSunRain & 0x20) == 0x20) //if ((gDisSunRain & 0x20) == 0x20)
{ {
sprintf(szbuf, "Y =%0.3f ", fvalue); sprintf(szbuf, "Y =%0.3f ", fvalue);
@ -2559,7 +2640,7 @@ void ShxyProtocolDataProcess( int commid)
//YslantSec[aipnt][srdt.SectimesamplingCnt[1]] = (short)slantpntmsg[aipnt][1].EuValue; //YslantSec[aipnt][srdt.SectimesamplingCnt[1]] = (short)slantpntmsg[aipnt][1].EuValue;
srdt.SectimesamplingCnt[1] += 1; srdt.SectimesamplingCnt[1] += 1;
} }
datanum = serialport->m_au8RecvBuf[6]; datanum = curserial->m_au8RecvBuf[6];
if((0x08 != cmdidx) && (0x09 != cmdidx)) if((0x08 != cmdidx) && (0x09 != cmdidx))
return; return;
@ -2577,19 +2658,19 @@ void ShxyProtocolDataProcess( int commid)
aipnt = pPortParam->SameTypeDevIdx; aipnt = pPortParam->SameTypeDevIdx;
} }
#endif #endif
for(i = 0, j=7; (i<datanum) && (j<6+serialport->m_au8RecvBuf[1]); i++, j+=5 ) for(i = 0, j=7; (i<datanum) && (j<6+curserial->m_au8RecvBuf[1]); i++, j+=5 )
{ {
if(0x08 == cmdidx) if(0x08 == cmdidx)
fvalue = (serialport->m_au8RecvBuf[j+1]<<24)+(serialport->m_au8RecvBuf[j+2]<<16) fvalue = (curserial->m_au8RecvBuf[j+1]<<24)+(curserial->m_au8RecvBuf[j+2]<<16)
+(serialport->m_au8RecvBuf[j+3]<<8)+serialport->m_au8RecvBuf[j+4]; +(curserial->m_au8RecvBuf[j+3]<<8)+curserial->m_au8RecvBuf[j+4];
else else
{ {
*(BYTE*)fvalua = serialport->m_au8RecvBuf[j+4]; *(BYTE*)fvalua = curserial->m_au8RecvBuf[j+4];
*((BYTE*)fvalua+1) = serialport->m_au8RecvBuf[j+3]; *((BYTE*)fvalua+1) = curserial->m_au8RecvBuf[j+3];
*((BYTE*)fvalua+2) = serialport->m_au8RecvBuf[j+2]; *((BYTE*)fvalua+2) = curserial->m_au8RecvBuf[j+2];
*((BYTE*)fvalua+3) = serialport->m_au8RecvBuf[j+1]; *((BYTE*)fvalua+3) = curserial->m_au8RecvBuf[j+1];
} }
switch(serialport->m_au8RecvBuf[j]) switch(curserial->m_au8RecvBuf[j])
{ {
case 1: /*温度*/ case 1: /*温度*/
if((fvalue < -40) ||(fvalue > 85)) if((fvalue < -40) ||(fvalue > 85))
@ -2659,7 +2740,7 @@ void ShxyProtocolDataProcess( int commid)
//if(fvalue/1000 > 25) //if(fvalue/1000 > 25)
// fwind -= 1.2; // fwind -= 1.2;
//sprintf(szbuf, "风速:%0.3f ", fwind); //sprintf(szbuf, "风速:%0.3f ", fwind);
sprintf(szbuf, "风速:%0.3f ", fvalue/1000); sprintf(szbuf, "风速:%0.3f ", fvalue);
LOGV("%s", szbuf); LOGV("%s", szbuf);
} }
break; break;
@ -2675,7 +2756,7 @@ void ShxyProtocolDataProcess( int commid)
//g_SelfTest.SensorsFault |= (0x08); //g_SelfTest.SensorsFault |= (0x08);
//if ((gDisSunRain & 0x10) == 0x10) //if ((gDisSunRain & 0x10) == 0x10)
{ {
sprintf(szbuf, "风向:%0.3f ", fvalue/1000); sprintf(szbuf, "风向:%0.3f ", fvalue);
LOGV("%s", szbuf); LOGV("%s", szbuf);
} }
break; break;
@ -2708,7 +2789,7 @@ void ShxyProtocolDataProcess( int commid)
rallypntmsg[aipnt][0].AiState = 1; rallypntmsg[aipnt][0].AiState = 1;
//if ((gDisSunRain & 0x10) == 0x10) //if ((gDisSunRain & 0x10) == 0x10)
{ {
sprintf(szbuf, "地址%d拉力:%0.3fKg ", devparam[commid].devaddr, fvalue/1000.0); sprintf(szbuf, "地址%d拉力:%0.3fKg ", devparam[commid].devaddr, fvalue);
LOGV("%s", szbuf); LOGV("%s", szbuf);
} }
// yizhonghu 20110629 // yizhonghu 20110629
@ -2717,8 +2798,35 @@ void ShxyProtocolDataProcess( int commid)
//} //}
break; break;
case 9: /*倾角传感器X轴倾角*/ case 9: /*倾角传感器X轴倾角*/
if((fvalue < -59) ||(fvalue > 59))
{
frnb = (GeneratingRandomNumber()%101-50)/1000.0;
slantpntmsg[aipnt][0].EuValue *= (1+frnb);
}
else
slantpntmsg[aipnt][0].EuValue = fvalue*slantpntmsg[aipnt][0].AiParam.fFactor\
+slantpntmsg[aipnt][0].AiParam.EuValueDelta;
slantpntmsg[aipnt][0].AiState = 1;
//if ((gDisSunRain & 0x20) == 0x20)
{
sprintf(szbuf, "倾角ID:%d slantangle X=%0.3f ", devparam[commid].devaddr, fvalue);
LOGV("%s", szbuf);
}
break; break;
case 10: /*倾角传感器Y轴倾角*/ case 10: /*倾角传感器Y轴倾角*/
{
sprintf(szbuf, "Y =%0.3f ", fvalue);
LOGV("%s", szbuf);
}
if((fvalue < -59) ||(fvalue > 59))
{
frnb = (GeneratingRandomNumber()%101-50)/1000.0;
slantpntmsg[aipnt][1].EuValue *= (1+frnb);
}
else
slantpntmsg[aipnt][1].EuValue = fvalue*slantpntmsg[aipnt][1].AiParam.fFactor\
+slantpntmsg[aipnt][1].AiParam.EuValueDelta;
slantpntmsg[aipnt][1].AiState = 1;
break; break;
#if 0 #if 0
case 11: /*测温球导线温度*/ case 11: /*测温球导线温度*/

@ -296,7 +296,7 @@ typedef struct
} SRDT_DEF; } SRDT_DEF;
static void PortDataProcess( void ); static void PortDataProcess( void );
static long get_msec(void ); static long get_msec();
int serial_port_comm(); int serial_port_comm();
static int weather_comm(SERIAL_PARAM weatherport); static int weather_comm(SERIAL_PARAM weatherport);
@ -310,6 +310,11 @@ static void setCam3V3Enable(bool enabled);
/* 打开串口电源*/ /* 打开串口电源*/
void Gm_OpenSerialPower(void); void Gm_OpenSerialPower(void);
// 打开传感器电源
void Gm_OpenSensorsPower(int port);
// 关闭传感器电源
void Gm_CloseSensorsPower(int port);
// 打开串口通讯 // 打开串口通讯
void Gm_OpenSerialPort(int devidx); void Gm_OpenSerialPort(int devidx);

@ -91,7 +91,7 @@ static void set_stopbit (struct termios *opt, const char *stopbit)
} }
} }
int set_port_attr (int fd, int baudrate, int databit, const char *stopbit, char parity, int vtime, int vmin ) int set_port_attr (int fd, unsigned int baudrate, int databit, const char *stopbit, char parity, int vtime, int vmin )
{ {
struct termios opt; struct termios opt;
tcgetattr(fd, &opt); tcgetattr(fd, &opt);

@ -14,6 +14,6 @@
#define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, "serial_port_comm", fmt, ##args) #define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, "serial_port_comm", fmt, ##args)
int set_port_attr (int fd, int baudrate, int databit, const char *stopbit, char parity, int vtime, int vmin ); int set_port_attr (int fd, unsigned int baudrate, int databit, const char *stopbit, char parity, int vtime, int vmin );
#endif //SERIAL_COMM_BASE89656_H #endif //SERIAL_COMM_BASE89656_H

Loading…
Cancel
Save