2017-11-03 20 views
0

私はArduinoの測定の温度と湿度などを表示するC++ Builderでアプリケーションを作成しようとしています。 Arduinoと私のアプリケーションはTComPortで接続されています。私は自分のアプリケーション(C++ BuilderでVCL)を起動して、Arduinoのにすべての5を接続するとシリアル通信Arduino C++ Builder

DHT dht(10, DHT11); 

void setup(void) 
{ 
dht.begin(); 
Serial.begin(115200); 
} 

void loop(void) 
{ 
// Measure the humidity & temperature 
float h = dht.readHumidity(); 
float t = dht.readTemperature(); 

// Transform to String 
String temp = String(t); 
String hum = String(h); 
delay(10); 
Serial.print(temp); 
Serial.print(hum); 

delay(5000); 

} 

AnsiString temp, hum; 

ComPort1->ReadStr(temp, 5); 
RichEdit1->Text = temp; 

ComPort1->ReadStr(hum, 5); 
RichEdit3->Text = hum; 

Arduinoのコード:私は115200

VCLコードのボーレートを使用しています新しい値で値をリフレッシュする必要があります。ほとんどの場合、2つの値が正しいと表示されます。例えば、 温度:24:00 湿度:55.00 何らかの理由で毎回次のように表示されます。 温度:.0051 Humditiy: .00

またはその他の奇妙な値。 5秒後に値が再び正しくなります。これは20〜30秒ごとに1回発生し、なぜこれが起こっているのかわかりません。

+0

が見えます。あなたが奇妙なものを見ると、その前か右のものが正しいのでしょうか?または、台無しにされたものはペアで来るようですか? –

+0

そして、なぜそれらを印刷する前に、温度と湿度の値をStringに変換していますか? Printクラスは浮動小数点をすべて処理できます。 Stringクラスは、深刻なマイクロコントローラプロジェクトでは使用しないでください。 –

+0

こんにちは、ありがとう、私はdidntz文字列クラスで知っている最初のおかげで、あなたのコメントのために多くのありがとう:私は、2番目の通常は最初のものは正しい値ですペアの両方の値はとても奇妙な取得し、それらの間には奇妙です。 2つの奇妙なものが一列に並んでいることはほとんどありません。 – kevin

答えて

0

TComPort.OnRxCharイベントには、利用可能なバイト数を示すCountパラメータがあります。それ以上は読まないでください。バイトを側面にバッファし、そのバッファから完全な値だけを読み込みます。例えば

:あなたは時折送信途中でそれをキャッチしているよう

private: 
    AnsiString ComPortBuffer; 

void __fastcall TMyForm::ComPort1RXChar(TObject *Sender, int Count) 
{ 
    AnsiString s; 

    int len = ComPort1->ReadStr(s, 5); 
    if (len > 0) 
    { 
     if (len < 5) 
      s.SetLength(len); 
     ComPortBuffer += s; 
    } 

    while (ComPortBuffer.Length() >= 10) 
    { 
     AnsiString temp = ComPortBuffer.SubString(1, 5); 
     AnsiString hum = ComPortBuffer.SubString(6, 5); 
     ComPortBuffer.Delete(1, 10); 

     // use temp and hum as needed... 
     RichEdit1->Text = temp; 
     RichEdit3->Text = hum; 
    } 
} 
+0

あなたの返事をありがとう、この1つを試してみません:) – kevin

+0

私はちょうど "int len = ComPort1-> ReadStr(s、5);" ....変数 "len"は、常にReadStrの角括弧内に置かれた数になりますか?では、どうして私は(len <5)と言わなければならないのですか? – kevin

関連する問題