修改串口数据接收逻辑

main
jxjajs 6 months ago
parent d5a95ba5cb
commit 82bea27b3e

@ -14,7 +14,7 @@
int SerialOpen(const char *dev_name,int baud,int databit,int stopbit,int chk_mode); int SerialOpen(const char *dev_name,int baud,int databit,int stopbit,int chk_mode);
int SerialRead(int m_comFd,unsigned char *buf,int sz,int timeout); int SerialRead(int m_comFd,unsigned char *buf,int sz,int timeout);
int SerialWrite(int m_comFd,const unsigned char *buf,int sz); int SerialWrite(int m_comFd,const unsigned char *buf,int sz);
int SerialReadEx(int m_comFd,unsigned char *buf,int sz,int timeout); int SerialReadEx(int m_comFd,unsigned char *buf,int sz);
long long get_msec(void); long long get_msec(void);

@ -5,7 +5,7 @@
#include "common.h" #include "common.h"
#include <stdlib.h> #include <stdlib.h>
#define MODBUS_TIMEOUT 10 #define MODBUS_TIMEOUT 1000
typedef struct typedef struct
{ {

@ -6,7 +6,7 @@
#include <time.h> #include <time.h>
#include "iec61850_process.h" #include "iec61850_process.h"
#define APP_VERSION "SV01.002" #define APP_VERSION "SV01.003"
#define DEVICE_NUM 3 #define DEVICE_NUM 3
@ -54,7 +54,7 @@ int log_init(void)
char *make_file_name(uint32_t sn,uint8_t addr) char *make_file_name(uint32_t sn,uint8_t addr)
{ {
static char data_file_name[64]; static char data_file_name[128];
struct tm *p; struct tm *p;
memset(data_file_name,0,sizeof(data_file_name)); memset(data_file_name,0,sizeof(data_file_name));
p=localtime((time_t *)&sn); p=localtime((time_t *)&sn);
@ -113,6 +113,7 @@ int main(int argc,char **args)
log_init(); log_init();
elog_raw("Application Version:%s\r\n",APP_VERSION); elog_raw("Application Version:%s\r\n",APP_VERSION);
log_e("Application restart!");
//if(read_dev_cfg(&dev_cfg)!=0) //if(read_dev_cfg(&dev_cfg)!=0)
//{ //{
@ -211,7 +212,7 @@ int main(int argc,char **args)
/* code */ /* code */
} }
SMP_INV = 15; //SMP_INV = 15; // 测试使用
//发送心跳包检测通讯是否正常 //发送心跳包检测通讯是否正常
heartbeat(DEVICE_NUM); heartbeat(DEVICE_NUM);

@ -185,7 +185,7 @@ long long get_msec(void)
#if 0 #if 0
//timeout is in 100ms //timeout is in 100ms
int SerialReadEx(int m_comFd,unsigned char *buf,int sz,int timeout) //int SerialReadEx(int m_comFd,unsigned char *buf,int sz,int timeout)
{ {
int curr_length=0,last_length=0,rx_length=0; int curr_length=0,last_length=0,rx_length=0;
//int rx_tick=0; //int rx_tick=0;
@ -217,25 +217,26 @@ int SerialReadEx(int m_comFd,unsigned char *buf,int sz,int timeout)
} }
#endif #endif
int SerialReadEx(int m_comFd,unsigned char *buf,int sz,int timeout) int SerialReadEx(int m_comFd,unsigned char *buf,int sz)
{ {
int curr_length=0/*,last_length=0*/,rx_length=0; int /*curr_length=0,last_length=0,*/rx_length=0;
long long t0, t1; //long long t0, t1;
t0 = get_msec(); //t0 = get_msec();
for(;;) //for(;;)
{ {
rx_length += curr_length; //rx_length += curr_length;
usleep(5000); //if()
curr_length = read(m_comFd,buf+rx_length, 1040-rx_length);/* 在串口读取字符串 */ usleep(50000);
t1 = get_msec(); rx_length = read(m_comFd,buf, sz);/* 在串口读取字符串 */
if(t1-t0 >= 350) //t1 = get_msec();
break; //if(t1-t0 >= 350)
// break;
} }
if (rx_length < 1) //if (rx_length < 1)
return rx_length; // return rx_length;
return rx_length; return rx_length;
} }

@ -541,7 +541,7 @@ void SJZD_file_analysis(uint8_t slave_addr,char *curr_file,float sensor_range)
memset(&tmp3, 0x00, sizeof(USR_MV)); memset(&tmp3, 0x00, sizeof(USR_MV));
memset(fft_value, 0x00, 19*sizeof(USR_MV)); memset(fft_value, 0x00, 19*sizeof(USR_MV));
double pri_max[]={196000,196000,196000,196000,196000,196000,196000,196000,196000,196000,196000,196000,196000,196000,196000,196000,96000,196000,196000}; double pri_max[]={196000,196000,196000,196000,196000,196000,196000,196000,196000,196000,196000,196000,196000,196000,196000,196000,96000,196000,196000};
double sec_max[]={196000,196000,196000,196000,196000,196000,196000}; double sec_max[19]={196000,196000,196000,196000,196000,196000,196000};
double offset[]={1.2626,0.3597,0,0,0,0,0,0,0,0,0,0}; double offset[]={1.2626,0.3597,0,0,0,0,0,0,0,0,0,0};
int channel_num=0; int channel_num=0;
double noise_max=150; double noise_max=150;
@ -738,7 +738,8 @@ void SJZD_file_analysis(uint8_t slave_addr,char *curr_file,float sensor_range)
fft_value[n].q=1; fft_value[n].q=1;
fft_value[n].t.secs=time(NULL); fft_value[n].t.secs=time(NULL);
fft_value[n].t.ms = fft_value[n].t.secs*1000; fft_value[n].t.ms = fft_value[n].t.secs*1000;
if(amp_temp[n]>=sec_max[n]) //if(amp_temp[n]>=sec_max[n])
if(amp_temp[n]>=pri_max[n])
{ {
amp_warning[n]=1;//modbus 每个分量报警 amp_warning[n]=1;//modbus 每个分量报警
tmp3.v.stVal=1; tmp3.v.stVal=1;

@ -113,7 +113,7 @@ int sjzd_recv_data(SJZD_SERIAL_DEF *pPortParam, u_char *buf, int len, uint16_t u
case 4: // cmd case 4: // cmd
pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i]; pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i];
pPortParam->m_iNeedRevLength--; pPortParam->m_iNeedRevLength--;
if(4 == buf[i]) /*if(4 == buf[i]) // 测试使用
{ {
if(fault == 5) if(fault == 5)
{ {
@ -123,7 +123,7 @@ int sjzd_recv_data(SJZD_SERIAL_DEF *pPortParam, u_char *buf, int len, uint16_t u
} }
else else
fault++; fault++;
} }*/
if ((0 < buf[i]) && (6 > buf[i])) if ((0 < buf[i]) && (6 > buf[i]))
pPortParam->m_iRevStatus++; pPortParam->m_iRevStatus++;
else else
@ -152,8 +152,8 @@ int sjzd_recv_data(SJZD_SERIAL_DEF *pPortParam, u_char *buf, int len, uint16_t u
flag = 1; flag = 1;
if (1 == flag) if (1 == flag)
{ {
memmove(buf, pPortParam->m_au8RecvBuf, pPortParam->m_iRecvLen); //memmove(buf, pPortParam->m_au8RecvBuf, pPortParam->m_iRecvLen);
return pPortParam->m_iRecvLen; return 0;
} }
else else
{ {
@ -182,15 +182,17 @@ int sjzd_recv_data(SJZD_SERIAL_DEF *pPortParam, u_char *buf, int len, uint16_t u
break; break;
} }
} }
return 0; return -1;
} }
int32_t sjzd_serial_read(uint8_t *pucBuffer,uint16_t usNBytes,uint16_t *usNBytesRead) int32_t sjzd_serial_read(uint8_t *pucBuffer,uint16_t usNBytes,uint16_t *usNBytesRead)
{ {
int rx_len; int rx_len=0, recvlen;
uint8_t recvbuf[RECVDATA_MAXLENTH];
SJZD_SERIAL_DEF *sjzdport; SJZD_SERIAL_DEF *sjzdport;
long long t0, t1;
rx_len=SerialReadEx(sjzd_serial_fd,pucBuffer,usNBytes,MODBUS_TIMEOUT); t0 = get_msec();
sjzdport=(SJZD_SERIAL_DEF *)malloc(sizeof(SJZD_SERIAL_DEF)); sjzdport=(SJZD_SERIAL_DEF *)malloc(sizeof(SJZD_SERIAL_DEF));
if(sjzdport==NULL) if(sjzdport==NULL)
{ {
@ -198,8 +200,29 @@ int32_t sjzd_serial_read(uint8_t *pucBuffer,uint16_t usNBytes,uint16_t *usNBytes
return 0; return 0;
} }
memset(sjzdport, 0, sizeof(SJZD_SERIAL_DEF)); memset(sjzdport, 0, sizeof(SJZD_SERIAL_DEF));
log_e("rx_len=%d", rx_len);
rx_len = sjzd_recv_data(sjzdport, pucBuffer, rx_len, usNBytes); for(; ; )
{
recvlen=SerialReadEx(sjzd_serial_fd,recvbuf,RECVDATA_MAXLENTH);
//log_e("rx_len=%d", rx_len);
if(recvlen > 0)
{
sjzd_recv_data(sjzdport, recvbuf, recvlen, usNBytes);
if(sjzdport->m_iRecvLen >= usNBytes)
{
rx_len = sjzdport->m_iRecvLen;
memmove(pucBuffer, sjzdport->m_au8RecvBuf, rx_len);
break;
}
}
else
{
t1 = get_msec();
if(t1-t0 >= MODBUS_TIMEOUT) // 超过1秒一直没有收到数据判断超时
break;
}
}
if(usNBytesRead!=NULL) if(usNBytesRead!=NULL)
{ {
if(rx_len>0) if(rx_len>0)

Loading…
Cancel
Save