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

Wysyłanie informacji po RS232 przez Delphi

hubertfab 14 Gru 2009 19:43 14133 33
  • #1 14 Gru 2009 19:43
    hubertfab
    Poziom 21  

    Witam!

    Chodzę do 1 klasy technikum elektronicznego, mam już doświadczenie z mikro kontrolerami, ale z Delphi nie.

    Nauczyciel Technologi Informacyjnej (z którym buduję platformę (2 silniki krokowe)) nakazał mi napisanie programu w Delphi sterującego platformą. Program ma za zadanie wysyłać (przez RS232) do ATmegi8 liczbę z zakresu 0 - 255 (8 bit) liczba ta odpowiada liczbie kroków silnika. Wykonałem takie coś w terminalu BASCOM'a tylko teraz potrzebuję napisać taką aplikację w DELPHI.
    Pobrałem już różne komponenty mające zniwelować mój problem lecz niestety nie umiem ich nawet zainstalować.

    PROSZĘ o dokładne krok po kroku wyjaśnienie mi jak wykonać tą aplikację.
    1. Jak zainstalować komponent w Delphi ?
    2. Jaki komponent ?
    3. Jak wysłać liczbę np. 38 przez rs232 ?

    posiadam delphi 7 presonal.

    0 29
  • #2 15 Gru 2009 00:35
    megao
    Poziom 23  

    Cytat:
    Nauczyciel Technologi Informacyjnej nie może mi w tym pomóc ponieważ nie ma o tym zielonego pojęcia - On zajmuje się mechaniką."
    Witaj w Polsce. Może twój nauczyciel powinien zadać coś z mechaniki, albo się douczyć. Za co mu płacą? ;)

    Jak rozumiem jesteś początkujący w Delphi. Jest dobra literatura w której znajdziesz kompleksowe rozwiązanie problemu.
    Poszukaj RS 232C. Praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera.

    0
  • #3 15 Gru 2009 00:58
    Jerzy_W
    Poziom 13  

    Witam!

    Polecam komponent TComPort który można pobrać:Link

    Po rozpakowaniu odszukaj plik z opisem jak go zainstalować w twojej wersji Delphi.

    0
  • #4 15 Gru 2009 14:43
    hubertfab
    Poziom 21  

    Właśnie miałem już ten komponent pobrany, ale nie mogę dać rady go zainstalować.

    Najpierw proszę o opis instalacji tego komponentu. Jak uda mi się go zainstalować to wtedy zacznę czytać o jego programowaniu.


    PS: Proszę nie pisać postów typu: Wujek google zna rozwiązanie każdego pytania. Bo wierzcie mi, że już nie raz, nie 10 razy szukałem...

    Pozdrawiam.

    Dodano po 25 [minuty]:

    Witam ponownie.
    Wydaje mi się, że udało mi się zainstalować. Tylko nigdzie w zakładkach nie ma tego komponentu. Po instalacji wyświetliło mi się Cport.pas

    Kawałek tego kodu (bardzo mały)

    Code:

    (******************************************************
     * ComPort Library ver. 4.0                           *
     *   for Delphi 3, 4, 5, 6, 7 and                     *
     *   C++ Builder 3, 4, 5, 6                           *
     * written by Dejan Crnila, 1998 - 2002               *
     * maintained by Lars B. Dybdahl, 2003                *
     * Homepage: http://comport.sf.net/                   *
     *                                                    *
     * Fixed up for Delphi 2009 by W.Postma.  Oct 2008    *
     * Many significant internal changes.                 *
     *                                                    *
     * Supports Overlapped and non-Overlapped Win32 IO    *
     *****************************************************)

     { The main TComPort component is defined in this unit. }

    unit CPort;

    {$I CPort.inc}
    {$R-}
    {$Q-}

    interface

    uses
      Windows, Messages, Classes, SysUtils, IniFiles, Registry, CPortTypes;

    0
  • Pomocny post
    #7 15 Gru 2009 17:38
    arnoldziq
    Moderator Programowanie

    Code:
    type
    
      TForm1 = class(TForm)
        ComPort: TComPort;
    [...]
      ComPort.Open;
      Str := 'Test' + #13#10;
      ComPort.WriteStr(Str); //wysyła string
      if ComPort.Connected then
      ComPort.Close
    [...]

    lub :

    Code:
     Var
    
       b : byte;
    [...]
       b:=25;
       ComPort.Write(b,1) //wysyla pojedynczy bajt lub ich ciąg
    [...]

    1
  • #9 15 Gru 2009 18:21
    piterus99
    Poziom 43  

    Masz kolego ComPort w kodzie, a komponent nazywa sie ComPort1
    Taki szczegół, jednak teraz Delphi nie odwołuje się do komponentu tylko do(modułu/klasy - nie jestem pewny)

    i tak, to ten komponent, to ze to wersja demo...coz..
    Poszperam u siebie, jak jeszcze pisalem artykuły o Delphi to coś na RS232 popełniłem - za sekunde sprawdze.
    [teraz katują mnie Javą.....]

    0
  • #11 15 Gru 2009 18:28
    arnoldziq
    Moderator Programowanie

    hubertfab napisał:
    Coś robię źle tylko nie wiem co --- niedziała

    Wysyłanie informacji po RS232 przez Delphi


    Masz u siebie na formie zadeklarowany ComPort1, a w moim kodzie było ComPort bez jedynki.

    Poza tym ściągnij sobie ComPort3.01 (zamiast 4.0) - nie ma żadnych ograniczeń i będzie pięknie chodził pod Delphi 7.

    Spróbuj w ten sposób :
    Code:
    procedure TForm1.Button1Click(Sender: TObject);
    
    var
     arr : array[0..1] of byte;
     rozmiar : word;
    begin
     ComPort1.Open;
     arr[0]:=25;
     rozmiar:=1;
     ComPort1.write(arr,rozmiar);
     ComPort1.Close;
    end;

    0
  • #13 15 Gru 2009 20:50
    Stepel
    Poziom 20  

    skorzystaj z metody WriteStr i wyślij string

    0
  • #14 16 Gru 2009 10:15
    arnoldziq
    Moderator Programowanie

    Stepel napisał:
    skorzystaj z metody WriteStr i wyślij string
    To nie jest najlepsze rozwiązanie jeżeli chcesz wysyłać pojedyncze bajty.

    Wywal ComPort w wersji 4.x i ściągnij sobie i zainstaluj 3.01.

    W załączniku masz źródło w delphi, wraz z plikiem exe, która to aplikacja po wciśnięciu przycisku ; otwiera port , wysyła 1 bajt i zamyka port.

    Pobierz ComPort 3.01 z tego miejsca : Link

    Co do instalacji pakietu to :
    1. rozpakowujesz archiwum
    2. rozpakowujesz do innego folderu source.zip
    3. odpalasz delphi
    4. dajesz Open Project...
    5. w katalogu gdzie rozpakowałeś source.zip otwierasz plik DsgnCPort7.dpk (nie sugeruj się moim D5)
    Wysyłanie informacji po RS232 przez Delphi
    6. dajesz przycisk Compile i następnie Install
    Wysyłanie informacji po RS232 przez Delphi
    7 i masz zainstalowany komponent.

    Abu uzyskać odrębną bibliotekę RunTime, te same operacje jak w/w przeprowadzasz na pliku CPortLib7.dpk
    Wysyłanie informacji po RS232 przez Delphi

    Myślę, że dalej już dasz sobie radę.

    BTW : Ciągle czekam na moje obiecane 500 punktów :D

    0
    Załączniki:
  • #16 16 Gru 2009 17:26
    arnoldziq
    Moderator Programowanie

    Coś strasznie namieszałeś z tą instalacją :)
    Po zainstalowaniu jakiejkolwiek biblioteki, bez otwierania jakiegokolwiek projektu, powinieneś mieć w Menu -> Project/Options coś takiego :
    Wysyłanie informacji po RS232 przez Delphi
    Na liście zainstalowanych pakietów szukasz pakietu z ComPort i naciskasz REMOVE.
    Wysyłanie informacji po RS232 przez Delphi
    A następnie YES.
    Wysyłanie informacji po RS232 przez Delphi
    Po tej operacji komponent ComPort znika z listy komponentów.
    Wysyłanie informacji po RS232 przez Delphi
    Nowy (stara wersja) komponent instalujesz tak jak opisałem wcześniej.

    0
  • Pomocny post
    #18 16 Gru 2009 18:05
    arnoldziq
    Moderator Programowanie

    To tylko znaczy, że próbowałeś dodać komponent do ogólnej biblioteki komponentów, zamiast załadować całą paczkę DPK.

    1. Odpal Delphi
    2. Menu/Open project -> otwórz plik : c:\program files\borland\delphi7\Lib\dclusr70.dpk
    3. Pokaże ci się coś podobnego jak tutaj :
    Wysyłanie informacji po RS232 przez Delphi
    4. Naciskasz przycisk REMOVE, pokazuje się lista plików należących do tej biblioteki :
    Wysyłanie informacji po RS232 przez Delphi
    5. Szukasz na tej liście tego nieszczęsnego komponentu (lub jego części), zaznaczasz i naciskasz OK. Uważaj żeby nie usunąć czegoś, czego używasz.
    6. Jak zaznaczysz i usuniesz już wszystkie niepotrzebna pliki, to naciskasz COMPILE i gotowe.
    7. Uruchamiasz ponownie Delphi i wszystkie biblioteki powinny wgrać się bez problemów.

    0
  • #19 16 Gru 2009 18:22
    hubertfab
    Poziom 21  

    Zainstalowałem! :D

    Teraz kolejny krok (problem)

    Wysyłanie informacji po RS232 przez Delphi


    PS: Jak włączam ten plik z folderu ComPort_test i naciskam przycisk Button1 to silnik nie rusza się o 25 kroków (w ogóle się nie rusza). Więc włączam terminal w Bascomie i działa silnik się kręci. I znowu Pana program i nie działa. :cry:

    0
  • #20 16 Gru 2009 18:30
    arnoldziq
    Moderator Programowanie

    Hola, hola ....
    Nie było mowy o sterowaniu silnikami :)

    Ustaw port i inne ustawienia na kontrolce ComPort zgodnie z ustawieniami terminala i wtedy zobacz. Na razie kontrolka jest ustawiona na np. BaudRate 1200.
    Wysyłanie informacji po RS232 przez Delphi
    No a poza tym , jeżeli używasz terminala to jesteś pewien, że nie powinieneś wysłać stringu '25' zamiast liczby 25 jako byte ?

    0
  • #21 16 Gru 2009 18:47
    hubertfab
    Poziom 21  

    Rozumiem.
    W tym problem, że nie mogę włączyć programu (Run F9) z poziomu Delphi ponieważ wywala błąd:

    Wysyłanie informacji po RS232 przez Delphi

    PS: Jak kliknę 2 razy na ComPort ustawione jest poprawnie. 9600 itp.

    Dodano po 12 [minuty]:

    Required package "FIBComp" not found - Wymagany pakunek "FIBComp" nie znaleziony.
    Jak mam to ugryźć ?

    PS: Dam już 600 punktów za pomoc.

    0
  • Pomocny post
    #22 16 Gru 2009 20:06
    arnoldziq
    Moderator Programowanie

    Ok poprawiłem kody. Powinno dać się skompilować.
    Jakby coś nie tak, to spróbuj wywalić pliki CFG i DOF. Jak to nie pomoże to stwórz aplikację od nowa. 1 przycisk i kontrolka ComPort. Zawartość metody Button1Click możesz sobie spokojnie skopiować z załączonych kodów.

    0
  • #24 17 Gru 2009 15:46
    arnoldziq
    Moderator Programowanie

    Spakuj ten kod co próbujesz go uruchomić i zamieść tutaj.
    Nie wierzę że 4 linijki prostego kodu sprawiają aż tyle problemów.

    0
  • #25 17 Gru 2009 15:58
    hubertfab
    Poziom 21  

    To jest kod tego programu od Ciebie. :|

    Code:
    unit Unit1;
    

    interface

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

    type
      TForm1 = class(TForm)
        ComPort1: TComPort;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;

    var
      Form1: TForm1;

    implementation

    {$R *.DFM}

    procedure TForm1.Button1Click(Sender: TObject);
    var
     arr : array[0..1] of byte;
     rozmiar : word;
    begin
     ComPort1.Open;
     arr[0]:=25;
     rozmiar:=1;
     ComPort1.write(arr,rozmiar);     <<<- Tu jest błąd ten co na obrazku.
     ComPort1.Close;
    end;

    end.

    0
  • #26 17 Gru 2009 16:34
    arnoldziq
    Moderator Programowanie

    Deklaracja metody write dla ComPort 3.01, klasa TCustomComPort:

    Code:
    function Write(const Buffer; Count: Integer): Integer;

    Deklaracja metody write dla ComPort 4beta, klasa TCustomComPort:
    Code:
    function Write(const Buffer:TCPortBytes; Count: Integer): Integer;

    gdzie :
    Code:
    // this is the type Warren changed most of the untyped-parameters used
    
    // in CPort.pas and CPortCtl.pas to:
      TCPortBytes = PAnsiChar;


    Czy kolega widzi różnicę ?
    To tylko świadczy o tym, że kolega używa ComPort w wersji 4 beta a nie 3.01, tak jak jest w moim przypadku.

    Na 99% problemy biorą się właśnie z tego.

    Ale to jest mniej istotne. Jeżeli używasz terminala do sterowania wspomnianym silnikiem to przy obu wersjach biblioteki, bardziej prawdopodobne jest, że wystarczy na port wysłać string "25" :
    Code:
    ComPort1.Open;
    
    Str:='25';
    Str := Str + #13#10;
    ComPort1.WriteStr(Str);
    ComPort1.close;

    0
  • #27 17 Gru 2009 18:50
    hubertfab
    Poziom 21  

    Teraz wyrzuciło kilka błędów. Sorry już nie mam siły, nie wiem czy tobie się chce tyle odpisywać.

    PS: Napisz prosty program który wysyła na Com1 (br: 9600) liczbę "96" (zmienna STRING) za pomocą 1 przycisku. Jak silnik się obróci o 360* tzn, że działa i będę dalej próbował. Wyślij skompilowany program (.exe) w jednym folderze a, źródło w 2 folderze.
    Proszę i z góry dziękuję. :D


    PS: Teraz już nie zależy mi już tak na tym gościu, żeby to napisać tylko dla samego siebie - przyda mi się.

    Dodano po 33 [minuty]:

    A może jak zmienię wersję Delphi z 7 na 5 to pomoże ?
    PS: Nigdzie nie mogę znaleźć instalki Delphi 5.

    0
  • #29 18 Gru 2009 15:16
    hubertfab
    Poziom 21  

    Program działa w 80 %. Tzn:

    Jak nie zaznaczę pola (add 'new line') to silnik nie wykonuje ani jednego kroku, wysyłając mu liczbę np 96 (96 kroków powinien wykonać.).

    Jeśli zaznaczę to pole i wpisze 96 i Dam SEND to silnik obraca się o zadaną liczbę kroków. Ale już drugi raz nie mogę już wysłać liczby kroków - w sumie to mogę ale silnik na to nie reaguje. Ale jak wyślę mu np. 96 kroków obróci się potem resetuje mikrokontroler i wysyłam ponownie (bez resetu programu) i silnik działa.

    Możesz mi wysłać źródło programu, zobaczę czy u mnie się w ogóle skompiluje.



    Pozdrawiam Hubert.

    0