修改串口数据接收逻辑

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 SerialRead(int m_comFd,unsigned char *buf,int sz,int timeout);
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);

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

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

@ -185,7 +185,7 @@ long long get_msec(void)
#if 0
//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 rx_tick=0;
@ -217,25 +217,26 @@ int SerialReadEx(int m_comFd,unsigned char *buf,int sz,int timeout)
}
#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;
usleep(5000);
curr_length = read(m_comFd,buf+rx_length, 1040-rx_length);/* 在串口读取字符串 */
t1 = get_msec();
if(t1-t0 >= 350)
break;
//rx_length += curr_length;
//if()
usleep(50000);
rx_length = read(m_comFd,buf, sz);/* 在串口读取字符串 */
//t1 = get_msec();
//if(t1-t0 >= 350)
// break;
}
if (rx_length < 1)
return rx_length;
//if (rx_length < 1)
// 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(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 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};
int channel_num=0;
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].t.secs=time(NULL);
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 每个分量报警
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
pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i];
pPortParam->m_iNeedRevLength--;
if(4 == buf[i])
/*if(4 == buf[i]) // 测试使用
{
if(fault == 5)
{
@ -123,7 +123,7 @@ int sjzd_recv_data(SJZD_SERIAL_DEF *pPortParam, u_char *buf, int len, uint16_t u
}
else
fault++;
}
}*/
if ((0 < buf[i]) && (6 > buf[i]))
pPortParam->m_iRevStatus++;
else
@ -152,8 +152,8 @@ int sjzd_recv_data(SJZD_SERIAL_DEF *pPortParam, u_char *buf, int len, uint16_t u
flag = 1;
if (1 == flag)
{
memmove(buf, pPortParam->m_au8RecvBuf, pPortParam->m_iRecvLen);
return pPortParam->m_iRecvLen;
//memmove(buf, pPortParam->m_au8RecvBuf, pPortParam->m_iRecvLen);
return 0;
}
else
{
@ -182,15 +182,17 @@ int sjzd_recv_data(SJZD_SERIAL_DEF *pPortParam, u_char *buf, int len, uint16_t u
break;
}
}
return 0;
return -1;
}
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;
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));
if(sjzdport==NULL)
{
@ -198,8 +200,29 @@ int32_t sjzd_serial_read(uint8_t *pucBuffer,uint16_t usNBytes,uint16_t *usNBytes
return 0;
}
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(rx_len>0)

Loading…
Cancel
Save