Ok dann werde ich es wohl erst mal mit Delphi probieren und dann später wenn nötig zu einer anderen Programmiersprache greifen.
Weiß jemand wie genau man das mit Delphi machen kann? Oder unter was ich suchen könnte?
Habe mich auch schon ein bisschen umgeschaut und zB dieses Beispiel sieht mir schon ganz gut aus, allerdings will ich das ja auch lernen und nicht nur stumpfsinnig irgend was eintippen und hoffen das es funktioniert o.0
Verstehe noch nicht so ganz was genau da gemacht wird (also sieht mir aus wie port konfigurieren am Anfang, dann Daten versenden und beim schließen wieder port schließen, aber zum Einen kann ich nicht beurteilen ob das so richtig ist in dem Beispiel und ob ich das richtig verstehe )
{*
* Delphi Temperature Logger
* -----------------
* Logs the temperature aquired on An arduino Board using the LM35 Precision
* centigrade temperature sensor connected to Analog Pin 0 thru the serial comm
*
* Created April 03 2009
* copyleft 2009 Roberto Ramirez <beta@thepenguincult.com>
* Full Source code at http://www.thepenguincult.com/proyectos/arduino-delphi-lm35/
*
*}
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, ExtCtrls;
type
TForm1 = class(TForm)
btn_connect: TButton;
StatusBar1: TStatusBar;
lbl_temp: TLabel;
lbl_degree: TLabel;
lbl_celsius: TLabel;
Timer1: TTimer;
ComboBox1: TComboBox;
procedure btn_connectClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
function OpenCOMPort: Boolean;
function SetupCOMPort: Boolean;
procedure SendText(s: string);
function ReadText: string;
procedure CloseCOMPort;
procedure Button1Click(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
private
ComFile: THandle;
DCB: TDCB;
myComPort:String;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//ComPort öffnen mit gewählten Port zuweisen
function TForm1.OpenCOMPort: Boolean;
var
DeviceName: array[0..80] of Char;
begin
StrPCopy(DeviceName, myComPort+':');
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;
//ComPort einrichten
function TForm1.SetupCOMPort: Boolean;
const
RxBufferSize = 256;
TxBufferSize = 256;
var
Config: string;
CommTimeouts: TCommTimeouts;
begin
Result := True;
if not SetupComm(ComFile, RxBufferSize, TxBufferSize) then
Result := False;
if not GetCommState(ComFile, DCB) then
Result := False;
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;
//Text über Comport senden
procedure TForm1.SendText(s: string);
var
BytesWritten: DWORD;
begin
//s := s + #13 + #10;
WriteFile(ComFile, s[1], Length(s), BytesWritten, nil);
end;
//Text vom Comport lesen
function TForm1.ReadText: string;
var
//!!!!
//In unserem Beispiel lesen wir immer 6 Zeichen, da vom Arduino auch 6 Zeichen gesendet werden
//!!!!
d: array[1..6] of Char;
s: string;
BytesRead:cardinal; 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;
//ComPort schliessen
procedure TForm1.CloseCOMPort;
begin
try
if GetCommState(ComFile, DCB) then
CloseHandle(ComFile);
finally
timer1.Enabled:=false;
end;
end;
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
myComPort := Combobox1.text;
statusbar1.Panels[0].Text:='Port in use ' + myComPort;
end;
procedure TForm1.btn_connectClick(Sender: TObject);
begin
if btn_connect.caption = 'Disconnect' then
begin
btn_connect.Caption:='Connect'; // Toggle the caption of Connection Button
combobox1.Enabled := true;;
CloseCOMPort;
statusbar1.Panels[1].Text:='Disconnected'; // Status bar is set to display connection info
lbl_temp.Caption:='0'; // We also reset the temp label to zero
end else begin
btn_connect.Caption:='Disconnect'; // Toggle the caption of Connection Button
combobox1.Enabled := false;
timer1.Enabled:=true;
Opencomport;
SetupComport;
statusbar1.Panels[1].Text:='Connected'; // Status bar is set to display connection info
lbl_temp.Caption:='0';
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
myComPort:= 'COM8';
Combobox1.text := myComPort;
statusbar1.Panels[0].Text:='Port in use ' + myComPort; // Status bar is set to display predefined Port in use at begining of program execution
statusbar1.Panels[1].Text:='Disconnected'
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
buffer: string;
bufferF:double;
TF: TFormatSettings;
begin
//Text vom Comport in String lesen
buffer := readtext;
if Length(buffer) > 0 then
begin
lbl_temp.Caption:=buffer;
TF.DecimalSeparator := '.';
bufferF := StrToFloat(buffer,TF);
if bufferF>25 then
SendText('1')
else
SendText('2');
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
timer1.Enabled:=false;
// ComPort1.Close;
closecomport;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
closecomport;
end;
end.