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