Entwickler-Ecke

Sonstiges (Delphi) - (Rs232) SerialNG Problem.


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
//Write!
If WriteLen > 0 Then
Begin
Tampilan := 'TX : ';
For j := 0 to (WriteLen-1Do
Begin
Tmp:=ord(Buffer[j]);
Tampilan := Tampilan + '' + ((IntToHex(Tmp,2) + ' '));   // HIER WERDEN DIE TX COMMANDOS INS MEMO AUSGEGEBEN!

end;

Form1.memo1.lines.Add(Tampilan);
application.ProcessMessages;
sleep(Readtimeout);   // hier verwende ich readtimeout für die pause (als test)
port.SendData(@buffer[1], WriteLen);

//normalerweise kommt jetzt die lese prozedure, die ich aber nicht hin bekomme...



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