Jak wysłać string np '1' do portu com w Lazarusie?

0

Witam
Chciałbym napisać program do sterowania przekaźnikami. Nie ma zbyt czasu na lutowanie wiec wybrałem gotowe rozwiązanie, AVT925 KARTA PRZEKAŹNIKÓW NA USB.

Płytka z przekaźnikami jest dostępna na allegro z programem pod delphi.

Kawałki kodu programu z delphi

 
type   
 TForm3 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    SerialPortNG1: TSerialPortNG;

procedure TForm3.Button2Click(Sender: TObject);
begin
SerialPortNG1.SendString('1') ;
end;

procedure TForm3.Button3Click(Sender: TObject);
begin
SerialPortNG1.SendString('0') ;
end;
 

Jak wysłać string np '1' do portu com przez lazarus ?
Pobrałem i zainstalowałem lazSerial ale nie wiem czy można to wykonać za pomocą tego komponentu.

A może polecicie mi coś innego do programowanie przekaźników za pomocą lazarusa i windowsa 7 x64. Zaznaczam że nie możne być to LPT!

0

Otwierasz plik o nazwie "COM" i normalnie do niego piszesz i ewentualnie czytasz.

0

Możesz mnie bardziej naprowadzić jakiego komponentu mam użyć.
Jak ustawić parametry połączenia portu?

0

Nie
Nie zakupiłem jeszcze tego kontrolera

Czy chodziło ci o coś takiego ?

 
FPort:=CreateFile (pchar('COM1'),
                    GENERIC_READ or GENERIC_WRITE,0,NIl,
                    OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); 
1

Nie:

Plik:=TFileStream.Create('com1',fmOpenWrite);
0

Wielkie dzięki za podpowiedz prawie wszystko działa.

var
   Plik: TFileStream;

begin

    Plik:=TFileStream.Create('Com1',fmOpenWrite);
    Plik.WriteAnsiString('1');
    plik.Free;

end;  

Program nie do końca działa poprawnie wysyła 1 1 1 1 po naciśnięciu przycisku, a powinien robić 1111111.
Dlaczego wysyła tą jedynkę ze spacją ?

użyłem komponentu lazserial

 begin
  Lazserial1.Open;
  Lazserial1.WriteData('1');
end; 

Teraz wszystko działa jak powinno. Wysyła same jedynki bez spacji.

Z czystej ciekawości chciałbym się dowiedzieć dlaczego w pierwszym przypadku wysyłał jedynkę ze spacją?

0

WriteAnsiString wg. dokumentacji zapisuje string ansi poprzedzony 4 bajtowym rozmiarem to raczej nie są spacje tylko zera binarne.
Zamiast tego możesz użyć metody Write, ale nie wiem co chcesz osiągnąć i co ma konkretnie być wysłane sam pojedynczy bajt ASCII reprezentujący '1' czy napis zakończony nullterminatorem

0

chcę osiągnąć coś takiego

 SerialPortNG1.SendString('1') ;

tylko pod lazarusem

1
var Plik: TFileStream;
begin
    Plik:=TFileStream.Create('Com1',fmOpenWrite);
    Plik.WriteByte(Ord('1'));
    Plik.WriteAnsiString('ala ma kota');
    plik.Free;
end;

Nie musisz ciągle otwierać/zamykać pliku. Otwórz tylko raz na starcie.

1

Nie znam tego komponentu czy biblioteki a dokumentacji nie umiem znaleźć, ale pewnie chodzi ci o coś takiego:

procedure TForm1.Button1Click(Sender: TObject);
var
   Plik: TFileStream;
   s: string;
begin
    s := '123';
    Plik:=TFileStream.Create('xyz',fmOpenWrite);
    Plik.Write(s[1], Length(s)+1);
    plik.Free;   
end;

Zapisuje to 4 bajty w hex: 31 32 33 00 czyli 123 plus nullterminator jeśli terminator nie jest potrzebny to Plik.Write(s[1], Length(s));

0

Wielkie dzięki wszystko działa jak powinno obydwa kody przez was podane działają jak powinny.

1 użytkowników online, w tym zalogowanych: 0, gości: 1