Skocz do zawartości

[Delphi] Program do wyświetlania danych - debugowanie robota


Pomocna odpowiedź

Witajcie.

Postanowiłem sobie napisać w Delphi program do odbioru danych, które wysyła uC po kablu do RS-232. Mój problem polega na tym, że nic mi się nie wyświetla w "Memo1", a powinno się wyświetlać to co uC wysyła. Na terminalu Putty widać wysyłane dane. Pewnie spytacie czemu Delphi? Otóż na razie wolę sobie to opanować w tym języku, a może później w Visual C# 2010 Express.

Screen programu w Delphi:

Kod programu w Delphi:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, Buttons, CPort;

type
 TForm1 = class(TForm)
   GroupBox1: TGroupBox;
   GroupBox2: TGroupBox;
   bUstawienie: TButton;
   bPolacz_Rozlacz: TButton;
   GroupBox3: TGroupBox;
   lKp: TLabel;
   lKd: TLabel;
   lV_doc: TLabel;
   lV_min: TLabel;
   lV_max: TLabel;
   lZmiana: TLabel;
   lUchyb_regulacji: TLabel;
   lPredkosc_lewego_silnika: TLabel;
   lPredkosc_prawego_silnika: TLabel;
   GroupBox4: TGroupBox;
   lSuma_wag_z_czujnikow: TLabel;
   lDocelowa_pozycja: TLabel;
   lAktualna_pozycja: TLabel;
   Flaga_linii: TLabel;
   bWyjscie: TBitBtn;
   ComPort1: TComPort;
   Memo1: TMemo;
   Edit1: TEdit;
   procedure bWyjscieClick(Sender: TObject);
   procedure bUstawienieClick(Sender: TObject);
   procedure bPolacz_RozlaczClick(Sender: TObject);
   procedure ComPort1RxChar(Sender: TObject; Count: Integer);
   //procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.bWyjscieClick(Sender: TObject);
begin
 Form1.Close;
end;

//Wyswietlamy opcje ustawien portu COM//
procedure TForm1.bUstawienieClick(Sender: TObject);
begin
 ComPort1.ShowSetupDialog;
end;


procedure TForm1.bPolacz_RozlaczClick(Sender: TObject);
begin
 If ComPort1.Connected Then
 begin
   ComPort1.Close;
   bPolacz_Rozlacz.Caption:= 'Połącz';
 end else begin
   ComPort1.Open;
   bPolacz_Rozlacz.Caption:= 'Rozłącz';
 end;
end;


procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var
 A: String;
begin
 ComPort1.ReadStr(A,Count);
 Memo1.Text:=A;
end;


//procedure TForm1.FormCreate(Sender: TObject);
//begin
//  Memo1.Lines.Clear;
//end;

end.

Kod w Bascom'ie:

$regfile = "m16def.dat"
$crystal = 8000000
$baud = 19200

Dim A As String * 3

A = "abc"

  Do

     Print A
     Waitms 150

  Loop
End

Pozdro!

Link to post
Share on other sites

Dzięki, z tym też działa. Jak się okazało musiałem w ComPort1 - Events: OnRxChar dodać "ComPort1RxChar" i śmiga. Są to moje początki w Delphi i każdemu się może zdarzyć 😃

Teraz tak: Jak wyświetlam w "Memo1" wartość ADC (0 - 1024) to tak czasem "Memo1" nie ogarnia, ale ogólnie wartości wyświetla.

Chciałbym te wartości finalnie wyświetlać w "Label'ach" i tu moje pytanie jak to zrobić? W "Memo1" było, np. tak:

Memo1.Text:=A;
//lub//
Memo1.Lines.Add(A);

a jak będzie w "Label1"?

Link to post
Share on other sites

Tak, to działa. Wyświetla wartość liczbową, ale nie tak ładnie jakbym chciał, tzn. wyświetla się nad "Label1" liczba i pod "Label1", a w środku jest wyświetlana wartość która się zmienia. Tamte skrajne migoczą. Sorki, że takie chaotyczne tłumaczenie, mam nadzieje, że rozumiecie o co mi chodzi.

Później dodam screena.

Link to post
Share on other sites

Czy sprawdzasz, co przyszło, w jakim formacie oraz czy dane są poprawne? Bez tego możesz zapomnieć o wygodnej i stabilnej komunikacji.

Link to post
Share on other sites

ComPort ma w sobie obsługę prostych ramek. Nazwane jest to tam chyba jako osobny komponent jako DataPackages (jeśli dobrze pamiętam).

Nie jest to idealne rozwiązanie, jednak na początek lepsze takie niż żadne.

Link to post
Share on other sites

No tak - takie rozwiązanie jest lepsze niż żadne.

Czy o ten komponent chodzi? "ComDataPacket"

Tylko nasuwa się pytanie z mojej strony - jak to skonfigurować? Wiem, że pytań jest dużo, no ale tak jak mówiłem są to moje pierwsze kroki w Delphi.

Link to post
Share on other sites

Poczytałem na temat komponentu "ComDataPacket" i napisałem kod w Bascom'ie aby wystawiał wartości 0/1 kiedy jeden czujnik będzie na linii, albo na białym tle. Sprawdzałem w terminalu jakie wartości w hex'ie ma 0/1 i wszyło mi tak:

31 0D 0A - 1

30 0D 0A - 0

Z tego co czytałem w komponencie "ComDataPacket" trzeba ustawić rozmiar (Size) i StartString, StopString. Nie wiem dokładnie na czym to polega, liczę na waszą pomoc.

Link to post
Share on other sites

Komponent ten działa prosto i wychwytuje ramki o stałej długości i stały znakach startu i stopu. Aby to działało najprościej musisz wysyłać w Bascomie linijkę:

START200STOP

Gdzie zamiast 200 będzie wstawiana wartość z czujnika, czy czego tam sobie będziesz chciał.

W start string wpiszesz START, w stop string STOP i będzie działało 😉

Link to post
Share on other sites

Ok, dzięki :]

Zacząłem testować i mam problem. W bascomie wysyłam "Pomiar(2)" w taki sposób:

Print Stapomiar(2)sto

Bascom tu wywala błąd: Numeric parametr expexted [sTAPOMIAR(2)] .

Może najpierw wysłać "Sta", później "Pmoiar(2) i na końcu "Sto"?

Czemu "sta" i "sto"? Ponieważ "Start" i "Stop" są zastrzeżone dla Bascom'a, więc musiałęm zmienić.

Tak jak pisałeś w komponencie "ComDataPacket" ustawiłem "StartString" na "sta" i "StopString" na "sto". Rozmiaru (Size) nie ruszałem. W tym komponencie wybrałem "ComPort" czyli swój "ComPort1" (To było w Properties). Teraz w zakładce Events znowu wybieram swój "ComPort1" później mam OnCustomStar/Stop, OnDiscard, OnPacket - tych nie ruszałem.

Dokładnie nie wiem jak mam to odbierać z poziomu Delphi. Mam taką procedurę:

procedure ComDataPacket1Packet(Sender: TObject; const Str: string);
//...
//...
//...
procedure TForm1.ComDataPacket1Packet(Sender: TObject; const Str: string); 
begin

end;

Przy używaniu "ComDataPacket" używam też procedury TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);.

Tak wygląda program w Delphi:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, Buttons, CPort, CPortCtl;

type
 TForm1 = class(TForm)
   GroupBox1: TGroupBox;
   GroupBox2: TGroupBox;
   bUstawienie: TButton;
   bPolacz_Rozlacz: TButton;
   GroupBox3: TGroupBox;
   lKp: TLabel;
   lKd: TLabel;
   lV_doc: TLabel;
   lV_min: TLabel;
   lV_max: TLabel;
   lZmiana: TLabel;
   lUchyb_regulacji: TLabel;
   lPredkosc_lewego_silnika: TLabel;
   lPredkosc_prawego_silnika: TLabel;
   GroupBox4: TGroupBox;
   lSuma_wag_z_czujnikow: TLabel;
   lDocelowa_pozycja: TLabel;
   lAktualna_pozycja: TLabel;
   Flaga_linii: TLabel;
   bWyjscie: TBitBtn;
   ComPort1: TComPort;
   GroupBox5: TGroupBox;
   GroupBox6: TGroupBox;
   Czujnik1: TLabel;
   ADC5: TLabel;
   Czujnik2: TLabel;
   ADC4: TLabel;
   Czujnik3: TLabel;
   ADC3: TLabel;
   Czujnik4: TLabel;
   ADC2: TLabel;
   Czujnik5: TLabel;
   AD1: TLabel;
   Czujnik6: TLabel;
   ADC0: TLabel;
   Czujnik7: TLabel;
   ADC7: TLabel;
   Czujnik8: TLabel;
   ADC6: TLabel;
   Label1: TLabel;
   Label2: TLabel;
   Label3: TLabel;
   Label4: TLabel;
   Label5: TLabel;
   Label6: TLabel;
   Label7: TLabel;
   Label8: TLabel;
   ComDataPacket1: TComDataPacket;
   procedure bWyjscieClick(Sender: TObject);
   procedure bUstawienieClick(Sender: TObject);
   procedure bPolacz_RozlaczClick(Sender: TObject);
   procedure ComPort1RxChar(Sender: TObject; Count: Integer);
   procedure ComDataPacket1Packet(Sender: TObject; const Str: string);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.bWyjscieClick(Sender: TObject);
begin
 Form1.Close;
end;

//Wyswietlamy opcje ustawien portu COM//
procedure TForm1.bUstawienieClick(Sender: TObject);
begin
 ComPort1.ShowSetupDialog;
end;


procedure TForm1.bPolacz_RozlaczClick(Sender: TObject);
begin
 If ComPort1.Connected Then
 begin
   ComPort1.Close;
   bPolacz_Rozlacz.Caption:= 'Połącz';
   ShowMessage('Rozłączono');
 end else begin
   ComPort1.Open;
   bPolacz_Rozlacz.Caption:= 'Rozłącz';
   ShowMessage('Połączono');
 end;
end;


procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var
 Str: String;
begin
 ComPort1.ReadStr(Str,Count);
 //Memo1.Text:=Str;
 //Memo1.Lines.Add(Str);
 //Label2.Caption:=Str;
end;

procedure TForm1.ComDataPacket1Packet(Sender: TObject; const Str: string);
begin
 Label2.Caption:=Str;
end;

end.
Link to post
Share on other sites
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.