Blamaster - Mi 13.05.09 17:08
Titel: (Rs232) SerialNG Problem.
Hi,
ich möchte für ein aktuelles Projekt Farbwerte (RGB) an einen Microcontroller senden.
Ich nutze dafür gerade die SerialNG Komponente mit folgenden Einstellungen: (Form Create)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| SerialPortNG1.CommPort := 'COM1'; SerialPortNG1.BaudRate := 9600; SerialPortNG1.DataBits := 8; SerialPortNG1.StopBits := 1; SerialPortNG1.ParityType := NOPARITY; SerialPortNG1.FlowControl := fcNone; SerialPortNG1.Active := True; |
Nun wollte ich um zu sehen was denn am Com Port so passiert mit einem Com Port Logger sehen was passiert und im gegensatz zu allen anderen Programmen die den Com Port nutzen rattert SerialNG ohne Unterlass folgendes raus:
Delphi-Quelltext
1: 2: 3: 4:
| 423 13/05/2009 17:03:58 IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_MODEMSTATUS) DOWN STATUS_SUCCESS 424 13/05/2009 17:03:58 IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_MODEMSTATUS) UP STATUS_SUCCESS 00 00 00 00 425 13/05/2009 17:03:58 IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_COMMSTATUS) DOWN STATUS_SUCCESS 426 13/05/2009 17:03:58 IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_GET_COMMSTATUS) UP STATUS_SUCCESS 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
Das geht solange weiter bis ich das Programm beende. Was genau passiert da ?
Wenn das Problem gelöst ist habe ich noch eine 2. Frage.
Mein Controller ist so programmiert das er das 1. ankommende Byte (0..255) der Variable Color_R übergibt. Das 2. ankommende Byte dann der Variable Color_G, usw.
Nun habe ich bei SerialNG nur die Option gefunden Strings zu senden ich möchte aber ein Byte mit einem Wert von 0 bis 255 senden kann man den Zahlenwert einfach in einen String packen und dann an den Controllerschicken, oder wird dann jede einzelne ziffer im string einzeln gesendet ?
mfg Yannic
oOXTCOo - Mi 08.07.09 15:22
ich arbeite gerade an genau so einem selbe problem mit serialng...
ich versuche mit einem datenmodem zu komunizieren.
aber mit byte und nicht mit stirng.
funktioniert auch soweit wenn ich die daten im sniffer sehe passt alles,
allerding das lesen klappt nicht in meinem programm, ich muss alles immer
drei mal absenden bis ich vom in cluster was lesen kann...
hat jemand einen codeschnippsel für lesen? muss da ein timoutimmer ran oder sowas?
hier mal die schreibe prozedur von mir die soweit auch funktioniert:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| procedure ComReadWrite(WriteLen:Integer;ReadLen:Cardinal;ReadTimeOut:Integer); Var Tampilan:String; j:Integer; tmp:Integer; clustersize:integer; begin If WriteLen > 0 Then Begin Tampilan := 'TX : '; For j := 0 to (WriteLen-1) Do Begin Tmp:=ord(Buffer[j]); Tampilan := Tampilan + '' + ((IntToHex(Tmp,2) + ' ')); end;
Form1.memo1.lines.Add(Tampilan); application.ProcessMessages; sleep(Readtimeout); port.SendData(@buffer[1], WriteLen);
|
aufrufen kannst du es dann so:
zuerst den buffer mit die einzelnen bytes füllen die du senden willst:
Buffer[1] := #$4B;
Buffer[2] := #$13;
Buffer[3] := #$19;
Buffer[4] := #$00;
Buffer[5] := #$04;
Buffer[6] := #$02;
Buffer[7] := #$7E;
application.ProcessMessages;
dann absenden:
ComReadWrite(7, 0, 50);
"ComReadWrite ist die prozedure die 7 steht für die oben eingelesenen 7 byte
die 0 sollte dann für die lese prozedur sein, die aber noch nicht funktioniert (HILFE!)...
die 50 ist normalerweise das ReadTimout, das ich aber im moment für sleep verwende
damit er nicht zu schnell die nächsten commands sendet...
ohne procedure gehts auch so:
port.SendData(@buffer[1], 7); // buffer is ein array of char und 7 sind wieviele buffer
und buffer muss global deklariert werden (zumindest habe ichs so gemacht)
Buffer : array[0..255] of char;
grüße
hari
vieleicht könnte mir auch einer helfen bei meinem problem?
//port.SendData(@buffer[1], 7);