串行通信 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;
}
}
我正在尝试使用 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;
}
}