0

私は、comport に送信された情報を使用して Qt で int を返すことができる単純な関数に取り組んでいます。

QBytearray を返す 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();
}

Arduino のコードはとてもシンプルです。

#include <dht.h>

dht DHT;

#define PIN_7 7

void setup() {
  Serial.begin(9600);
}

void loop()
{
  String impString;

  while(Serial.available() != 1);
  impString = Serial.readString();

  DHT.read11(PIN_7);

  if(impString == "T")
  {
    int temp = DHT.temperature;
    Serial.println(temp);
  }
  else if(impString == "H")
  {
    int humid = DHT.humidity;
    Serial.println(humid); 
  }

  emptyReceiveBuf();
  delay(100);
}

void emptyReceiveBuf()
{
  int x;
  delay(200);  // vent lige 200 ms paa at alt er kommet over

  while (0 < Serial.available())
  {
    x = Serial.read();
  }
}

端末モニターには次のように表示されます。

ここに画像の説明を入力

4

2 に答える 2

0

4 を返しているように見えるrawDataArry.size()ので、配列に 4 バイトあることを意味します。ただし、呼び出すrawDataArry[i]とcharが返されます。すべての char 値をアスキー文字として表現できるわけではありません。これが、最後の 2 バイトが空に見える理由です。

代わりに、ASCII 表現ではなく、バイトの 10 進数/16 進数表現を示す値に各文字を変換するようにしてください。

または、これらの 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
于 2017-04-27T16:30:13.293 に答える