
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
||
|
Hallo Dietmar, danke fuer Dein Feedback und die guten Wuensche. Zeichen mit der ESCI zu senden hatte sofort geklappt. Schwieriger war dann das Auswerten von empfangenen Zeichen. Den Ablauf ueber die Tastatur-Eingabe hatte ich am Dienstag schon beschrieben. Nun hatte ich noch etwas Verstaendnis-Probleme, wenn ich 20 bzw. 30 oder 42 Zeichen aus einer Datei gesendet habe. Das klappt nun aber auch recht gut. Das Programm in der Anlage ist dabei entstanden. Vorallem hat mich die Geschwindigkeit der O-Macro beeindruckt. Meinem Projekt GPS Daten aus einem GPS Modul mit 38400bps auszulesen , um die Datenmenge zu verarbeiten und reduzieren, sowie diese reduzierte Datenmenge ueber ein Funk-Audio-Modem mittels des Tonkanals eines 2.4/5.6GHz AV Senders vom Flugmodell runter zu senden bin ich wieder ein Stueck naeher gekommen. Die Datenmenge/Paket wird dabei von ca. 200 Bytes auf weniger als 30 Bytes reduziert u. kann dann mit niedriger Baudrate gesendet werden. Eine weitere O-Macro macht dann in der Bodenstation das Antennen-Tracking. Freundliche Gruesse Joe Fenk ################### DEMO_Programm ################# ' RSDEMO_2.BAS Demoprogramm Fr.15.11.2014 Josef Fenk ' 638 Basic- Bytes, 0-Sys Bytes und 22 RAM Bytes belegt ' Demoprogramm, zum besseren Verstaendnis der Hardwaremaessig implementierten 2_RS232 Schnittstelle (ESCI) ' an RXD:Pin7/Port13 u. TXD:Pin6/Port14 ' und vorallem ' 1. wie das mit dem Empfangsbuffer funktioniert, wenn man eine Datei mit einer Zeichenkette einlesen moechte ' 2. wie Zeitkritisch das ist, wenn man PRINT Befehle eingefuegt hat zwischen ' GET Befehlen; andere Befehle sind nicht so zeitkritisch ' 3. wie man die internen Variablen RXD u. EsciErr der ESCI RS232 Schnittstelle benutzt ' RXD=Test ob ein Byte seriell empfangen wurde; Wert=-1 ==> Byte empfangen; =0==> kein Byte empfangen ' EsciErr=Abfrage ob Empfangsfehler an der ESCI: Wert=-1==> 8Byte Empfangsbuffer ueberlauf; =0 ==> kein Ueberlauf E.-Buffer ' DEFINE RXD BYTE 'Warnung!! Bezeichner RXD heisst wie ein reserviertes Wort ' diese Eingabe nicht erforderlich, da RXD ausschlieeslich reservierter Wert ' RXD=0 'Fehlermeldung: nicht definierte Variable RXD bei Zuweisung ' mit RXD=0 wollte ich Ausstieg aus der WHILE WEND Schleife erzwingen; das hat aber nicht funktioniert ' ' !!!!!!!!!!!!!!!Sehr wichtig!!!!!!!!!!!!!!!!!!! ' Die RS232 Semiwire-Schnittstelle an PORT[1] ist nur mit Baud R9600 nutzbar ' und kann nicht auf andere Baudrate eingestellt werden, egal welche Zahl ' man hinter Baud R schreibt, deshalb entfaellt im Programm der Befehl der naechsten beiden Zeilen ' siehe dazu auch Opem-Maxi Bedienungsanleitung Version 1.1; omax_doku_11 ' DEFINE RS232_1 PORT[01] !!! ist nicht erforderlich ' BAUD R9600 !!!ist nicht erforderlich ' PC_1 benutzt fuer Onboard Programmierung dazu Terminalprog. auf 9600bps einstellen u. nicht veraendern ' und Zeichenausgabe ueber 1-te RS232 Semiwire-Schnittstelle an PORT[1] ' PC_2 ueber MAX 232 Zusatzinterface mit 2-ter RS232 Schnittstelle ESCI verbunden ' RXD PORT(13)//Pin7=empfaengt Zeichen von PC_2 ueber TXD-MAX232-Zusatzinterface ' TXD PORT(14)//Pin6=sendet Zeichen an PC_2 ueber RXD-MAx232-Zusatzinterface ' PC_2 benutzt um Zeichen einzulesen und an PC_2 und PC_1 auszugeben ' Hinweis zur Benutzung der hardwaremaessig implementierten 2. Seriellen Schnittstelle (Esci) ' der Empfangsbuffer dieser 2. ser. Schnittstelle hat 8Byte ' nach 8 Byte erfolgt ueberlauf und Wert EsciErr =-1 ' Auf dem P/E-Board kann provisorisch PORT[14] mit PORT[1] verbunden werden, oder wie ' bei mir, hatte ich ueber PC_1 die Semiwire RS232 Schnittstelle angesprochen ' PC_2 auf gleiche Baudrate wie PC_1 eingestellt; es kann aber auch andere Baudrate eingestellt werden; ' davon haengt es dann ab, ab wann ein Einlese-Fehler auftritt; im unten gezeigten Beispiel mit Baud R9600 ' tritt das nach dem 10 Zeichen auf, wenn PRINT Befehle zwischen GET Befehlen in der WHILE WEND Schleife eingefuegt waren ' Unterschied der beiden Schnittstellen: ' Semiwire-Schnittstelle: ' bez. Baudrate: nur 9600 Baud verfuegbar, keine andere Baudrate moeglich ' bez. GET: kein Empfangsbuffer, deshalb holt GET direkt die Zeichen vom Eingang ab, u. das funktioniert auch bei 9600Baud recht gut ' ESCI- Schnittstelle: ' bez. Baudrate: 300, 600, 1200, 2400, 4800,9600,19200, 38400 verfuegbar ' bez. ESCI_Sch.: hat 8 Byte Empfangsbuffer; GET holt Zeichen vom Empfangsbuffer und nicht direkt vom Eingang ab ' mit n*mal GET kann man in WHILE WEND Schleife beliebig lange Zeichenketten einlesen, ' solange man nicht zuviele zusaetzliche Befehle zwischen folgenden GET Befehlen einfuegt ' Hinweise zu Programm: WHILE RXD WEND Schleife wird solange durchlaufen bis der 8Byte Empfangsbuffer leer ist; ' ohne WHILE / WEND erfolgt Ausstieg nachdem 20 Werte eingelesen wurden ' im Programm sind unter ' noch einige Zeilen enthalten, die auf meine Probleme beim Zeichen einlesen hinweisen ' --- Betriebssystem konfigurieren ------------------------------------------ INCLUDE "OMAC.DEF" 'Include-Datei mit Definitionen vom April 2010 ' --- Definitionen Variable fuer das Hauptprogramm ' ----Def. WORD Variable ------------------------------------------ ' ----Def. Byte Variable ------------------------------------------ DEFINE Zeichen BYTE ' Zeichenempfangs Variable DEFINE Zae BYTE DEFINE Z_1 BYTE DEFINE Z_2 BYTE DEFINE Z_3 BYTE DEFINE Z_4 BYTE DEFINE Z_5 BYTE DEFINE Z_6 BYTE DEFINE Z_7 BYTE DEFINE Z_8 BYTE DEFINE Z_9 BYTE DEFINE Z_10 BYTE DEFINE Z_11 BYTE DEFINE Z_12 BYTE DEFINE Z_13 BYTE DEFINE Z_14 BYTE DEFINE Z_15 BYTE DEFINE Z_16 BYTE DEFINE Z_17 BYTE DEFINE Z_18 BYTE DEFINE Z_19 BYTE DEFINE Z_20 BYTE DEFINE i_lauf BYTE 'DEFINE RXD BYTE 'Zeichenbyte dass Empfangsbuffer Zeichen gespeichert hat;Warnung!! Bezeichner RXD heisst wie ein reserviertes Wort ' diese Eingabe nicht erforderlich!!! '***** Definition der Digitalen Ein- / Ausgabeports ' Programmbeginn PRINT "vor Start: hier noch PC_1, nun am PC_2 arbeiten" WHILE TRUE UseESCI=ON 'schaltet ESCI ein BAUD R9600 'moeglich sind 300, 600, 1200,2400,4800,9600,19200,38400 Baud PRINT "RXD=";RXD 'RXD=-1 falls Zeichen im E-Buffer, ansonsten 0; Ausdruck RXD=0 erfolgt nur beim 1-ten Durchlauf PRINT "EsEr=";EsciErr '=-1 falls Zeichen >8 = Groesse E_Buffer; ansonsten 0 PRINT "EsPt=";Esciptr '=319 zeigt immer diesen Zahlenwert PRINT "Datei mit Zeichen von PC_2 senden" #Zei_sen 'Schleife um Zeichen von gesendeter Datei zu empfangen IF RXD=0 THEN GOTO Zei_sen Zae=0 WHILE RXD ' die schleife wird solange durchlaufen bis RXD=0 ist, dann erfolgt Ausstieg ' PRINT "vRXD=";RXD 'RXD=-1 solange Zeichen im E-buffer sind, ansonsten 0 ' PRINT "vEsEr=";EsciErr '=-1 wenn E-Buffer voll ist, ansonsten bereits nach einem Zeichen auslesen 0 ' PRINT "vEsPt=";Esciptr '=319 #Nochm GET Zeichen IF Zeichen<>65 THEN GOTO Nochm 'Abfrage A<>65; dazu A Zeichen in Sendedatei eingefuegt, um gezielt Zeichen einzulesen GET Z_1 'ohne diese Abfrage war Zeichenkette nur bei 20 Zeichen langer Datei richtig; bei 30 Zeichen langer Datei Zae=Zae+1 'waren Zeichen an falscher Position ' PRINT Zae,Z_1 GET Z_2 Zae=Zae+1 ' PRINT Zae,Z_2 GET Z_3 Zae=Zae+1 ' PRINT Zae,Z_3 GET Z_4 Zae=Zae+1 ' PRINT Zae,Z_4 GET Z_5 Zae=Zae+1 ' PRINT Zae,Z_5 GET Z_6 Zae=Zae+1 ' PRINT Zae,Z_6 GET Z_7 Zae=Zae+1 ' PRINT Zae,Z_7 GET Z_8 Zae=Zae+1 ' PRINT Zae,Z_8 GET Z_9 Zae=Zae+1 ' PRINT Zae,Z_9 GET Z_10 Zae=Zae+1 ' PRINT Zae,Z_10 GET Z_11 Zae=Zae+1 ' PRINT Zae,Z_11 ' ab hier falscher Wert=50 statt 49 GET Z_12 Zae=Zae+1 ' PRINT Zae,Z_12 ' dann 56 statt 50; anschliessend kein Ausdruck mehr, springt vermutlich zu WHILE zurueck u. wartet auf Zeichen GET Z_13 Zae=Zae+1 ' PRINT Zae,Z_13 GET Z_14 Zae=Zae+1 ' PRINT Zae,Z_14 GET Z_15 Zae=Zae+1 ' PRINT Zae,Z_15 GET Z_16 Zae=Zae+1 ' PRINT Zae,Z_16 GET Z_17 Zae=Zae+1 ' PRINT Zae,Z_17 GET Z_18 Zae=Zae+1 ' PRINT Zae,Z_18 GET Z_19 Zae=Zae+1 ' PRINT Zae,Z_19 GET Z_20 Zae=Zae+1 ' FOR i_lauf=1 TO 8 ' da im Empfangsbuffer nun noch 8 Zeichen sind ' muss der geleert werden bevor naechster Durchlauf startet ' GET Zeichen 'hier gezielt den Empfangsbuffer leeren ' NEXT i_lauf ' PRINT "nRXD=";RXD '=-1 solange noch Zeichen in den 8 Empgangsbuffern liegen, ansonsten 0 ' PRINT "nEsEr=";EsciErr '= -1 wenn mit GET 1-tes Byte aus vollem E-Buffer geholt wurde = 0 ' PRINT "nEsPt=";Esciptr '=319 ' Zae=Zae+1 ' PRINT "Zae=";Zae,"RX_Dat=";Zeichen ' PRINT Zae,Zeichen ' IF EsciErr=-1 THEN ' Ausstieg aus WHILE WEND Schleife ' EsciErr=0 'Ausstieg aus der Schleife da nur 20 Werte eingelesen werden sollten ' RXD=0 'Fehlermeldung: nicht definierte Variable RXD bei Zuweisung ' ELSE ' ENDIF ' WEND PRINT Zae,Z_1,Z_2,Z_3,Z_4,Z_5,Z_6,Z_7,Z_8,Z_9,Z_10,Z_11,Z_12,Z_13,Z_14,Z_15,Z_16,Z_17,Z_18,Z_19,Z_20 UseESCI=OFF 'nun Ausgabe der Zeichen am PC_1 PRINT Zae,Z_1,Z_2,Z_3,Z_4,Z_5,Z_6,Z_7,Z_8,Z_9,Z_10,Z_11,Z_12,Z_13,Z_14,Z_15,Z_16,Z_17,Z_18,Z_19,Z_20 PRINT "nun zum Anfang und wieder am PC_2 arbeiten" WEND END ########################## ############ Verwendete Dateien zum Test des Programmes ########### 20_Zeich.txt 12345678901234567890 ########### 30_Zeich.txt 123456789012345678901234567890 ########### 42_Zeich.txt 1234567890A12345678901234567890E12345678 |
| Antwort schreiben |