Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Delphi 7] Problem z odczytem danych z miernika na RS232

uczen_hall 16 Lip 2009 16:01 2692 11
  • #1 16 Lip 2009 16:01
    uczen_hall
    Poziom 9  

    Witam wszystkich

    Na początku chce zaznaczyć, że dopiero zaczynam zabawę z RSem i programowaniem.

    Chce napisać program który odczytywałby sygnał napięciowy (powiedzmy 0-2 VAC) i pokazywał go w formie wykresu. Póki co do wykresu nie doszedłem wiec to zostawmy.

    Troszkę zmodyfikowałem gotowy program znaleziony na necie, dzięki pomocy z innego tematu odpaliłem program, wygląda na to ze wszystko działa, ale gdy podłączę wyjście miernika do 2 pinu na RSie to dostaje przykładowo następujący wynik w okienku memo:

    Code:

    üüüüüüüüü˙üüüüüüüüüüüüüüüüüüüüüüřüüüüüüüüüüüüüüüüřüüü
    üüüüüüüüüřüüüüüüüüüŕŕŕŕŕŕŕŕŕŕŔŕŕŕŕřŕŕŔŔŕŕŕŔŕŔŔŔŕŔŔŕŕŕŔŔţŔŔđŔŕ
    ŔŕŕŕŔŕŕŕŔŕŕŕŔŔŔŕŕŔŔŕŔŕŕŕŔŕŕŕŔŕŕŔŕŔŔŕŕŕŕŕŕŕŕŕŕŕđŕŔŔŕŕŔŕŕŕŔŔŕŔŕŔŕŕ
    ŔŕŕŔŕŕŔŕŕŔŕŔŕŔŕŕŕŔŕŕŔŔŕŕŔŔŕŕŕŕŔŔŔŕŕŕŕŕŕŔŔŔŕŕŕŕŕŕŕŕŔŕŕŕŕŕŕŕŕŕŕŕŔŕŕŕ
    ŕŔŔŔŕŕŕŕŕŕŔŔŕŕŕŔŔŔŕž˙ĎžžţţžĎžžžžžžžžžžžžžžžžŢϞޟžŢźžžžžţĎžžţžžźţ


    Podłączając to wszystko myślałem, ze wynikiem będą jakieś liczby, a tu wyszło ze pojawiły się znaki ASCII. Czy to co otrzymałem wyżej można zamienić na liczby, jeśli tak w jaki sposób? Jeżeli nie to proszę o podpowiedzi co zmienić.

    Nizej zamieszczam kod programu:

    Code:

    unit ComMainForm;

    interface

    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ExtCtrls, CPort, CPortCtl, ActnMan, ActnColorMaps, ComCtrls;

    type
      TForm1 = class(TForm)
        ComPort: TComPort;
        Memo: TMemo;
        Button_Open: TButton;
        Button_Settings: TButton;
        Edit_Data: TEdit;
        Button_Send: TButton;
        NewLine_CB: TCheckBox;
        Panel1: TPanel;
        Bt_Store: TButton;
        Bt_Load: TButton;
        ComLed1: TComLed;
        ComLed2: TComLed;
        ComLed3: TComLed;
        ComLed4: TComLed;
        Label2: TLabel;
        Label3: TLabel;
        Label4: TLabel;
        Label5: TLabel;
        ComLed5: TComLed;
        ComLed6: TComLed;
        Label1: TLabel;
        Label6: TLabel;
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        Edit2: TEdit;
        Button4: TButton;
        RichEdit1: TRichEdit;
        procedure Button_OpenClick(Sender: TObject);
        procedure Button_SettingsClick(Sender: TObject);
        procedure Button_SendClick(Sender: TObject);




        procedure ComPortOpen(Sender: TObject);
        procedure ComPortClose(Sender: TObject);
        procedure ComPortRxChar(Sender: TObject; Count: Integer);
        procedure Bt_LoadClick(Sender: TObject);
        procedure Bt_StoreClick(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure Button4Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;

    var
      Form1: TForm1;

    implementation

    {$R *.DFM}

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

    procedure TForm1.Button_SettingsClick(Sender: TObject);
    begin
      ComPort.ShowSetupDialog;
    end;

    procedure TForm1.Button_SendClick(Sender: TObject);
    var
      Str: String;
    begin
      Str := Edit_Data.Text;
      if NewLine_CB.Checked then
        Str := Str + #13#10;
      ComPort.WriteStr(Str);
    end;

    procedure TForm1.ComPortOpen(Sender: TObject);
    begin
      Button_Open.Caption := 'Close';
    end;

    procedure TForm1.ComPortClose(Sender: TObject);
    begin
      if Button_Open <> nil then
        Button_Open.Caption := 'Open';
    end;

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

    begin
      ComPort.Read(Str, Count);
      //ComPort.ReadStr(Str, Count);

      Memo.Text := Memo.Text + Str;

    end;

    procedure TForm1.Bt_LoadClick(Sender: TObject);
    begin
      ComPort.LoadSettings(stRegistry, 'HKEY_LOCAL_MACHINE\Software\Dejan');
    //  ComPort.LoadSettings(stIniFile, 'e:\Test.ini');
    end;

    procedure TForm1.Bt_StoreClick(Sender: TObject);
    begin
    //  ComPort.StoreSettings(stIniFile, 'e:\Test.ini');
      ComPort.StoreSettings(stRegistry, 'HKEY_LOCAL_MACHINE\Software\Dejan');
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    Application.Terminate;
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    begin
    Memo.Clear;
    Edit_Data.Clear;
    RichEdit1.Clear;
    Edit2.Clear;
    end;

    procedure TForm1.Button3Click(Sender: TObject);
    begin
    Memo.lines.savetofile('D:\dane_z_memo.txt');
    end;



    end.

    0 11
  • #2 16 Lip 2009 18:25
    ekomont
    Poziom 16  

    Dosyć mało informacji. Albo musisz podać typ miernika, albo jeżeli chcesz pomocy to musisz zrobić nastepującą operację: zapisujesz wskazywane napięcie i odpowiadający temu komunikat (ale w kodzie hex bo znaczki mogą w zależności od kodowania się różnić)...mozesz to zrobić np za pomocą programu sermon232 - odpalasz program przed uruchomieniem właściwej komunikacji i zrzut kopiujesz do notatnika w całości.

    Możliwe, że dane sa konwertowane wg normy IEEE754, ale nie mając danych trudno powiedzieć...może być też tak, że masz źle ustawioną ilość bitów danych/stopu i masz przekłamania tekstu

    0
  • #3 16 Lip 2009 21:27
    uczen_hall
    Poziom 9  

    Rzeczywiście miernikiem nazwałem to za szybko, tak naprawdę jest to urządzenie pomiarowe, w którym elementem dającym sygnał wyjściowy jest hallotron, wiec żadnych danych nie podam bo to jest własnej roboty.

    Co do ustawień bitow, to rzeczywiście gdy zmieniałem ich ilość, inne "znaczki" sie pojawiały przy tym samych napięciu, ale wciąż w tym samym stylu co wyżej.

    Sprobuje zastosowac ten program o ktorym piszesz.


    <dodane>
    Zastosowałem program Sermon, oto co otrzymałem:
    [Delphi 7] Problem z odczytem danych z miernika na RS232

    Proszę o wklejanie zdjęć tak jak opisano w temacie: wklejanie zdjęć. - krzychoocpp

    0
  • #4 17 Lip 2009 21:05
    Stepel
    Poziom 20  

    ale jak to podłączasz tylko jeden przewód z wyjscia RS urządzenia do portu w kompie? Tx do Rx ?

    0
  • #5 17 Lip 2009 21:19
    uczen_hall
    Poziom 9  

    Podłączam to w nastepujący sposób:

    [Delphi 7] Problem z odczytem danych z miernika na RS232

    A co myslisz o tych danych w hexach, mozliwe że takie wartości wychodzą?

    Proszę o wklejanie zdjęć tak jak opisano w temacie: wklejanie zdjęć. - krzychoocpp

    0
  • #6 18 Lip 2009 00:35
    Stepel
    Poziom 20  

    tak sobie myślę, czy rs232 w kompie i ten z wyjścia nie powinny mieć wspólnej masy przypadkiem?:) ale to swoją drogą. Drugie pytanie:) to czy dane wysyłane z miernika to na pewno dane w standardzie Rs232 ? Co to w ogóle za miernik?

    0
  • #7 18 Lip 2009 13:16
    uczen_hall
    Poziom 9  

    Miernik własnej roboty :)
    napięcie na wyjściu jest w zakresie 0-2 VAC (przemienne), nie jest w zadnym stardardzie i dlatego pewnie wychodza takie glupoty, ale w takim razie jak to zrobic aby bylo w "standardzie"?

    0
  • Pomocny post
    #8 18 Lip 2009 13:23
    Stepel
    Poziom 20  

    czyli rozumiem, ze wyjściowy sygnał jest analogowy? Standard RS232C sluży do przesyłu danych cyfrowych. Poczytaj najpierw może o tym standardzie. W opisanym przez Ciebie przypadku oczywiście to nie będzie działać ani pokazywać nic sensownego.

    0
  • #9 18 Sie 2009 13:17
    uczen_hall
    Poziom 9  

    Mój problem się trochę wyjaśnił i poszedł o krok dalej. Kupiłem kit do samodzielnego montażu: Przetwornik A/C AVT-562. Podłączyłem całość przez ten przetwornik i działa, pokazuje prawidłową wartość napięcia (można mierzyć napięcie stale i przemienne).

    Problem polega teraz tylko na narysowaniu wykresu.

    Dane odczytane sa pokazywane w memo i wyglądają następująco:

    U1=0.00V U2=0.00V U1=0.03V U2=0.00V U1=0.05V U2=0.00VU1=0.07VU2=0.00V U1=0.08V U2=0.00V U1=0.08V

    Wszystko jest w jednej linii, jeden po drugim (takie paczki po 2 pomiary).
    Mogę to zapisać do pliku itp. Problem w tym jak wyciągnąć sama wartość np 0.08 i ją zapisać?

    Chce narysować wykres na podstawie tych danych, zastosowałem komponent ChartFX, w jednym z tematów na forum znalazłem jakich komend użyć, ale problem mam z konwersja, dane odczytane z pliku w którym są dane są ciągiem znaków string a potrzebuje liczb, zastosowałem zamianę strtoint ale wyskakuje błąd niekompatybilność typów (może jest to spowodowane ze program chce zamienić U1 na liczbę a przecież jest to litera sam nie wiem).

    Dołączę program
    Bardzo proszę o pomoc, bo to już ostatnia rzecz jaka mi została :)

    0
    Załączniki:
  • #10 18 Sie 2009 13:41
    Stepel
    Poziom 20  

    a co sprzęga Twój układ z komputerem? w jaki sposób podajesz dane na RS? ten przetwornik ma wyjscie?

    0
  • #12 18 Sie 2009 13:58
    Stepel
    Poziom 20  

    Chodziło mi czy RS'a ma w sobie ale ok widzę ze tak. i te dane odebrane w delphi sa prawidłowe? zapoznaj sie z funkcjami operacji na łańcuchach , skoro to urządzenie już wysyła takiego stringa.

    0