Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt-Bytearray是否有空条目?_C++_Qt_Qtserialport - Fatal编程技术网

C++ Qt-Bytearray是否有空条目?

C++ Qt-Bytearray是否有空条目?,c++,qt,qtserialport,C++,Qt,Qtserialport,我正在开发一个简单的函数,它能够使用发送到comport的信息在Qt中返回int 我使用的是QSerialPort类,它返回一个 问题是我似乎(有时)在QSerialPort.readAll返回的数组中得到了空条目。这使我无法将bytearray转换为int 基本功能是:要求Arduino发送温度或湿度 Qt代码: #include <QCoreApplication> #include <QSerialPortInfo> #include <QSerialPort

我正在开发一个简单的函数,它能够使用发送到comport的信息在Qt中返回int

我使用的是QSerialPort类,它返回一个

问题是我似乎(有时)在QSerialPort.readAll返回的数组中得到了空条目。这使我无法将bytearray转换为int

基本功能是:要求Arduino发送温度或湿度

Qt代码:

#include <QCoreApplication>
#include <QSerialPortInfo>
#include <QSerialPort>
#include <iostream>
#include <string>
#include <windows.h>
#include <math.h>
using namespace std;


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QString comPort = "COM6";
    QSerialPortInfo ArduinoInfo(comPort);

    cout << "Manufacturer: " << ArduinoInfo.manufacturer().toStdString() << endl;
    cout << "Product Identifier: " << ArduinoInfo.productIdentifier() << endl;
    cout << "Vendor Identifier: " << ArduinoInfo.vendorIdentifier() << endl;

    QSerialPort Arduino(ArduinoInfo);

    Arduino.setBaudRate(QSerialPort::Baud9600);
    Arduino.open(QSerialPort::ReadWrite);

    Sleep(1000);

    if(Arduino.isDataTerminalReady())
        cout << "Great Sucess" << endl;

    char sending = 'H';


    cout << sending << endl;

    Arduino.write(&sending, 1);

    //int maxSize = Arduino.bytesAvailable();

    while(!Arduino.waitForReadyRead()){}
    Sleep(100);

    QByteArray rawDataArry = Arduino.readAll();
    cout << "Shit has been read." << endl;


    // Form here on its just write functions, used for debug

    cout << "rawData:" << endl;
    for(int i=0; i < rawDataArry.size(); i++)
        cout << "[" << i << "] "<< rawDataArry[i] << endl;

    cout << "All data:" << endl;
    for(char s:rawDataArry){
        cout << s;
    }
    cout << endl;

    cout << "Converted data:" << endl;
    bool ok;
    int returnVar = rawDataArry.toInt(&ok, 10);
    cout << returnVar << endl;
    cout << "Convertion Status:" << ok;

    Arduino.close();

    return a.exec();
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main(int argc,char*argv[])
{
qcorea应用程序(argc、argv);
QString comPort=“COM6”;
QSerialPortInfo ArduinoInfo(comPort);

cout看起来像是
rawdatarry.size()
返回4,这意味着数组中有4个字节。但是,当调用
rawdatarry[i]
时,它返回一个字符。不是每个字符值都可以表示为ascii字符。这就是为什么最后2个字节显示为空

相反,您应该尝试将每个字符转换为显示字节的十进制/十六进制表示形式的值,而不是ascii表示形式

或者,您可以将这4个字节直接转换为int,然后使用它:

//Big Endian
quint32 myValue(0);
for(int i=0; i<4; i++)
    myValue = myValue + (quint8(rawDataArry.at(i)) << (3-i)*8);
//myValue should now have your integer value
//Big-Endian
第32个myValue(0);

对于(int i=0;i我最终使用QByteArray的一个成员来清理数组中的宽空间

它看起来像这样

bool ok;
int returnVal;

do
{
  Arduino.write(&imputChar, 1); // Arduino input Char

  Arduino.waitForReadyRead();

  QByteArray rawDataArry(Arduino.readAll()); // Empties buffer into rawDataArry 
  QByteArray dataArray(rawDataArry.simplified()); // Removes all widespaces!

  returnVal = dataArray.toInt(&ok, 10); // Retuns ByteConvertion - &OK is true if convertion has completed - Widespaces will ruin the conversion

  qDebug() << "Converted data:";
  qDebug() << returnVal;
  qDebug() << "Convertion Status:" << ok;
  }while(ok != 1);

  return(returnVal);
bool正常;
int returnVal;
做
{
写入(&imputChar,1);//Arduino输入字符
Arduino.waitForReadyRead();
QByteArray rawdatarry(Arduino.readAll());//将缓冲区清空到rawdatarry中
QByteArray数据数组(rawDataArry.simplified());//删除所有宽空间!
returnVal=dataArray.toInt(&ok,10);//Retuns ByteConvertion-&ok为true,如果转换已完成-宽空间将破坏转换

qDebug()感谢您的输入!-我意识到QByteArray有一个成员能够删除所有空条目和宽空间。它最终运行良好!请将您的代码简化为您的问题的一部分。您当前的代码包含许多与您的问题无关的内容-最小的示例通常看起来类似于良好的单元测试:仅执行一项任务,为再现性指定输入值。顺便说一句,您可能会发现
QByteArray::toHex()
方法很有用。
bool ok;
int returnVal;

do
{
  Arduino.write(&imputChar, 1); // Arduino input Char

  Arduino.waitForReadyRead();

  QByteArray rawDataArry(Arduino.readAll()); // Empties buffer into rawDataArry 
  QByteArray dataArray(rawDataArry.simplified()); // Removes all widespaces!

  returnVal = dataArray.toInt(&ok, 10); // Retuns ByteConvertion - &OK is true if convertion has completed - Widespaces will ruin the conversion

  qDebug() << "Converted data:";
  qDebug() << returnVal;
  qDebug() << "Convertion Status:" << ok;
  }while(ok != 1);

  return(returnVal);