Forum: Compiler & IDEs UART mehrere Bytes-Problem


von CNChris (Gast)


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

von Stefan (Gast)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

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

von Torben (Gast)


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"

von CNChris (Gast)


Lesenswert?

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

Wie geht das??

von Stefan (Gast)


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

von Johannes M. (johnny-m)


Lesenswert?

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

von guido (Gast)


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

von sechszweisechs (Gast)


Lesenswert?

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

von Simon K. (simon) Benutzerseite


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?

von CNChris (Gast)


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

von Torben (Gast)


Angehängte Dateien:

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.

von CNChris (Gast)


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

von Torben (Gast)


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.

von Sven K. (skasko)


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.

von Simon K. (simon) Benutzerseite


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 ;)

von Torben (Gast)


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

von CNChris (Gast)


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

von gruser (Gast)


Angehängte Dateien:

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.

von Falk B. (falk)


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

von gruser (Gast)


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?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.