lazarus obsługa portów COM / wysyłanie SMS

0

Witajcie.
Chciałem napisać programik, który będzie wysyłał SMS. Po długiej lekturze forów stwierdziłem, że najlepiej będzie obsługiwać modem GSM komendami AT.
Następny problem, to obsługa portów COM przez lazarusa. I tu również na forach znalazłem odpowiednie pakiety/komponenty: 5dpo oraz lazserial.

Po podłączeniu starego telefonu do komputera (przez USB) w menadżerze urządzeń pojawił mi się nowy port COM (COM7) oraz modem (COM8). Poprzez putty sprawdziłem, ze mam komunikacje zmodemem (odpowiadał na komendy AT). Skompilowałem przykładowy projekt z 5dpo (sertest)

screenshot-20220717195945.png

uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, SdpoSerial,
  StdCtrls;

type

  { TFMain }

  TFMain = class(TForm)
    BSend: TButton;
    BOpen: TButton;
    BClose: TButton;
    CBDTR: TCheckBox;
    EditSend: TEdit;
    Memo: TMemo;
    Serial: TSdpoSerial;
    procedure BCloseClick(Sender: TObject);
    procedure BOpenClick(Sender: TObject);
    procedure BSendClick(Sender: TObject);
    procedure CBDTRChange(Sender: TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure SerialRxData(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 

var
  FMain: TFMain;

implementation

{ TFMain }

procedure TFMain.FormCreate(Sender: TObject);
begin

end;

procedure TFMain.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  Serial.active := false;
end;

procedure TFMain.FormShow(Sender: TObject);
begin
//  Serial.Active := true;
end;


procedure TFMain.BSendClick(Sender: TObject);
begin
  Serial.WriteData(EditSend.Text);
end;

procedure TFMain.CBDTRChange(Sender: TObject);
begin
  Serial.SetDTR(CBDTR.Checked);
end;

procedure TFMain.BOpenClick(Sender: TObject);
begin
  Serial.Open;
end;

procedure TFMain.BCloseClick(Sender: TObject);
begin
  Serial.Close;
end;

procedure TFMain.SerialRxData(Sender: TObject);
begin
  Memo.Lines.Add(Serial.ReadData);
end;


initialization
  {$I main.lrs}

end.

Ustawiłem parametry portu COM8 dokładnie na takie same jak w putty.
Niestety program nie zadziałał. W polu Memo po prawej stronie okna miały pojawiać się komunikaty zwrotne z modemu (Memo.Lines.Add(Serial.ReadData)), ale niestety albo nie pojawia się nic, albo pojawiają się tylko stringi, które wysyłam. Nie wiem czy moje komendy docierają do modemu i problem jest tylko z czytaniem odpowiedzi, czy komponent w ogóle nie działa
Czy ktoś ma doświadczenie z pakietem 5dpo? I może mi pomóc.

Pozdrawiam Sc0li0sis

1

Ustawiłem parametry portu COM8 dokładnie na takie same jak w putty.

  • Gdzie ustawiłeś te parametry? (nie zaszkodziłby kod źródłowy albo screenshot dla porównania z Putty)
  • Gdy uruchamiasz Twój program, Putty jest zamknięte, c'nie? (aby nie było sytuacji, w której obydwa programy próbują komunikować się z tym samym urządzeniem)
1

putty jest zamknięty, gdyby był otwarty program w lazarusie nie otworzyłby portu.
Ale, w między czasie znalazłem rozwiązanie. Nie uwierzycie po prosty trzeba dodać do stringu z okienka "terminator" #1310.

procedure TFMain.BSendClick(Sender: TObject);
begin
  Serial.WriteData(EditSend.Text + ''#13#10);
end;

I wszystko działa :-) - Wątek do zamknięcia
Pozdrawiam i dziękuję

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.