Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Odczyt danych z AVR przez RS232 Delphi

lolek50 20 Aug 2009 14:39 4596 7
  • #1
    lolek50
    Level 10  
    Witam!

    Mam problem zodczytem danych z RS - wykorzystuje komponent Tcomport, procedury odczytu znalazłem na elektrodzie, jednak mimo wszytko nic mi nie działa.
    AVR wysyła temperaturę w formacie np. 23.4 (string), jeśli korzytam z emulatora BASCOM lub Hyperterminala wszystko jest OK, dane są poprawnie odczytywane, zaś przez załączony poniżej programik Delphi nie ma jakiejkolwiek reakcji, jednz co działa w tym programie to okno ustawień com'a.
    Co jest nie tak? może konieczne są jakieś ustawienia w kontrolce Tcomport? lub coś innego czego nie zauważam? prosze o pomoc.



    Code:
    unit Unit1;
    

    interface

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

    type
      TForm1 = class(TForm)
        BitBtn1: TBitBtn;
        Button1: TButton ;
        ComPort1: TComPort;
        Memo1: TMemo;
        ComLed1: TComLed;
        ComLed2: TComLed;
        procedure BitBtn1Click(Sender: TObject);
        procedure ComPortRxChar(Sender: TObject; Count: Integer);
        procedure Button1Click(Sender: TObject);



      private
        { Private declarations }
      public
        { Public declarations }
      end;

    var
      Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.BitBtn1Click(Sender: TObject);
    begin
      if ComPort1.Connected then
      begin
        ComPort1.Close;
      end else begin
        ComPort1.Open;
    end;
    end;

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


    procedure TForm1.Button1Click(Sender: TObject);
    begin
     ComPort1.ShowSetupDialog;
    end;


    end.
  • #2
    scotch
    Level 28  
    Trchę niejasna procedura:
    procedure TForm1.BitBtn1Click(Sender: TObject);
    begin
    if ComPort1.Connected then - jeśli podłączony
    begin
    ComPort1.Close; - zamknięcie poru
    end else begin
    ComPort1.Open; - jeśli nie podłączony otwarcie portu
    end;
    end;

    Może tutaj błąd , chyba że się mylę .
  • #3
    User removed account
    User removed account  
  • #4
    scotch
    Level 28  
    albertb słusznie zwróciłeś na to uwagę , moje przeoczenie :cry: . Jest obsługa 2 przysisków
    procedure TForm1.BitBtn1Click(Sender: TObject); - ten na którego zwróciłem uwagę we wcześniejszym poście oraz
    procedure TForm1.Button1Click(Sender: TObject); -setup portu .
    Natomiast procedura: procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer); nie jest nigdzie wywoływana . Mniemam że odpowiada za zczytywanie portu .Być może dlatego program nie działa
  • #5
    User removed account
    User removed account  
  • #6
    lolek50
    Level 10  
    Dzięki Oloam dopiero zaczynam i rzeczywiście tego nie zrobiłem teraz chdzi wszystko wyśmienicie.

    Potrzebowałbym jeszcze podpowiedzi jak z tego Stringa wyciągnąć liczbę tak abym ją mógł wyswietlić w TLabel albo TEdit, docelowo chcę te wartości zmaieścić na wykresie - ma to być forma rejestratora temperatury.

    Pozdr.
    Lolek50
  • #7
    superb-s1
    Level 11  
    witam mam też też ten sam problem co kolega. od razu mówię w delphi jestem zielony kiedyś coś tam się przewinęło w szkole czy ktoś z was mógł by mi powiedzieć
    Quote:
    Procedura ComPortRxChar znajduje się w zdarzeniach comport i musi być powiązana z komponentem
    jak to zrobić gdzie odpisać żeby działało
  • #8
    smaka_mike
    Level 1  
    Nie wiem co macie źle w swoich projektach. Wstawię swój kod, który działa na 100 %.
    Jedno co mi się w nim nie podoba to jak odczytuje dane na przykład ze skanera kodów kreskowych to wstawia mi do Memo 8 znaków, dalsze są w kolejnej linii. Próbowałem to rozwiązać ale na razie bez rezultatu.

    Udało mi się rozwiązać problem wstawiania tylko 8 znaków w 1 linii - problemem była wielkość buforu od COM-a. Rozwiązanie okazało się banalne - wystarczyło dorzucić timer. W najbliższym czasie uaktualnię kod. Interwał timera - 100

    Nie jestem doświadczonym programistą więc słowa krytyki proszę zostawić dla siebie.

    Jeśli kogoś interesuje przesłanie projektu na maila to proszę pisać
    smaka(malpa)o2.pl

    W projekcie są dwa unity
    1 - Port1
    2 - ASCII

    Z innych rzeczy, które trzeba wiedzieć to to, że w unicie ASCII jest tabela TStringGrid, ilość kolumn - 5, ilość wierszy - 128.

    Quote:
    unit Port1;



    interface



    uses

    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

    Dialogs, StdCtrls, Buttons, CPort, CPortCtl, Menus, ExtCtrls;



    type

    TForm1 = class(TForm)

    Memo1: TMemo;

    Settings: TButton;

    SpeedButtonOpen: TSpeedButton;

    SpeedButtonClose: TSpeedButton;

    ComPort: TComPort;

    Button1: TButton;

    Button2: TButton;

    MainMenu1: TMainMenu;

    About1: TMenuItem;

    Info1: TMenuItem;

    Timer1: TTimer;

    procedure SpeedButtonOpenClick(Sender: TObject);

    procedure SpeedButtonCloseClick(Sender: TObject);

    procedure SettingsClick(Sender: TObject);

    procedure ComPortRxChar(Sender: TObject; Count: Integer);

    procedure FormCreate(Sender: TObject);

    procedure Button1Click(Sender: TObject);

    procedure FormClose(Sender: TObject; var Action: TCloseAction);

    procedure Button2Click(Sender: TObject);

    procedure Info1Click(Sender: TObject);

    procedure Timer1Timer(Sender: TObject);

    private

    { Private declarations }

    public

    { Public declarations }

    end;



    var

    Form1: TForm1;









    implementation





    uses

    ASCII, About;

    {$R *.dfm}



    const

    Flag_EoF = $0020;



    var

    Str_in : String;



    //Check if Char is Hex

    function isHex(str: ShortString): Boolean;

    begin

    if (ord(str[1])<20) or (ord(str[1])>126) then

    result:=TRUE

    else

    result:=FALSE;

    end;

    //***************************************



    //Conversion hex to str

    function hex2str(hex:string):string;

    var

    i:integer;

    s:string;



    begin

    s:='';

    i:=1;

    while i<=length(hex) do

    begin

    s:=s+chr(strtoint('$'+copy(hex,i,2)));

    i:=i+2;

    end;

    result:=s;

    end;

    //***************************************



    //Return symbol of Hex

    function returnPref_Suf(str: ShortString; pref_suf: Integer): Shortstring;

    begin

    case ord(str[1]) of

    0 : result:= '[NUL]';

    1 : result:= '[SOH]';

    2 : result:= '[STX]';

    3 : result:= '[ETX]';

    4 : result:= '[EOT]';

    5 : result:= '[ENQ]';

    6 : result:= '[ACK]';

    7 : result:= '[BEL]';

    8 : result:= '[BS]';

    9 : result:= '[TAB]';

    10 : result:= '[LF]';

    11 : result:= '[VT]';

    12 : result:= '[FF]';

    13 : result:= '[CR]';

    14 : result:= '[SO]';

    15 : result:= '[SI]';

    16 : result:= '[DLE]';

    17 : result:= '[DC1]';

    18 : result:= '[DC2]';

    19 : result:= '[DC3]';

    20 : result:= '[DC4]';

    21 : result:= '[NAK]';

    22 : result:= '[SYN]';

    23 : result:= '[ETB]';

    24 : result:= '[CAN]';

    25 : result:= '[EM]';

    else

    if pref_suf=1 then

    result:= '[Prefix = (' + IntToHex(ord(str[1]),2) + ')Hex]'

    else

    result:= '[Sufix (' + IntToHex(ord(str[1]),2) + ')Hex]'



    end;

    end;

    //***************************************







    procedure TForm1.SpeedButtonOpenClick(Sender: TObject);

    begin

    ComPort.Open;

    SpeedButtonOpen.Down:=TRUE;

    SpeedButtonOpen.Caption:='Opened';

    SpeedButtonClose.Caption:='Close';

    Settings.Enabled:= FALSE;

    end;







    procedure TForm1.SpeedButtonCloseClick(Sender: TObject);

    begin

    ComPort.Close;

    SpeedButtonClose.Down:=TRUE;

    SpeedButtonOpen.Caption:='Open';

    SpeedButtonClose.Caption:='Closed';

    Settings.Enabled:= TRUE;

    end;



    procedure TForm1.SettingsClick(Sender: TObject);

    begin

    ComPort.ShowSetupDialog;

    end;



    procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);

    var

    Str,Str_p: String;

    i, pref_suf: Integer;



    begin

    Timer1.Enabled := False;



    ComPort.ReadStr(Str, Count);



    Str_p:='';

    pref_suf:=1;

    for i:=1 to length(Str) do

    begin

    if isHex(Str[i]) then

    begin

    Str_p:=Str_p + returnPref_Suf(Str[i],pref_suf);

    pref_suf:=2;

    end

    else

    Str_p:=Str_p + Str[i];

    end;



    Str_in := Str_in + Str_p;



    Timer1.Enabled := True;



    end;



    procedure TForm1.FormCreate(Sender: TObject);

    begin

    Memo1.Lines.Clear;

    Str_in := '';

    end;



    procedure TForm1.Button1Click(Sender: TObject);

    begin

    Memo1.Lines.Clear;

    end;



    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

    begin

    if ComPort.Connected then

    ComPort.Close;

    end;



    procedure TForm1.Button2Click(Sender: TObject);

    begin

    ASCII.Form2.Show;

    end;



    procedure TForm1.Info1Click(Sender: TObject);

    begin

    About.Form3.Show;

    end;



    procedure TForm1.Timer1Timer(Sender: TObject);
    //interval = 100
    begin

    Memo1.Text := Memo1.Text + Str_in + #13#10;

    Str_in := '';

    Timer1.Enabled := False;

    end;



    end.



    Quote:
    unit ASCII;



    interface



    uses

    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

    Dialogs, Grids;



    type

    TForm2 = class(TForm)

    Tabela: TStringGrid;

    procedure FormCreate(Sender: TObject);

    procedure TabelaDrawCell(Sender: TObject; ACol, ARow: Integer;

    Rect: TRect; State: TGridDrawState);

    private

    { Private declarations }

    public

    { Public declarations }

    end;



    var

    Form2: TForm2;



    implementation



    {$R *.dfm}





    //Konwersja int na oct

    function int2oct(int:int64):string;

    var

    strtemp:string;

    begin

    if int=0 then

    result:='0'

    else

    begin

    while int>0 do

    begin

    insert(inttostr(int mod 8 ),strtemp,1);

    int:= int div 8;

    end;

    result:=(strtemp);

    end;

    end;



    //**************************************



    //Konwersja hex to str

    function hex2str(hex:string):string;

    var

    i:integer;

    s:string;



    begin

    s:='';

    i:=1;

    while i<=length(hex) do

    begin

    s:=s+chr(strtoint('$'+copy(hex,i,2)));

    i:=i+2;

    end;

    result:=s;

    end;

    //**************************************



    //**************************************

    procedure fill(var s: TStringGrid);

    var

    x: Integer;



    begin

    with s do

    begin

    for x:=1 to (s.RowCount-1) do

    begin

    Cells[0,x]:= IntToStr(x-1);

    Cells[1,x]:= IntToHex((x-1),2);

    Cells[2,x]:= int2oct(x-1);

    if ((x>32) and (x<=127)) then

    Cells[3,x]:=hex2str(Cells[1,x]);

    end;

    end;

    end;

    //***************************************



    procedure TForm2.FormCreate(Sender: TObject);

    begin

    Tabela.Cells[0,0]:= 'Dec';

    Tabela.Cells[1,0]:= 'Hex';

    Tabela.Cells[2,0]:= 'Oct';

    Tabela.Cells[3,0]:= 'Char';

    Tabela.Cells[4,0]:= 'Comment';

    fill(Tabela);



    //Comments

    Tabela.Cells[3,1]:= 'NUL';

    Tabela.Cells[4,1]:= '(null)';

    Tabela.Cells[3,2]:= 'SOH';

    Tabela.Cells[4,2]:= '(start of heading)';

    Tabela.Cells[3,3]:= 'STX';

    Tabela.Cells[4,3]:= '(start of text)';

    Tabela.Cells[3,4]:= 'ETX';

    Tabela.Cells[4,4]:= '(end of text)';

    Tabela.Cells[3,5]:= 'EOT';

    Tabela.Cells[4,5]:= '(end of transmistion)';

    Tabela.Cells[3,6]:= 'ENQ';

    Tabela.Cells[4,6]:= '(enquiry)';

    Tabela.Cells[3,7]:= 'ACK';

    Tabela.Cells[4,7]:= '(acknowledge)';

    Tabela.Cells[3,8]:= 'BEL';

    Tabela.Cells[4,8]:= '(bell)';

    Tabela.Cells[3,9]:= 'BS';

    Tabela.Cells[4,9]:= '(backspace)';

    Tabela.Cells[3,10]:= 'TAB';

    Tabela.Cells[4,10]:= '(horizontal tab)';

    Tabela.Cells[3,11]:= 'LF';

    Tabela.Cells[4,11]:= '(NL line feed, new line)';

    Tabela.Cells[3,12]:= 'VT';

    Tabela.Cells[4,12]:= '(vertical tab)';

    Tabela.Cells[3,13]:= 'FF';

    Tabela.Cells[4,13]:= '(NP form feed, new page)';

    Tabela.Cells[3,14]:= 'CR';

    Tabela.Cells[4,14]:= '(carriage return)';

    Tabela.Cells[3,15]:= 'SO';

    Tabela.Cells[4,15]:= '(shift out)';

    Tabela.Cells[3,16]:= 'SI';

    Tabela.Cells[4,16]:= '(shift in)';

    Tabela.Cells[3,17]:= 'DLE';

    Tabela.Cells[4,17]:= '(data link escape)';

    Tabela.Cells[3,18]:= 'DC1';

    Tabela.Cells[4,18]:= '(device control 1)';

    Tabela.Cells[3,19]:= 'DC2';

    Tabela.Cells[4,19]:= '(device control 2)';

    Tabela.Cells[3,20]:= 'DC3';

    Tabela.Cells[4,20]:= '(device control 3)';

    Tabela.Cells[3,21]:= 'DC 4';

    Tabela.Cells[4,21]:= '(device control 4)';

    Tabela.Cells[3,22]:= 'NAK';

    Tabela.Cells[4,22]:= '(negative acknowledge)';

    Tabela.Cells[3,23]:= 'SYN';

    Tabela.Cells[4,23]:= '(synchronous idle)';

    Tabela.Cells[3,24]:= 'ETB';

    Tabela.Cells[4,24]:= '(end of trans. block)';

    Tabela.Cells[3,25]:= 'CAN';

    Tabela.Cells[4,25]:= '(cancel)';

    Tabela.Cells[3,26]:= 'EM';

    Tabela.Cells[4,26]:= '(end of medium)';

    Tabela.Cells[3,27]:= 'SUB';

    Tabela.Cells[4,27]:= '(substitute)';

    Tabela.Cells[3,28]:= 'ESC';

    Tabela.Cells[4,28]:= '(escape)';

    Tabela.Cells[3,29]:= 'FS';

    Tabela.Cells[4,29]:= '(file separator)';

    Tabela.Cells[3,30]:= 'GS';

    Tabela.Cells[4,30]:= '(group separator)';

    Tabela.Cells[3,31]:= 'RS';

    Tabela.Cells[4,31]:= '(record separator)';

    Tabela.Cells[3,32]:= 'US';

    Tabela.Cells[4,32]:= '(unit separator)';

    Tabela.Cells[3,33]:= 'Space';

    //Tabela.Cells[3,127]:= 'DEL';

    end;

    procedure TForm2.TabelaDrawCell(Sender: TObject; ACol, ARow: Integer;

    Rect: TRect; State: TGridDrawState);

    var

    s: String;



    begin

    if ((ACol=3) and (ARow>0)) then

    begin

    Tabela.Canvas.Font.Color:=clRed;



    //do kolorowania tla

    //Tabela.Canvas.Brush.Color:= clRed;

    //Tabela.Canvas.FillRect(Rect);

    s:= Tabela.Cells[Acol,ARow];

    Tabela.Canvas.TextOut(Rect.Left+2,Rect.Top+2,s);

    end;

    end;



    end.