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 | ||
| ||
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: |