Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: serielle kommunikation Kategorie: Programmierung (von André H. - 5.06.2006 19:57)
Als Antwort auf serielle kommunikation von DieterF - 20.05.2006 13:46
Ich nutze:
C-Control II Unit, C164CI-ControllerBoard, CC2-Application-Board, CC2-StarterBoard, CC2-ReglerBoard, OSOPT V3.0, OSOPT V3.1
Hallo Dieter,

Prinzipiell solltest Du in VB nicht gleich nach senden der Daten
prüfen, ob bereits etwas angekommen ist.
Denn 100% ist das nie der Fall, da das VB-Programm schneller ausgeführt
wird, als über die RS232 gesendet wird.
Optimal ist das Arbeiten mit dem onComm-Ereignis. Das wäre das einfachste.
Wenn Du das nicht machen willst, so solltest Du eine Warte-Schleife
in Deine Routine einbauen. (Mit Abbruchbedingung für ein Timeout.)

Zum �bertragen selbst kann ich nur empfehlen, die Daten Binär und nicht
im Klartext zu senden.
Es macht keinen Sinn, die Daten zuerst in Text umzuwandlen, und anschlieÃ?en
wieder in Binärdaten.

Zu Deinem C2-Code:
(Bitte benutze die Code-Tags beim posten von C2-Code.)
Ich wei�, da� es in C leider üblich, die geschweiften Klammern so unübersichtlich zu setzen,
jedoch rate ich jedem, sich an ungefär folgendes Format zu halten:
thread xy
{
 if Bedingung
  {
   ...
  }
  else
  {
   ...
  }
 ...
 while Bedingung
 {
 }
}


Es ist übersichtlicher und erleichtert das Lesen sehr.
Zum code selbst.
Zu solltest, bevor Du hwcom.get() verwendest, immer auf Empfang prüfen.
Denn hwcom.get() wartet nicht, bis ein Byte empfangen wurde.
Auch else if sollte öfters verwendet werden.
Das spart bei grö�eren if-Abfragen Rechenzeit.

Mein Vorschlag zusammen mit der �nderung des Datenformats auf Binärddaten
statt Klartext wäre folgender:

//---------------------------------------------------------------------------------------------------
   thread SerKom
//---------------------------------------------------------------------------------------------------
{
 int schalter;
 string s;
 byte command;
// wait hwcom.rxd()
 wait hwcom.inbuffercnt()>1; // Mindestens zwei Byte im Puffer
 command=hwcom.get();
 if command=='A'
  {// AuÃ?entemperatur setzen --------------------------------------------
    ta=(hwcom.get() shl 8) or hwcom.get();
  }
  else if command=='S'
  {// Schalter und Led ein aus --------------------------------------------
   schalter=hwcom.get();
   stports.setLED((schalter%10)+1-10,schalter>=10);
   if schalter%10 == 7  stports.LCDlight(schalter>=10);
   else
   if schalter%10 == 8  stports.setRel(1,schalter>=10);
   else
   if schalter%10 == 9  stports.setRel(2,schalter>=10);
  }
  else if command=='a'
  {// Status AD0 zurückgeben -----------------------------------------
   hwcom.put('a'); // a als Erkennung für AD0
   hwcom.putint(tww);
  }
  else if command=='b'
  {// Status AD1 zurückgeben -----------------------------------------
   hwcom.put('b'); // b als Erkennung für AD1
   hwcom.putint(twb);
  }
}


In VB würde das Senden der Daten so aussehen:

 temp=Int(Rs!weatherdata * 10)
 if temp<0 then temp=temp+65536 ' Negative Werte
 MSComm1.output = A + asc(temp/256)+ asc(temp AND 255);

 MSComm1.output = S + asc(wert);

Das Empfangen würde dementsprecehnd so aussehen:

If MSComm1.InBufferCount>2 Then
   MSComm.inputlen=1
   a = MSComm1.Input
   HighByte=asc(MSComm1.input)
   LowByte=asc(MSComm1.input)
   inValue= (HighByte*256) + LowByte
   if inValue> 32767 then inValue = inValue - 65536 ' negative Werte
   select case a
    case 'a'
     Schema.txtBox(9).Text= inValue
    case 'b'
     Schema.txtBox(13).Text= inValue
   end select
  End If

Das beste wäre, wenn das, wie gesagt, mit dem OnComm-Ereignis gemacht würde:

Private Sub MSComm1_OnComm()
On Error Resume Next
 if MSComm.CommEvent = comEvReceive then
  'Empfangsroutinen
  '...
 end if
end Sub


MfG André H.



> Hallo,
>
> ich möchte mit der Station kommunizieren und dieses vom PC aus steuern.
> Ich möchte z.B. Daten aus meiner Wetterstation an die CC2 senden und Statusdaten von der CC2 empfangen
> Auf dem PC läuft ein VB Programm z.B. mit dem MsComm Steuerelement das folgende Befehle absetz:
>
> ' Sensordaten aus Station lesen --------------------------------------------------------------------------------------------
> MSComm1.Output = "a"
> DoEvents
> MSComm1.Output = "b"
> ' Es sollen alle verfügbaren Daten abgerufen werden.
> ' Prüfen, ob Daten vorhanden sind.
> If MSComm1.InBufferCount Then
>    ' Daten lesen.
>    InString$ = MSComm1.Input
>    ' Umwandeln und ausgeben
>    x = InStr(1, InString, "AD0=")
>    If x > 0 Then
>       Schema.txtBox(9).Text = Val(Mid(InString, x + 4, 3)) / 10
>    End If
>    x = InStr(1, InString, "AD1=")
>    If x > 0 Then
>       Schema.txtBox(13).Text = Val(Mid(InString, x + 4, 3)) / 10
>    End If
> End If
>
> ' Wetterdaten an Station übergeben ---------------------------------------------------------------------------------------
> cString = "A" + CStr(Int(Rs!weatherdata * 10)) + vbCrLf
> MSComm1.Output = cString
>
>
> Dazu habe ich auf der Station folgenden Tread geschrieben, der auch funktioniert:
> //---------------------------------------------------------------------------------------------------
>   thread SerKom{
> //---------------------------------------------------------------------------------------------------
>  int schalter;
>  string s;
>  byte command;
>  command=hwcom.get();
>  if      command=='A'{
>   // AuÃ?entemperatur setzen --------------------------------------------
>   ta=hwcom.input(3);
>   }
>  else if command=='S' {
>   // Schalter und Led ein aus --------------------------------------------
>   schalter=hwcom.input(2);
>   if schalter>=10 {
>      stports.setLED(schalter+1-10,True);
>      if schalter == 17  stports.LCDlight(True);
>      if schalter == 18  stports.setRel(1,True);
>      if schalter == 19  stports.setRel(2,True);
>
>   }else{
>      stports.setLED(schalter+1,False);
>      if schalter == 7  stports.LCDlight(False);
>      if schalter == 8  stports.setRel(1,False);
>      if schalter == 9  stports.setRel(2,False);
>   }
> }
>  else if command=='a' {
>   // Status AD0 zurückgeben -----------------------------------------
>     s="AD0=";
>     str.putint(s,tww);
>     hwcom.print(s);
>     hwcom.ret();
>    }
>  else if command=='b' {
>   // Status AD1 zurückgeben -----------------------------------------
>     s="AD1=";
>     str.putint(s,twb);
>     hwcom.print(s);
>     hwcom.ret();
>    }
>  } // End Thread
>
>
> Habt Ihr dazu Anmerkungen oder Verbesserungen?
>
> Gruss Dieter
>
>


Antworten bitte nur ins Forum!
Fragen per EMail auf Forum-Postings werden nicht beantwortet!

Das macht meine Heizung gerade


    Antwort schreiben


Antworten: