Serielle Schnitstelle programmieren

  • Java

  • Alter Sack
  • 1364 Aufrufe 2 Antworten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Serielle Schnitstelle programmieren

    Hallo zusammen,

    nach 10 Jahren Abstinenz will ich mal wieder etwas in Pascal programmieren.

    Ich will einen Ascii-Code über die serielle Schnittstelle ausgeben und auf Antwort warten. (Es handelt sich hierbei um einen Schrittmotor-Controller iSMIF-USB.)
    Ich finde gerade meine Pascal-Bücher nicht und kann nicht nachschlagen, wie das denn ging.

    Hat jemand ein Beispielcode wie man die Serielle Schnittstelle konfiguriert und zum Datenaustauch benutzt? Im Internet hab ich keine brauchbare Antwort auf diese Frage gefunden.

    Kann mir jemand helfen.

    Ich verwende Boland-Pascal 7.

    Ich bedanke mich schon mal im Vorraus für eure Mühe.

    Grüße
    Alter Sack
    Leben ist das, was uns zustößt, während wir uns etwas ganz anderes vorgenommen haben. (Henry Miller)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Alter Sack ()

  • Jetzt muss ich auch mal mein letztes Pascal-Wissen zusammenkrazen.

    Ich glaube aber, dass diese Funktionen sehr von dem verwendeten Dialekt abhängen.
    Was ist es denn? Tubo-Pascal? Version?

    Ach ja, das Betriebssystem ist auch noch wichtig, da ab einer bestimmten Version der direkte Zugriff auf Ports nicht mehr geht.
    War das schon bei Win98? Man benötigt also Kerneltreiber.
    Ich hab so was mal geschrieben um ein POCSAC-Modem anzubinden.
    Werde mal danach suchen.

    Langsam fällt es mir wieder ein.
    Es gab damals bei VB6 ein Steuerelement, welches den Zugriff ermöglichte.

    Das hab ich erst mal gefunden:

    Quellcode

    1. function OpenCOMPort: Boolean;
    2. var
    3. DeviceName: array[0..80] of Char;
    4. ComFile: THandle;
    5. begin
    6. { First step is to open the communications device for read/write.
    7. This is achieved using the Win32 'CreateFile' function.
    8. If it fails, the function returns false.
    9. Wir versuchen, COM1 zu öffnen.
    10. Sollte dies fehlschlagen, gibt die Funktion false zurück.
    11. }
    12. StrPCopy(DeviceName, 'COM1:');
    13. ComFile := CreateFile(DeviceName,
    14. GENERIC_READ or GENERIC_WRITE,
    15. 0,
    16. nil,
    17. OPEN_EXISTING,
    18. FILE_ATTRIBUTE_NORMAL,
    19. 0);
    20. if ComFile = INVALID_HANDLE_VALUE then
    21. Result := False
    22. else
    23. Result := True;
    24. end;
    25. function SetupCOMPort: Boolean;
    26. const
    27. RxBufferSize = 256;
    28. TxBufferSize = 256;
    29. var
    30. DCB: TDCB;
    31. Config: string;
    32. CommTimeouts: TCommTimeouts;
    33. begin
    34. { We assume that the setup to configure the setup works fine.
    35. Otherwise the function returns false.
    36. wir gehen davon aus das das Einstellen des COM Ports funktioniert.
    37. sollte dies fehlschlagen wird der Rückgabewert auf "FALSE" gesetzt.
    38. }
    39. Result := True;
    40. if not SetupComm(ComFile, RxBufferSize, TxBufferSize) then
    41. Result := False;
    42. if not GetCommState(ComFile, DCB) then
    43. Result := False;
    44. // define the baudrate, parity,...
    45. // hier die Baudrate, Parität usw. konfigurieren
    46. Config := 'baud=9600 parity=n data=8 stop=1';
    47. if not BuildCommDCB(@Config[1], DCB) then
    48. Result := False;
    49. if not SetCommState(ComFile, DCB) then
    50. Result := False;
    51. with CommTimeouts do
    52. begin
    53. ReadIntervalTimeout := 0;
    54. ReadTotalTimeoutMultiplier := 0;
    55. ReadTotalTimeoutConstant := 1000;
    56. WriteTotalTimeoutMultiplier := 0;
    57. WriteTotalTimeoutConstant := 1000;
    58. end;
    59. if not SetCommTimeouts(ComFile, CommTimeouts) then
    60. Result := False;
    61. end;
    62. {
    63. The following is an example of using the 'WriteFile' function
    64. to write data to the serial port.
    65. Folgendes Beispiel verwendet die 'WriteFile' Funktion, um Daten
    66. auf den seriellen Port zu schreiben.
    67. }
    68. procedure SendText(s: string);
    69. var
    70. BytesWritten: DWORD;
    71. begin
    72. {
    73. Add a word-wrap (#13 + #10) to the string
    74. An den übergebenen String einen Zeilenumbruch (#13 + #10) hängen
    75. }
    76. s := s + #13 + #10;
    77. WriteFile(ComFile, s[1], Length(s), BytesWritten, nil);
    78. end;
    79. {
    80. The following is an example of using the 'ReadFile' function to read
    81. data from the serial port.
    82. Folgendes Beispiel verwendet die 'ReadFile' Funktion, um Daten
    83. vom seriellen Port zu lesen.
    84. }
    85. procedure ReadText: string;
    86. var
    87. d: array[1..80] of Char;
    88. s: string;
    89. BytesRead, i: Integer;
    90. begin
    91. Result := '';
    92. if not ReadFile(ComFile, d, SizeOf(d), BytesRead, nil) then
    93. begin
    94. { Raise an exception }
    95. end;
    96. s := '';
    97. for i := 1 to BytesRead do s := s + d[I];
    98. Result := s;
    99. end;
    100. procedure CloseCOMPort;
    101. begin
    102. // finally close the COM Port!
    103. // nicht vergessen den COM Port wieder zu schliessen!
    104. CloseHandle(ComFile);
    105. end;
    Alles anzeigen


    Sorry wenn ich mir inzwichen schon selbst antworte ... aber das ist ein anderer Gedankengang als oben.

    In der Zeit als Borland Pascal "in" war, konnte man noch einfacher auf Speicerbereiche in Windows zugreifen. Daher gehen die meisten Beispiele direkt auf die Portadressen. Ich habs nicht ausprobiert, aber ich denke das geht nicht mehr.
    Darum meine Idee mit einer DLL. Nun habe ich gegoogelt mit "dll rs232 windows".

    Geek Hideout --> IO.DLL
    MSR mit Word und Excel
    Die ELEXS.DLL
    Serial Communications in Win32
    Serial Comms with Windows API by Riaan Aspeling

    Hab die Links nach Relevanz für Pascal sortiert (nach bestem Wissen und Gewissen).
    Es ist besser zu schweigen und für einen Narren gehalten zu werden, als zu reden und damit alle Zweifel zu beseitigen ...

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von Broken Sword () aus folgendem Grund: wasa wasa wasa... Doppelpost und son...