代码之家  ›  专栏  ›  技术社区  ›  kevin

串行通信Arduino C++Builder

  •  0
  • kevin  · 技术社区  · 8 年前

    我正在尝试用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时,这些值应该由新值刷新。大多数情况下,这两个值都是正确的,例如,它的显示应该是正确的 温度:24:00 湿度:55.00 但出于某些原因,它不时会显示这样的内容: 温度:。0051 湿度:。00

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

    1 回复  |  直到 8 年前
        1
  •  1
  •   Remy Lebeau    8 年前

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