www.mikrocontroller.net

Forum: Compiler & IDEs UART mehrere Bytes-Problem


Autor: CNChris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!


Ich habe es schon in meinem CNC-Fräse-Thread beschrieben, jedoch wird 
der Thread nicht mehr besonders beantwortet ;)

Ich habe vor, von meinem PC-Programm ein Byte (eigentlich mehrere 
Hintereinander) an meinen Mikrocontroller zu schicken.

Das heißt, der mikrocontroller pollt ganz am anfang erstmal den PC, pc 
meldet dann, dass das board angeschlossen ist.
Dann wird als erstes ein Byte an den controller geschickt, dass er nun 
das pollen aufhören soll und auf Daten warten soll.

Dann folgen die Parameter:   Motor-Adresse, Drehrichtung, 
Motorumdrehungsanzahl.
Ich habe vor, ausschließlich mit 8-bit pro Parameter zu arbeiten. Das 
heißt ich werde für jeden Parameter 3 char-Arrays (mit jeweils 1 Byte) 
im speicher
reservieren.
Das sollte dann so aussehen:
PC schickt das erste byte. erstes Byte kommt in erstes Arrayelement. PC 
schickt das zweite byte, 2. byte kommt in zweites Arrayelement. usw.

Welches Byte für welchen Parameter steht, kann man dann ja abfragen, 
indem man weiß, wieviel speicher den einzelnen Parametern zugeordnet 
sind.

Nun habe ich - wie ich im anderen thread schon geschrieben habe - ein 
test-programm für den controller geschrieben, welches Daten vom 
Hyperterminal einliest.
Da gab es aber das "Problem", dass 1. die eingegebenen Ziffern (z.b. 58) 
als ASCII-"5" übertragen wurden und 2. nicht die Komplette 58, obwohl 
sie eigentl. in ein Byte passt.

Könntet ihr mir Helfen?


Vielen Dank

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Zahl 58 passt sicher in ein Byte, der String "58" braucht aber 2 
Bytes! Ich denke, Dein Hyperterminal überträgt Strings...

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P.S.
wenn Du ":" vom HT an den µC überträgst, dann kommt beim µC auch 58 an 
:-)

Autor: Torben (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zum Verständnis downloade Dir HTerm und verbinde über ein Crossoverkabel 
UART0 und UART1 deines PC's und sende mal ASCII 58.

Du solltest Dir auch ein kleines Protokoll ausdenken. Hier habe ich eine 
Möglichkeit gepostet.

Beitrag "genial einfaches Protokoll gesucht"

Autor: CNChris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja genau... nur ich möchte eben die 58 als Zahl senden und nicht als 
ASCII.

Wie geht das??

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab ich doch geschrieben!
58 ist der ASCII-Code für ":"
Schau Dir mal 'ne ASCII-Tabelle an.

Ansonsten musst Du mal schauen, ob dein HT irgendsowas wie eine Hex oder 
Raw-Modus hat, bei dem keine Zeichen sondern 'echte' Byte-Werte 
eingegeben und gesendet werden können

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Folge einfach Torbens Vorschlag und besorge Dir HTerm. Da kannste auch 
"Zahlenwerte" eingeben und versenden. Hyperterminal macht nur 
ASCII-Strings.

Autor: guido (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>ja genau... nur ich möchte eben die 58 als Zahl senden und nicht als
>ASCII.

>Wie geht das??

Geht das nicht mehr mit gedrückter ALT-Taste
auf dem Ziffernblock?

guido

Autor: sechszweisechs (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht sollte man sich langsam vom HTerm oder so loesen und selbst 
ein Terminalprogramm zusammenhaemmern, das genau das macht was es 
soll....

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sechszweisechs wrote:
> Vielleicht sollte man sich langsam vom HTerm oder so loesen und selbst
> ein Terminalprogramm zusammenhaemmern, das genau das macht was es
> soll....

Was spricht gegen HTerm?

Autor: CNChris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also nun versteh ich nur noch Bahnhof ;)

Ich möchte den WERT 193 übertragen. Ich vermute, dass in Visual Basic 
der komplette WERT (also 193) übertragen wird und nicht: erstes Byte 
Ascii-"1", zweites Byte Ascii-"2", usw.

Ich werde es morgen mal probieren, wenn ich dazukomme.

danke

Autor: Torben (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube du machst ein Denkfehler.

Du tippst in Hyperterminal ASCII Zeichen ein "193" das ist Hexadezimal 
gesehen 0x31, 0x39, 0x33, also drei Byte.

Moechtest du ein Hexadezimalenwert von 193 übertragen solltest du 
erwähnt hat mit ALT + Numblock den Wert über Hyperterminal senden oder 
z.B. HTerm nehmen.

Anbei ein Bild zum besseren Verständis.

Autor: CNChris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja ok. Ich habe das schon soweit verstanden, nur ich weiß eben nicht wie 
es in visual basic (in meinem späteren PC-programm ) ist, ob das die 
werte schickt oder den ascii.

danke

Autor: Torben (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>ja ok. Ich habe das schon soweit verstanden, nur ich weiß eben nicht wie
>es in visual basic (in meinem späteren PC-programm ) ist, ob das die
>werte schickt oder den ascii.

ich kenne VB bzw. die Serialport Version von VB nicht, aber in C kann 
ich angeben ob ich ein char oder string senden möchte. Ich hab Dir aber 
aber schon eine Möglichkeit gegeben dieses schnell und einfach zu prüfen 
(UART0 mit UART1 mit Corssoverkabel verbinden und senden). Du koenntest 
auch einfach mal in der MSDN Lib. schaun.

Autor: Sven K. (skasko)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich das richtig verstanden habe, willst Du ein PC-Programm in VB 
schreiben, dass ein Terminal Programm wie zb Hterm ersetzt.
Dementsprechend kannst Du dann auch bestimmen was gesendet wird.
Über die serielle Schnittstelle werden nur die Bytes (byteweise) 
gesendet, die Du angibst.
Wenn Du also einem unsigned char den Wert 198 zuweist und dieses Byte an 
die Sendefunktion übergibst, wird auch dieser Wert gesendet.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Torben wrote:
> Moechtest du ein Hexadezimalenwert von 193 übertragen solltest du
> erwähnt hat mit ALT + Numblock den Wert über Hyperterminal senden oder
> z.B. HTerm nehmen.

Hexadezimalwert 193? Das sind Dezimal 403..

Bitte genau aufpassen, was ihr schreibt ;)

Autor: Torben (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Hexadezimalwert 193? Das sind Dezimal 403..

>Bitte genau aufpassen, was ihr schreibt ;)

Sorry da hab ich mich falsch ausgedrückt.

Wenn du den Wert 193 (Dezimal) als Hexwert 0xC1 senden willst....

Autor: CNChris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja genau. Ich möchte das VB-Programm (von mir) als Ersatz von einem 
terminal, welches den Wert 0x7F an den Controller schickt und dieser 
Wert dann vom Controller als jener gesehen wird.


Schaut bitte mal meinen Thread unter "µC &  Elektronik" an --> CNC-Fräse 
im Eigenbau.

Da ist nun ein Code drin den ich heute mal geschrieben habe.

Danke

Autor: gruser (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

denke ich habe das gleiche Problem. Habe SerialPort eingebunden, sende 
Daten mit com1.Write(Wert), wobei Wert vom Typ "Byte" ist. es kommt auch 
was raus, aber zum Beispiel beim Wert "170" erhalte ich auf dem 
Speicheroszilloskop das Bildchen wie im Anhang gezeigt. Wie schaffe ich 
es, dass z.B. bei einer "170" die Bits "10101010" über die Leitung 
düsen? Da muss es doch was geben bei Visual Basic 2005. Bin für jeden 
Tipp dankbar.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ gruser (Gast)

>Speicheroszilloskop das Bildchen wie im Anhang gezeigt. Wie schaffe ich
>es, dass z.B. bei einer "170" die Bits "10101010" über die Leitung
>düsen? Da muss es doch was geben bei Visual Basic 2005.

Such mal nach Binärmodus, Direktmodus, ASCII-Modus etc. Wahrscheinlich 
läuft das noch im ASCII-Modus, wobei einige Zeichen intern dann 
umcodiert werden. Im Binärmodus geht alles 1:1 raus.

MFG
Falk

Autor: gruser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja danke, hat mich ein wenig inspiriert die Rückmeldung und zum 
"Weiterforschen" ermuntert. Ich denke ich bin nahe dran, mein letzter 
Stand ist folgender:

Dim Sendung As Byte

Sendung = 170

Using com1 AS IO.Ports.SerialPort = 
My.Computer.Ports.OpenSerialPort("COM1")
   com1.Encoding = System.Text.Encoding.GetEncoding(28591)
   com1.BaudRate = 9600
   com1.Parity = IO.Ports.Parity.None
   com1.WriteTimeout = 500
   com1.Write(Sendung)
   com1.Close()
End Using


Angeblich soll mit der Encoding-Funktion eine saubere Übertragung von 
Daten (0-255) in einem Byte erfolgen. Kann ich leider nicht bestätigen. 
Weiß wer was ich falsch mache?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.