许国锋(电源自动化设备) 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日

悬赏问题

  • ¥15 stc15f2k60s2单片机关于流水灯,时钟,定时器,矩阵键盘等方面的综合问题
  • ¥15 YOLOv8已有一个初步的检测模型,想利用这个模型对新的图片进行自动标注,生成labellmg可以识别的数据,再手动修改。如何操作?
  • ¥30 NIRfast软件使用指导
  • ¥20 matlab仿真问题,求功率谱密度
  • ¥15 求micropython modbus-RTU 从机的代码或库?
  • ¥15 django5安装失败
  • ¥15 Java与Hbase相关问题
  • ¥15 后缀 crn 游戏文件提取资源
  • ¥20 bash代码推送不上去 git fetch origin master #失败了
  • ¥15 LOL外服加入了反作弊系统,现在游戏录像rofl文件离线都无法打开