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

serial
huyizhong 1 year ago
parent 5c0e8b3abf
commit 61999c7836

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

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

@ -14,6 +14,6 @@
#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

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

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

@ -14,6 +14,6 @@
#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

Loading…
Cancel
Save