上位机与下位机通过485连接,采用MODBUS RTU进行通讯,波特率115200,需求是实时收发数据,并且可以实时显示,但是目前遇到的问题就是通过USB转串口后,数据未能实时收发,收到数据延时时间相当长,有时5,6秒后能收到数据,有时十几秒,这是什么原因?
第一种方法:此方法延时特别大,不知道是什么原因
int main (int argc, char *argv[])
{
FILE *fnn;
char temp[10];
int Incte,file;
int threadID;
if (InitCVIRTE (0, argv, 0) == 0) /* Needed if linking in external compiler; harmless otherwise */
return -1; /* out of memory */
if ((face = LoadPanel (0, "wheeltd.uir", FACE)) < 0)
return -1;
child=LoadPanel (face, "wheeltd.uir", PANEL_3) ;
panelM = LoadPanel (0, "wheeltd.uir", MPANEL);
setM=LoadPanel (0, "wheeltd.uir", MEARE) ;
panelHandle=LoadPanel (panelM, "wheeltd.uir", PANEL) ;
HelpHand= LoadPanel (0, "wheeltd.uir", PANEL_2);
gToolbar = InstallToolBar(panelM);
menuBar=GetPanelMenuBar (panelM);
Toolbar_SetAttribute (gToolbar, TOOLBAR_ATTR_STYLE, TOOLBAR_VAL_FLAT);
OpenComConfig (port, "", baud, parity, databit, stopbit, 512, 512);
SetCTSMode(port,LWRS_HWHANDSHAKE_OFF);
DisplayPanel (child);
InstallPopup (FACE);
InstallMainCallback(MainCallback, 0, 1);
SetIdleEventRate(25);
RunUserInterface ();
CloseCom(port);
return 0;
}
int CVICALLBACK eventtime (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
double tempv,tempv1;
int minute, hour;
int year,day, month;
int resultdate,resulttime;
char temp[50];
switch (event)
{
case EVENT_TIMER_TICK:
ComWrt(port,senddata1,8);
tempv=ReadAD() ;
SetCtrlVal (panelM, MPANEL_NUMERICMETER, tempv); //轴向传感器
SetCtrlVal (panelM, MPANEL_NUMERIC, tempv);
tempv1=ReadAD1() ;
SetCtrlVal (panelM, MPANEL_NUMERICMETER_2, tempv1); //径向传感器
SetCtrlVal (panelM, MPANEL_NUMERIC_2, tempv1);
//ComWrt(port,senddata1,8);
//InstallComCallback (port, LWRS_RECEIVE, 16, 0, ComCallback, callbackdata);
//SetCtrlVal (panelM, MPANEL_NUMERICMETER, zhoudataDAQ); //轴向传感器
//SetCtrlVal (panelM, MPANEL_NUMERIC, zhoudataDAQ);
//SetCtrlVal(panelM,MPANEL_NUMERIC_2,jingdataDAQ);
//SetCtrlVal(panelM,MPANEL_NUMERICMETER_2,jingdataDAQ);
break;
}
return 0;
}
double ReadAD(/*int adch,int adgain,double range*/)
{
double tempv;
int Tmax,Tmin,Tsum,ii;
//char senddata1[8]={0x01,0x04,0x00,0x00,0x00,0x02,0x71,0xCB};
//01 04 00 00 00 04 F1 C9
char senddata1[8]={0x01,0x04,0x00,0x00,0x00,0x04,0xF1,0xC9};
char datareceive[9]={0};
unsigned char readBuf[13]={0};
unsigned char AI[4]={0};
//unsigned char BI[4]={0};
float a=0;
int b;
int byte_sent;
//byte_sent = ComWrt(port, senddata1,8);
ComRd(port,readBuf,13);
for(int i=0;i<4;i++)
{
AI[i]=readBuf[i+3];
//BI[i]=readBuf[i+7];
}
sprintf(datareceive,"%02X%02X%02X%02X",AI[2],AI[3],AI[0],AI[1]);
sscanf(datareceive,"%x",&b);
tempv=b/10;
return tempv;
}
double ReadAD1(/*int adch,int adgain,double range*/)
{
double tempv;
int Tmax,Tmin,Tsum,ii;
//char senddata1[8]={0x01,0x04,0x00,0x00,0x00,0x02,0x71,0xCB};
//01 04 00 00 00 04 F1 C9
char senddata1[8]={0x01,0x04,0x00,0x00,0x00,0x04,0xF1,0xC9};
char datareceive[9]={0};
unsigned char readBuf[13]={0};
unsigned char AI[4]={0};
//unsigned char BI[4]={0};
float a=0;
int b;
int byte_sent;
//byte_sent = ComWrt(port, senddata1,8);
ComRd(port,readBuf,13);
for(int i=0;i<4;i++)
{
AI[i]=readBuf[i+7];
//BI[i]=readBuf[i+7];
}
sprintf(datareceive,"%02X%02X%02X%02X",AI[2],AI[3],AI[0],AI[1]);
sscanf(datareceive,"%x",&b);
tempv=b/10;
return tempv;
}
第二种方法:程序好像是掉进死循环出不来了,造成界面上的其他按键均无反应
int main (int argc, char *argv[])
{
FILE *fnn;
char temp[10];
int Incte,file;
int threadID;
if (InitCVIRTE (0, argv, 0) == 0) /* Needed if linking in external compiler; harmless otherwise */
return -1; /* out of memory */
if ((face = LoadPanel (0, "wheeltd.uir", FACE)) < 0)
return -1;
child=LoadPanel (face, "wheeltd.uir", PANEL_3) ;
panelM = LoadPanel (0, "wheeltd.uir", MPANEL);
setM=LoadPanel (0, "wheeltd.uir", MEARE) ;
panelHandle=LoadPanel (panelM, "wheeltd.uir", PANEL) ;
HelpHand= LoadPanel (0, "wheeltd.uir", PANEL_2);
gToolbar = InstallToolBar(panelM);
menuBar=GetPanelMenuBar (panelM);
Toolbar_SetAttribute (gToolbar, TOOLBAR_ATTR_STYLE, TOOLBAR_VAL_FLAT);
OpenComConfig (port, "", baud, parity, databit, stopbit, 512, 512);
SetCTSMode(port,LWRS_HWHANDSHAKE_OFF);
DisplayPanel (child);
InstallPopup (FACE);
InstallMainCallback(MainCallback, 0, 1);
SetIdleEventRate(25);
RunUserInterface ();
CloseCom(port);
return 0;
}
int CVICALLBACK eventtime (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
double tempv,tempv1;
int minute, hour;
int year,day, month;
int resultdate,resulttime;
char temp[50];
switch (event)
{
case EVENT_TIMER_TICK:
//ComWrt(port,senddata1,8);
//tempv=ReadAD() ;
//SetCtrlVal (panelM, MPANEL_NUMERICMETER, tempv); //轴向传感器
//SetCtrlVal (panelM, MPANEL_NUMERIC, tempv);
//tempv1=ReadAD1() ;
//SetCtrlVal (panelM, MPANEL_NUMERICMETER_2, tempv1); //径向传感器
//SetCtrlVal (panelM, MPANEL_NUMERIC_2, tempv1);
ComWrt(port,senddata1,8);
InstallComCallback (port, LWRS_RECEIVE, 16, 0, ComCallback, callbackdata);
SetCtrlVal (panelM, MPANEL_NUMERICMETER, zhoudataDAQ); //轴向传感器
SetCtrlVal (panelM, MPANEL_NUMERIC, zhoudataDAQ);
SetCtrlVal(panelM,MPANEL_NUMERIC_2,jingdataDAQ);
SetCtrlVal(panelM,MPANEL_NUMERICMETER_2,jingdataDAQ);
break;
}
return 0;
}
void ComCallback(int Port)
{
int inputqueuelength;
int bytesread;
char buffer[512];
char showdata[16];
//char *matchedchar = 0;
double value;
//int i;
double tempv;
char datareceive[9]={0};
unsigned char readBuf[13]={0};
unsigned char AI[4]={0};
unsigned char BI[4]={0};
int b;
//获得指定端口输入队列字符数
inputqueuelength = GetInQLen (port);
ComRd(port,readBuf,13);
for(int i=0;i<4;i++)
{
AI[i]=readBuf[i+3];
BI[i]=readBuf[i+7];
}
sprintf(datareceive,"%02X%02X%02X%02X",AI[2],AI[3],AI[0],AI[1]);
sscanf(datareceive,"%x",&b);
tempv=b/10;
zhoudataDAQ=tempv;
//SetCtrlVal(panelM,MPANEL_NUMERIC,tempv);
//SetCtrlVal(panelM,MPANEL_NUMERICMETER,tempv);
sprintf(datareceive,"%02X%02X%02X%02X",BI[2],BI[3],BI[0],BI[1]);
sscanf(datareceive,"%x",&b);
tempv=b/10;
jingdataDAQ=tempv;
//SetCtrlVal(panelM,MPANEL_NUMERIC_2,tempv);
//SetCtrlVal(panelM,MPANEL_NUMERICMETER_2,tempv);
FlushInQ(port);
FlushOutQ(port);
}
定时器间隔50ms
请问问题出在哪里,该怎么修改?