AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi serielle schnittstelle Ich versteh nur bahnhof
Thema durchsuchen
Ansicht
Themen-Optionen

serielle schnittstelle Ich versteh nur bahnhof

Ein Thema von snow · begonnen am 21. Aug 2007 · letzter Beitrag vom 22. Aug 2007
Antwort Antwort
Seite 2 von 3     12 3      
snow

Registriert seit: 28. Jun 2007
277 Beiträge
 
#11

Re: serielle schnittstelle Ich versteh nur bahnhof

  Alt 21. Aug 2007, 20:27
Zitat:
Ich schätze das du die CTS Leitung nur abfragen willst/musst um zu wissen wann du wieder was senden darfst. Clear to send imho.
Wenns das ist mach dir da keine Sorgen das macht Windows/Linux theoretisch schon allein. Neutral


ADD: schau mal bei den schweizern swissdelphicenter.ch da gibts genau die Codeschnippsel die du brauch
nein leider muss ich die cts leitung öfters mal abfragen, da das daran angeschlossene Interface bei einem kurzschluss auf der Modellbahn die CTS leitung aktiviert um nicht von daten überschwemmt zu werden und damit der pc weis wann ein not-halt ausgelöst wurde.

MfG snow
  Mit Zitat antworten Zitat
snow

Registriert seit: 28. Jun 2007
277 Beiträge
 
#12

Re: serielle schnittstelle Ich versteh nur bahnhof

  Alt 21. Aug 2007, 20:43
Sorry das ich hier jetzt ein bissel was reintexte aber anders gehts net

Delphi-Quellcode:
function OpenCOMPort: Boolean;
var
  DeviceName: array[0..80] of Char;
  ComFile: THandle;
begin
   { First step is to open the communications device for read/write.
    This is achieved using the Win32 'CreateFile' function.
    If it fails, the function returns false.

    Wir versuchen, COM1 zu öffnen.
    Sollte dies fehlschlagen, gibt die Funktion false zurück.
   }

  StrPCopy(DeviceName, 'COM1:');

  ComFile := CreateFile(DeviceName,
    GENERIC_READ or GENERIC_WRITE,
    0,
    nil,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    0);

  if ComFile = INVALID_HANDLE_VALUE then
    Result := False
  else
    Result := True;
end;


function SetupCOMPort: Boolean;
const
  RxBufferSize = 256;
  TxBufferSize = 256;
var
  DCB: TDCB;
  Config: string;
  CommTimeouts: TCommTimeouts;
begin
   { We assume that the setup to configure the setup works fine.
    Otherwise the function returns false.

    wir gehen davon aus das das Einstellen des COM Ports funktioniert.
    sollte dies fehlschlagen wird der Rückgabewert auf "FALSE" gesetzt.
   }


  Result := True;

  if not SetupComm(ComFile, RxBufferSize, TxBufferSize) then
    Result := False;

  if not GetCommState(ComFile, DCB) then
    Result := False;

  // define the baudrate, parity,...
  // hier die Baudrate, Parität usw. konfigurieren
   
  Config := 'baud=9600 parity=n data=8 stop=1';

  if not BuildCommDCB(@Config[1], DCB) then
    Result := False;

  if not SetCommState(ComFile, DCB) then
    Result := False;

  with CommTimeouts do
  begin
    ReadIntervalTimeout := 0;
    ReadTotalTimeoutMultiplier := 0;
    ReadTotalTimeoutConstant := 1000;
    WriteTotalTimeoutMultiplier := 0;
    WriteTotalTimeoutConstant := 1000;
  end;

  if not SetCommTimeouts(ComFile, CommTimeouts) then
    Result := False;
end;


{
  The following is an example of using the 'WriteFile' function
  to write data to the serial port.

  Folgendes Beispiel verwendet die 'WriteFile' Funktion, um Daten
  auf den seriellen Port zu schreiben.
}



procedure SendText(s: string);
var
  BytesWritten: DWORD;
begin
   {
    Add a word-wrap (#13 + #10) to the string

    An den übergebenen String einen Zeilenumbruch (#13 + #10) hängen
   }

  s := s + #13 + #10;
  WriteFile(ComFile, s[1], Length(s), BytesWritten, nil);
end;


{
  The following is an example of using the 'ReadFile' function to read
  data from the serial port.
 
  Folgendes Beispiel verwendet die 'ReadFile' Funktion, um Daten
  vom seriellen Port zu lesen.
}



procedure ReadText: string;
var
  d: array[1..80] of Char;
  s: string;
  BytesRead, i: Integer;
begin
  Result := '';
  if not ReadFile(ComFile, d, SizeOf(d), BytesRead, nil) then
  begin
    { Raise an exception }
  end;
  s := '';
  for i := 1 to BytesRead do s := s + d[I];
  Result := s;
end;


procedure CloseCOMPort;
begin
  // finally close the COM Port!
  // nicht vergessen den COM Port wieder zu schliessen!
  CloseHandle(ComFile);
end;

Das hab ich gefunden. Damit sollte es doch auch ohne eine komponeten gehen oder?

Doch irgenwas fehlt da noch. do der ganze anfang xD


ich schau mal was ich so hinkriege
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#13

Re: serielle schnittstelle Ich versteh nur bahnhof

  Alt 22. Aug 2007, 02:36
Zitat von snow:
Sorry das ich hier jetzt ein bissel was reintexte aber anders gehts net

....
ich schau mal was ich so hinkriege
Hallo snow,

das sieht schon ganz vernünftig aus. Um CTS zu überprüfen, kannst du GetCommModemStatus verwenden, ist auch ganz einfach.

Um die Theoretiker zufriedenzustellen, kann man die Einzel-Routinen auch in eine Comport-Klasse packen, das ist eben das, was die meisten freien und bezahlten COMx-Komponenten tun, mehr oder weniger universell und damit auch mehr oder weniger komplex.

Kompliziert wird es erst, wenn du aus Performancegründen asynchron und/oder mit Threads arbeiten must - die von dir angeführten Routinen blockieren den Programm-Ablauf, bis Senden/Empfang abgeschlossen sind. Bei kurzen Datensätzen und funktionierender Verbindung merkst du das wahrscheinlich garnicht.

Ich schreibe kommerzielle Software und verwende zugekaufte Komponenten daher nur im äussersten Notfall. Bisher habe ich mir für serielle Verbindungen immer eigene Klassen oder Komponenten erstellt; da oft nur ein Bruchteil der Funktionen gebraucht wird, sind die oft recht einfach. Technisch sind sie natürlich so gut wie jede gekaufte Software auch.

Gruss Reinhard
  Mit Zitat antworten Zitat
christian_u

Registriert seit: 13. Nov 2006
126 Beiträge
 
#14

Re: serielle schnittstelle Ich versteh nur bahnhof

  Alt 22. Aug 2007, 13:33
Wiso nimmst du eigentlich nicht einfach wie ich es vorgeschlagen hatte (Im Lazarusforum) Synapse dort hast du das mit ein paar zeilen Code erledigt und es ist auch noch Plattformunabhängig. Statt dessen schlägst du dich mit der WinAPI rum ? In wie vielen Foren hast du die Frage denn noch gestellt ?
  Mit Zitat antworten Zitat
snow

Registriert seit: 28. Jun 2007
277 Beiträge
 
#15

Re: serielle schnittstelle Ich versteh nur bahnhof

  Alt 22. Aug 2007, 16:20
Hallo Ich hab mir synapse runtergeladen und entzipt. Doch jetzt hab ich 39 dateien auf dem rechner. doch was nun???

Wie kreig ich die dinger zum funktionieren????. Was muss ich wie wo einbinden. (mal ne ganz dumme frage muss ich synapse im quelltext in den uses teil reinschreiben oder muss ich bei lazarus irgendwas dazuinstallieren????)

Brauch ich alle 39 Dateien??? oder reicht ein teil.

MfG snow
  Mit Zitat antworten Zitat
christian_u

Registriert seit: 13. Nov 2006
126 Beiträge
 
#16

Re: serielle schnittstelle Ich versteh nur bahnhof

  Alt 22. Aug 2007, 17:11
Drauf hab ich dir im lazarusforum schon geantwortet gehabt und du hast danach auch schon geantwortet deshalb bin ich wohl davon ausgegangen das du meine antworten liest, wie dumm von mir.

Kopier die Synaser.pas in dein projektverzeichnis, schreib SynaSer in deine Uses Klausel und verwende den beispielcode den ich dir im lazarusforum gepostet habe und schon machst du eine ausgabe mit der Seriellen Schnittstelle. Ich weiss nicht mehr genau wie die Konstante für 2 Stopbits war, SB2 glaub ich das müsstest du in der Dokumentation die auch im lazarusforum schon verlinkt ist nachschlagen.
  Mit Zitat antworten Zitat
snow

Registriert seit: 28. Jun 2007
277 Beiträge
 
#17

Re: serielle schnittstelle Ich versteh nur bahnhof

  Alt 22. Aug 2007, 17:17
Hab ich doch gelesen doch ich wusste net was das projektverzeichniss ist.

Aber theo hat mir ja jetzt geholfen

snow
  Mit Zitat antworten Zitat
snow

Registriert seit: 28. Jun 2007
277 Beiträge
 
#18

Re: serielle schnittstelle Ich versteh nur bahnhof

  Alt 22. Aug 2007, 17:27
So hab jetzt alles so gemacht wie es sein sollte doch........


Delphi-Quellcode:
unit test;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, SynaSer,
  Buttons;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
ser:=TBlockserial.Create;
  try
    ser.Connect('COM1');
    ser.Config(2400,8,'N',0,false,false);
    ser.SendString(IntToStr(14)+';'+IntToStr(06)+';')
  finally
    ser.Free;
  end;

end;

initialization
  {$I test.lrs}

end.

Zitat:
test.pas(35,1) Error: Identifier not found "ser"
test.pas(37,5) Error: Identifier not found "ser"
test.pas(37,16) Error: Illegal expression
test.pas(37,16) Fatal: Syntax error, "EXCEPT" expected but "(" found
schon wieder ein fehler. wie soll ich den diesmal beheben?
  Mit Zitat antworten Zitat
christian_u

Registriert seit: 13. Nov 2006
126 Beiträge
 
#19

Re: serielle schnittstelle Ich versteh nur bahnhof

  Alt 22. Aug 2007, 17:30
Ja, ser ist ja auch nicht deklariert. Aber auch das kann Lazarus für dich machen setz einfach den Cursor vor oder in das erste vorkommen von ser und drück Strg+Umschalt+C.

Mit "Projekt verzeichnis" meinte ich das "Verzeichnis" deines "Projektes"...

Dann brauchst du nämlich den Pfad nicht in den Compilereinstellungen hinzufügen.
  Mit Zitat antworten Zitat
snow

Registriert seit: 28. Jun 2007
277 Beiträge
 
#20

Re: serielle schnittstelle Ich versteh nur bahnhof

  Alt 22. Aug 2007, 18:15
So es lässt sich jetzt starten.....

hab auch herausgefunden wie man 2 stopbits einschaltet

aber:

es wird einfach nix gesendet

Woran kann das den liegen?? eine andere software schafft die komunikation zum interface.... also hardwaremäßig alles ok.


Delphi-Quellcode:
ser.Connect('COM1');
    ser.Config(2400,8,'N',2,false,false);
    ser.SendString(IntToStr(12)+';'+IntToStr(18)+';')
so wie ich das hier verstehe wird als string gesendet. aber das interface soll Dezimal verstehen(eigendlich auch string und binär aber ich hab sonst keine idee woran das liegen kann.

snow
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz