Последовательная связь 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);

}

Когда я запускаю свое приложение (VCL с C++ Builder) и подключаюсь к Arduino каждые 5 секунд, значения должны обновляться новыми значениями. Большую часть времени эти 2 значения верны и отображаются так, как должны, например: Температура: 24:00 Влажность: 55,00 Но по какой-то причине время от времени отображается что-то вроде этого: Температура: .0051 Humditiy: .00

или некоторые другие странные значения. Через 5 секунд значения снова верны. Это происходит каждые 20-30 секунд 1 раз, и я не знаю, почему это происходит.

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;
    }
}
Другие вопросы по тегам