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
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"
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
>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
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?
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
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.
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
>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.
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.
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 ;)
>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....
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
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.
@ 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
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?