2017-11-03 25 views
0

Arduino에서 측정 한 온도와 습도를 표시해야하는 C++ Builder로 응용 프로그램을 작성하려고합니다. Arduino와 내 응용 프로그램은 TComPort를 통해 연결됩니다. 나는 115200시리얼 통신 Arduino C++ Builder

VCL 코드의 전송 속도를 사용하고 있습니다 :

AnsiString temp, hum; 

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

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

아두 이노 코드 :

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++ 빌더와 VCL)을 시작하고 아두 이노 매 5에 연결

초, 값은 새 값으로 새로 고쳐 져야합니다. 대부분의 경우 2 개의 값이 정확하고 예를 들어 표시되어야하는 것처럼 표시됩니다. 온도 : 24:00 습도 : 55.00 그러나 어떤 이유로 든 때때로 다음과 같이 표시됩니다. 온도 : .0051 Humditiy : .00

또는 다른 이상한 값입니다. 5 초 후 값이 다시 정확합니다. 이것은 20-30 초마다 1 번 발생하고 이것이 왜 계속 일어나는 지 알지 못합니다.

+0

보인다. 이상한 것을 보았을 때, 그것들 바로 앞이나 뒤의 것들입니까? 또는 엉망인 것들이 짝을 이루는 것처럼 보입니까? –

+0

그리고 왜 인쇄하기 전에 온도와 습도 값을 String으로 변환합니까? Print 클래스는 모두 플로트를 처리 할 수 ​​있다는 것을 알고 있습니다. String 클래스는 심각한 마이크로 컨트롤러 프로젝트에서 사용되어서는 안되는 메모리 조각 모음 및 메모리 조각 모음입니다. –

+0

안녕하십니까, 고마워요. 고마워요. 고마워요. 고마워................... 문자열 클래스와 함께 알았어. :) 나는 그 둘을 바꿀 것입니다. 일반적으로 첫 번째 것은 올바른 값이고, 쌍의 값은 너무 이상해져서, 다음은 좋아질 것입니다. 그 사이에 그들은 이상합니다. 거의 2 개의 이상한 것이 연속적으로 있었다. – kevin

답변

0

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

답장을 보내 주셔서 감사합니다.이 부분을 시도해 보겠습니다. – kevin

+0

"int len ​​= ComPort1-> ReadStr (s, 5);" .... "len"변수는 항상 ReadStr의 대괄호 안에있는 숫자일까요? 그렇다면 왜 (len <5)이 말을해야만할까요? – kevin