串行通信 Arduino C++ Builder

Serial Communication Arduino C++ Builder

我正在尝试使用 C++ Builder 编写一个应用程序,它应该显示例如来自 Arduino 的测量值的温度和湿度。 Arduino 和我的应用程序通过 TComPort 连接。我使用的波特率为 115200。

VCL代码:

AnsiString temp, hum;

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

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

Arduino 代码:

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);

}

当我启动我的应用程序(带有 C++ Builder 的 VCL)并每 5 秒连接到 Arduino 时,这些值应该被新值刷新。大多数情况下,这 2 个值是正确的,例如它应该显示的那样 温度:24:00 湿度:55.00 但出于某种原因,它时不时地显示如下内容: 温度:.0051 湿度:.00

或其他一些奇怪的值。 5 秒后,值再次正确。这种情况每 20-30 秒发生 1 次,我不知道为什么会一直发生。

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;
    }
}