Autor |
Beitrag |
sneumann
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 05.10.11 09:39
Ich möchte die Serielle Schnittstelle ansprechen den COM5 habe da ein Messgerät angeschlossen dem ich Befehle übergeben möchte: Anweisungen aus dem Handbuch des Geräts über Delphi an das Gerät senden über COM5:
Beispielbefehle aus dem Handbuch des Geräts:
CONFigure:TEMPerature:TCOuple<parameter> Temperatur configurieren
DISPlay:BACKlight? Abfragen ob Hintergrundbeleuchtung an ist rückgabe 1 oder 0
solche befehle möchte ich über Delphi realisieren und an die Schnittstelle senden und auslesen
Wie funktioniert das? Ich habe einen aus diesem Forum entnommenen Code [url]( www.delphi-forum.de/...sc&start=0[/url] mal versucht in eine Form zu bringen wo ich einfach 11 Buttons habe:
Port öffnen,Port schließen,Port geschlossen?,Abfragen StatusLeitungen,Set DTR,reset DTR,Port Polling,Beispiel mit ReleaseEvent(in ReleaseEvent sind dann meiner schlechten Delphi Kenntnisse nach die Befehle enthalten!?),Port konfigurieren,SendString,ReadString.
was brauch ich alles für meine Aufgabe von diesen Sachen, wie kann ich das in Delphie realisieren, was mache ich noch falsch? hier mal mein Code mit Fehlermeldungen: Hab ich irgendwie die SetupAPI falsch eingebunden? oder was ist falsch? Andere Vorschläge mit Code?!
Hab ich was mit den begin - end falsch gemacht?! zu wenig zuviele?! Habe noch keine releaseEvent ich bin mir nicht so sicher wie ich das realisieren kann da ich Anfänger bin, bitte um Hilfe oder andere einfache Vorschläge!?
Wichtig ist dass ich die schnittstelle auslesen kann und Befehle senden kann! und Erstmal vielleicht ein Auflisten der Geräte wäre gut oder Ähnliches
//Project
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264:
| program com5test;
uses Forms, main in 'main.pas' ;
{$R *.res}
begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end.
-------------- unit main;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; Button6: TButton; Button7: TButton; Button8: TButton; Button9: TButton; Button10: TButton; Button11: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button6Click(Sender: TObject); procedure Button7Click(Sender: TObject); procedure Button8Click(Sender: TObject); procedure Button9Click(Sender: TObject); procedure Button10Click(Sender: TObject); procedure Button11Click(Sender: TObject); procedure FormCreate(Sender: TObject); private public end;
var Form1: TForm1; PortTimeout : _COMMTIMEOUTS; PortHandle : Integer; PortDCB : TDCB; PortNr : Integer; PortState : Cardinal; WriteOverlapped,ReadOverlapped,StatusOs: TOverlapped;
implementation
{$R *.dfm} Uses SetupAPI;
procedure InitOverlapped(var Overlapped : TOverlapped); begin Overlapped.Offset := 0; Overlapped.OffsetHigh := 0; Overlapped.Internal := 0; Overlapped.InternalHigh := 0; Overlapped.hEvent := CreateEvent(nil,True,False,'');
procedure TForm1.Button10Click(Sender: TObject); begin SetCommMask(PortHandle,0); end;
procedure TForm1.Button11Click(Sender: TObject); begin type TSerialThread = class(TThread) protected fComEvent: cardinal; procedure Execute; override; public constructor Create; property ComEvent: cardinal read fComEvent; end;
constructor TSerialThread.Create; begin FreeOnTerminate:= True; inherited Create(False); end;
procedure TSerialThread.Execute; var SerialEvent, WaitResult, BytesRead: Cardinal; begin SetCommMask(PortHandle,EV_CTS or EV_BREAK or EV_DSR or EV_ERR or EV_RING or EV_RLSD or EV_RXCHAR or EV_RXFLAG or EV_TXEMPTY); if not WaitCommEvent(PortHandle,SerialEvent,@StatusOs) then begin if (GetLastError = ERROR_IO_PENDING) then begin WaitResult := WaitForSingleObject(StatusOs.hEvent,INFINITE); case WaitResult of WAIT_OBJECT_0: begin if GetOverlappedResult(PortHandle,StatusOs,BytesRead,false) then ReleaseEvent(SerialEvent); end; end; end; procedure TForm1.FormCreate(Sender: TObject); begin
end;
end else ReleaseEvent(SerialEvent);
procedure TForm1.Button1Click(Sender: TObject); begin function OpenCOM(Port: byte): boolean; stdcall;
PortHandle := CreateFile(PChar('\\.\COM'+IntToStr(Port)),GENERIC_READ or GENERIC_WRITE,0, nil,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,LongInt(0)); if PortHandle > 0 then begin Result := true; InitOverlapped(WriteOverlapped); InitOverlapped(ReadOverlapped); InitOverlapped(StatusOs); end else Result := false; end;
procedure TForm1.Button2Click(Sender: TObject); begin procedure CloseCOM; stdcall; PurgeComm(PortHandle, PURGE_RXABORT or PURGE_RXCLEAR or PURGE_TXABORT or PURGE_TXCLEAR); SetCommMask(PortHandle,0); CloseHandle(PortHandle); PortHandle := 0; end;
procedure TForm1.Button3Click(Sender: TObject); begin function ComAvailable(ComNr: byte): boolean; stdcall; var TestHandle : integer; TestHandle := CreateFile(PChar('\\.\COM'+IntToStr(ComNr)),GENERIC_READ or GENERIC_WRITE,0, nil,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,LongInt(0)); if (TestHandle <= 0) then Result := false else begin Result := true; CloseHandle(TestHandle); end; end;
procedure TForm1.Button4Click(Sender: TObject); begin function SetBaudRate(baud: cardinal): boolean; stdcall;
GetCommState(PortHandle,PortDCB); PortDCB.BaudRate := baud; Result := SetCommState(PortHandle,PortDCB); end;
procedure TForm1.Button5Click(Sender: TObject); begin var PortState: cardinal;
GetCommModemStatus(PortHandle,PortState); if ((Portstate and MS_CTS_ON) <> 0) then Result := true else Result := false; end;
procedure TForm1.Button6Click(Sender: TObject); begin procedure SetDTR; stdcall; if (PortHandle <> 0) then EscapeCommFunction(PortHandle,5); end;
procedure TForm1.Button7Click(Sender: TObject); begin procedure ClearDTR; stdcall; if (PortHandle <> 0) then EscapeCommFunction(PortHandle,CLRDTR); end;
procedure TForm1.Button8Click(Sender: TObject); begin function SendString(Str: PChar): boolean; stdcall; var written : cardinal; tmpStr : string; i: LongBool; begin if (PortHandle <> 0) then begin tmpStr := string(Str); Result := not WriteFile(PortHandle,tmpStr[1],Length(tmpStr),written,@WriteOverlapped); end; end; end;
procedure TForm1.Button9Click(Sender: TObject); begin function ReadString(var Buf: PChar): Cardinal; stdcall; var StrBuf: string; Error,BytesRead: DWORD; Status: TComStat; RdSuccess: boolean; begin BytesRead := 0; if (PortHandle <> -1) then begin ClearCommError(PortHandle,Error,@Status); case Error of CE_BREAK,CE_DNS,CE_FRAME,CE_IOE,CE_MODE,CE_OOP,CE_OVERRUN,CE_PTO,CE_RXOVER, CE_RXPARITY,CE_TXFULL: begin BytesRead := 0; end else begin SetLength(StrBuf,Status.cbInQue); RdSuccess := ReadFile(PortHandle,StrBuf[1],Status.cbInQue,BytesRead,@ReadOverlapped); if not RdSuccess then BytesRead := 0; end; end; end; if (BytesRead > 0) then begin Result := BytesRead; try StrPCopy(Buf,StrBuf); except Result := 0; end; end else Result := 0;
end. | Moderiert von Christian S.: Topic aus Delphi Tutorials verschoben am Mi 05.10.2011 um 09:40
|
|
jaevencooler
      
Beiträge: 166
Erhaltene Danke: 6
MS-DOS,Win32, Win95, Win 98, Me,XP, Linux, NT4.0, NT 2000-2008, Vista, Windows 7
Turbo Pascal,D1 Enter,D2 Enter,D3 Enter,D5 Enter, Kylix, D2007, PL/SQL, MS/SQL, Delphi 2010, Delphi XE
|
Verfasst: Mi 05.10.11 11:03
Guten Morgen,
Hmmm, ich möchte Dir ja nicht zu nahe treten, aber hast Du die Sourcen irgendwo kopiert ?
Du sagst ja selber das Du ein Anfänger bist, und dann gleich mit Thread Programmierung, ich weiß ja nicht.....
Gut wäre es wenn Du Stück für Stück voran gehen würdest, also eine Form erstellen, Buttons drauf, Unit einbinden usw.
und nicht Sourcen kopieren, und hoffen das es läuft.
Beste Grüße
Michael
_________________ Wissen ist Macht, nichts wissen macht auch nichts...
|
|
sneumann
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 05.10.11 12:09
Moderiert von Narses: Komplett-Zitat des letzten Beitrags entfernt.
Ja genau das habe ich ja gemacht
Form erstellt, verschiedene Buttons erstellt und dann die Codes eingefügt aber irgendwas funktioniert nicht richtig
Ich verstehe nicht warum die Buttons auch alle falsch sind...
Fehlermeldungen:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| [Fehler] main.pas(65): Anweisung erwartet, aber 'PROCEDURE' gefunden [Fehler] main.pas(72): Anweisung erwartet, aber 'TYPE' gefunden [Warnung] main.pas(94): Unsicherer Code '@ operator' [Fehler] main.pas(103): Undefinierter Bezeichner: 'ReleaseEvent' [Fehler] main.pas(111): Anweisung erwartet, aber 'PROCEDURE' gefunden [Fehler] main.pas(113): Anweisung erwartet, aber 'FUNCTION' gefunden [Fehler] main.pas(115): Unbekannte Anweisung: 'PortHandle' [Fehler] main.pas(115): Deklaration erwartet, aber ':=' gefunden [Fehler] main.pas(131): ';' erwartet, aber 'ELSE' gefunden [Fehler] main.pas(132): '.' erwartet, aber ';' gefunden [Fehler] main.pas(137): Anweisung erwartet, aber 'PROCEDURE' gefunden [Fehler] main.pas(138): Unbekannte Anweisung: 'PurgeComm' [Fehler] main.pas(146): Anweisung erwartet, aber 'FUNCTION' gefunden [Fehler] main.pas(149): Bezeichner redefiniert: 'TestHandle' [Fehler] main.pas(149): ',' oder ':' erwartet, aber ':=' gefunden [Fehler] main.pas(150): ',' oder ':' erwartet, aber '(' gefunden [Fehler] main.pas(150): ',' oder ')' erwartet, aber '(' gefunden [Fehler] main.pas(150): ',' oder ':' erwartet, aber 'OR' gefunden [Fehler] main.pas(150): Bezeichner erwartet, aber Zahl gefunden [Fehler] main.pas(151): ';' erwartet, aber ',' gefunden [Fehler] main.pas(151): ',' oder ':' erwartet, aber '(' gefunden [Fehler] main.pas(152): Deklaration erwartet, aber 'IF' gefunden [Fehler] main.pas(157): Inkompatible Typen: 'Cardinal' und 'Enumeration' [Warnung] main.pas(159): Text hinter dem abschließenden 'END.' wird vom Compiler ignoriert [Fehler] main.pas(29): Ungenügende Forward- oder External-Deklaration: 'TForm1.Button4Click' [Fehler] main.pas(30): Ungenügende Forward- oder External-Deklaration: 'TForm1.Button5Click' [Fehler] main.pas(31): Ungenügende Forward- oder External-Deklaration: 'TForm1.Button6Click' [Fehler] main.pas(32): Ungenügende Forward- oder External-Deklaration: 'TForm1.Button7Click' [Fehler] main.pas(33): Ungenügende Forward- oder External-Deklaration: 'TForm1.Button8Click' [Fehler] main.pas(34): Ungenügende Forward- oder External-Deklaration: 'TForm1.Button9Click' [Fataler Fehler] com5test.dpr(5): Verwendete Unit 'main.pas' kann nicht compiliert werden |
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Mi 05.10.11 13:19
Bei Dir fehlen nicht nur ein paar Begins und Ends, sondern der "Code" ist totales Mischmasch von irgendwelchen Dingen.
Schmeiß weg und fang strukturiert neu an. Für den Anfang solltest Du den Crashkurs von Christian durcharbeiten.
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
Dude566
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Mi 05.10.11 20:18
Anlaufstellen für dich könnten sein:
Crashkurs von Christian: www.christian-stelzm...rtikel/crashkurs.htm
Und im Delphi-Treff unter Object Pascal, Tipps & Tricks und Tutorials: www.delphi-treff.de/
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
sneumann
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 06.10.11 11:28
Also ich habe jetzt die SerielNG KOmponente installiert und versuche mit dieser auf die serielle schnittstelle zuzugreifen
jetzt starte ich die seriell ng advanced demo und klicke bei settings auf open port COM4 stelle alle daten ein bei settings dann gehe ich auf string sende und gebe:
die befehle speziell für mein gerät zum connecten lauten: 0000sr<ENQUIERY> (<ENQUIERY> = Control E bzw 05 hex)
dann müsste eignetlich schon ein 06 zurück kriegen = Control F = ACKNOWLEDGE vom gerät zurückkommen, dass er es gemerkt hat.
danach habe ich ein (02 (hex=Control B = START OF TEXT)) <BEFEHL> dann (<LF> CONTROL J) dann (03 (hex = CONTROl C = END OF TEXT))
Die Befehle habe ich alle als String eingegeben also so sieht das komplett aus wenn man mit einem anderen Programm wie REALTERM mit dem Gerät kommuniziert: => ist immer was ich eingebe und - immer was zurückkommt.
=> 030 030 030 030 s73 r72 Connect
=> 05 ENQUIRY
-06 ACKNOWLEDGE vom Gerät
=> 02 START OF TEXT
=> :3A D44 I49 S53 P50 :3A B42 A41 C43 K4B ?3F 20 131 // Licht an - (BEFEHL)
=> 0A NEW LINE /n
=> 03 END OF TEXT
-06 ACKNOWLEDGE vom Gerät
=> 04 END OF TRANSMISSION
Licht aus:
3A D44 I49 S53 P50 :3A B42 A41 C43 K4B ?3F 20 030 statt das oben
Beim log sehe ich jedoch nur
Msg 06.10.11 10:29:16 :Code 0 at 110 Text: Msg start reactivating Port
Msg 06.10.11 10:29:16 :Code 2 at 112 Text: Error reopening Port
Msg 06.10.11 10:29:33 :Code 0 at 110 Text: Msg start reactivating Port
Msg 06.10.11 10:30:00 :ComEvent48
Msg 06.10.11 10:30:06 :ComEvent48
Msg 06.10.11 10:30:07 :ComEvent48
Msg 06.10.11 10:30:13 :ComEvent48
Msg 06.10.11 10:30:19 :ComEvent48
Hat er schon connectet? hat irgendwas geklappt? werde aus den
Weiss jemand wie man die Befehle oder wie man überhaupt contact über seriell ng mit dem gerät am COM 4 aufnimmt und wann ich sehe ob es geklappt hat. Welche demo muss ich dafür öffnen? die Serielladvdemo.dpr?
|
|
|