许国锋(电源自动化设备) 2024-04-14 20:14 采纳率: 66.7%
浏览 2
已结题

CVI如何读取数组回来?

现在使用的是CVI2003环境,写一个驱动文件。
之前都是读取一个数值,比较容易。现在要读取一个数组回来,不知如何处理了,麻烦各位指导一下,。谢谢
要读取回来的数组如下:
◆5.000,9.000,12.000,15.000,20.000,3.300-11.000

代码如下:此代码只能读回来第一个5电压,后续91215203.3-11V就读不到了。****

  //read PdoVoltList value
  strcpy (lTXStr, "PD3PD:PDO:LIST:VOLT?\n");
  lComError = ComWrt((*aComPort), lTXStr, strlen(lTXStr));
  if(lComError!=strlen(lTXStr))
  {
    lerrorcode = IPC_ERRORCODE_COMERROR;
    goto FUNCTION_END;
  }
  else;
  
  lComError = ComRdTerm((*aComPort), lRXStr, IPC_COM_MAXLENTH-1, IPC_COM_ENDCODE);
  //Check COM operation error
  if(lComError<0)
  {
    lerrorcode = IPC_ERRORCODE_COMERROR;
    goto FUNCTION_END;
  }
  else;
  
  //Check response timeout error
  if(lComError<=1)
  {
    lerrorcode = IPC_ERRORCODE_RESPONSETIMEOUT;
    goto FUNCTION_END;
  }
  else;

  //Check response data
  if(lComError>=(IPC_COM_MAXLENTH-1))
  {
    lerrorcode = IPC_ERRORCODE_RESPONSEWRONG;
    goto FUNCTION_END;
  }
  else;

  lRXStr[lComError] = 0;
  
  //return voltage reading
  if(sscanf(lRXStr, "%f", aPdoVoltListValue) < 0)
  {
    lerrorcode = IPC_ERRORCODE_RESPONSEWRONG;
    goto FUNCTION_END;
  }
  else;
  (*aPdoVoltListValueUnused) = 0;
  
  lerrorcode = IPC_ERRORCODE_NOERROR;

FUNCTION_END:
  
  return(lerrorcode);
  
  #undef ARGCNT
  
}

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-14 20:14
    关注

    引自免费微信小程序:皆我百晓生

    在您提供的代码中,sscanf()函数仅用于解析单个浮点数。为了读取整个数组,您需要使用循环并修改sscanf()调用来逐个读取元素。此外,您还需要确保有足够的空间存储整个数组。这里是一个修改后的版本,它将读取到的每个浮点数添加到指定的数组中:

    首先,定义一个足够大的浮点数数组来存储所有的电压值,并在函数签名中增加数组长度参数:

    #define MAX_VOLTAGE_VALUES 10
    
    int ReadVoltageArray(char* com_port, float aPdoVoltListValue[], int array_length)
    {
        ...
    }
    

    然后,在主函数中分配内存:

    float pdoVoltList[MAX_VOLTAGE_VALUES];
    int numRead = ReadVoltageArray(aComPort, pdoVoltList, MAX_VOLTAGE_VALUES);
    

    接下来,修改读取函数中的代码:

    int ReadVoltageArray(char* com_port, float aPdoVoltListValue[], int array_length)
    {
        char lTXStr[100]; // Ensure this is large enough to hold the command
        strcpy(lTXStr, "PD3PD:PDO:LIST:VOLT?\n");
    
        int lComError = ComWrt(com_port, lTXStr, strlen(lTXStr));
        if (lComError != strlen(lTXStr))
        {
            return IPC_ERRORCODE_COMERROR;
        }
    
        lComError = ComRdTerm(com_port, lRXStr, IPC_COM_MAXLENTH - 1, IPC_COM_ENDCODE);
    
        if (lComError <= 1 || lComError > (array_length * 4 + 1)) // Assuming each voltage value takes 6 characters plus separator and null terminator
        {
            return IPC_ERRORCODE_RESPONSEWRONG;
        }
    
        lRXStr[lComError] = 0;
    
        int i = 0;
        while (i < array_length && sscanf(&lRXStr[i * 7], "%f,", &aPdoVoltListValue[i]) == 1) // Assuming each voltage value is separated by a comma
        {
            i++;
        }
    
        aPdoVoltListValue[i] = 0; // Add a null terminator to the end of the array (not required but can be helpful for debugging)
    
        return IPC_ERRORCODE_NOERROR;
    }
    

    这个版本的函数会遍历输入字符串,每次尝试读取一个浮点数并将它放入数组中,直到达到指定的数组长度。注意,这里的代码假设每个电压值由逗号分隔,并且每个值大约需要6个字符(例如,“5.000,”)。实际应用中,可能需要根据实际情况调整这些假设。

    这样,您的函数就可以读取整个数组并将其存储在给定的数组中了。记得检查返回的numRead变量,它表示实际读取到的电压值数量。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 6月3日
  • 已采纳回答 5月26日
  • 创建了问题 4月14日

悬赏问题

  • ¥20 求帮,直连能连上oracle12,但是thinkphp6就是报错
  • ¥15 paddleocr运行报错
  • ¥15 怎么用 matlab 设计滞后-超前串联校正网络
  • ¥15 MFC引用C#生成的dll,将dll放置到非exe程序目录,如何操作
  • ¥15 C#创建webservice接口,三方通过多次跳转访问本方服务,获取wsdl文档,wsdl中ip地址为局域网内本机地址而非三方直接访问的地址。
  • ¥15 关于#wireshark#的问题:需要安卓app流量数据集要安卓流量做包序列长度的实验,比如某些流量是在看视频还是在发评论
  • ¥15 Smail语句如何使用判断语句跳过验证卡密界面
  • ¥15 关于#wireshark#的问题:并且能够给数据做标注,如这个流量是在看视频或者是在转账
  • ¥15 运筹优化,gurobi,python
  • ¥20 springmvc重定向和返回json