Mr·GE 2023-06-24 09:57 采纳率: 51.5%
浏览 16
已结题

CVI串口收发数据卡顿

上位机与下位机通过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
请问问题出在哪里,该怎么修改?

  • 写回答

1条回答 默认 最新

  • 火花怪怪 2023-06-24 11:06
    关注

    代码太长了懒得看,说个大概你参考吧
    检查串口通信参数是否正确设置。波特率、数据位、停止位、奇偶校验等参数需要和下位机一致。如果以上参数设置正确,则可以适当减小波特率,比如尝试使用9600或者19200波特率。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月10日
  • 创建了问题 6月24日

悬赏问题

  • ¥15 java代码写在记事本上后在cmd上运行时无报错但又没生成文件
  • ¥15 关于#python#的问题:在跑ldsc数据整理的时候一直抱这种错误,要么--out识别不了参数,要么--merge-alleles识别不了参数(操作系统-linux)
  • ¥15 PPOCRLabel
  • ¥15 混合键合键合机对准标识
  • ¥100 现在不懂的是如何将当前的相机中的照片,作为纹理贴图,映射到扫描出的模型上
  • ¥15 魔霸ROG7 pro,win11.息屏后会显示黑屏,如图,如何解决?(关键词-重新启动)
  • ¥15 有没有人知道这是哪里出了问题啊?要怎么改呀?
  • ¥200 C++表格文件处理-悬赏
  • ¥15 Windows Server2016本地登录失败
  • ¥15 复合卡卡号轨道写入芯片卡