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