logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Program obsługujący bazę Access oraz port RS232 COM

Kris20 22 Wrz 2008 20:02 4374 14
REKLAMA
  • #1 5561103
    Kris20
    Poziom 16  
    Posty: 254
    Pomógł: 9
    Ocena: 22
    Witam.
    Zwracam się do wszystkich o pomoc w podjęciu decyzji:

    Mianowicie chcę napisać program, który będzie pobierał z portu RS232 dane, a dokładniej wartość wagi z terminala wagowego. Następnie informację zostaną uzupełnione o takie dane jak imie, nazwisko, nr rejestracyjny pojazdu... i zostaną zapisane w bazie danych Access.

    Mam już część napisaną w Delphi 7 Enterprise, korzystam z cporta oraz ADO do dostępu do bazy... jednak jest problem bo ta wersja jest nie legalna i sie jej pozbyłem:/

    I teraz mam pytanie czy pisać w Delphi 7 Personal, Turbo Delphi Exlporer czy może Visual Basic 2005 Express Edition?

    W Delphi Personal mam problem z dostępem do bazy accessa ponieważ brakuje komponentów ADO.

    Natomiast w Turbo Delphi i Visual Basicu nie wiem jak się dobrać do portu COM:/

    Pomóżcie podjąć mi najlepszą decyzję...:) Pozdrawiam:)
  • REKLAMA
  • #2 5561521
    KeinXor
    Poziom 24  
    Posty: 511
    Pomógł: 62
    Ocena: 63
    Witam,
    Proponuje zostać przy Turbo Delphi Explorer i dynamicznie tworzyć komponenty typu ComPort, jeśli chodzi alternatywne technologie dostępu do baz danych to jest bardzo dobry, szybki i darmowy ZeosLib, nie pamiętam ale w wersji explorer możliwe że jest ado (nie pamiętam więc nie chcę wprowadzić w błąd).
    Pozdrawiam
  • REKLAMA
  • #3 5561611
    Kris20
    Poziom 16  
    Posty: 254
    Pomógł: 9
    Ocena: 22
    Obawiam się, że moja wiedza z tej dziedziny jest za mała bym tworzył taki komponent dynamicznie:/ Możecie udzielić wskazówki jakieś?:(

    A ADO faktycznie w Turbo Delphi jest.

    Chciałbym później jeszcze tworzyć z danych z bazy raporty i je drukować, będzie z tym problem?

    Pozdr:)
  • #4 5561814
    KeinXor
    Poziom 24  
    Posty: 511
    Pomógł: 62
    Ocena: 63
    Jeśli chodzi o dynamiczne tworzenie obiektów-komponentów (jak zwał tak zwał) wystarczy w sekcji uses dodać moduł w którym jest klasa, dajmy na to na przykładzie ComPort-a
    
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, CPort;
    
    type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
         procedure ComPort1RxChar(Sender: TObject; Count: Integer);
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
      Twoj_ComPort: TComPort;
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     Twoj_ComPort:=TComPort.Create(nil);
     Twoj_ComPort.Port:='Com1';
     Twoj_ComPort.BaudRate:=br9600;
     Twoj_ComPort.Parity.Bits:=prEven;
     // konfigurujesz co potrzeba a nastepnie
     Twoj_ComPort.OnRxChar:=ComPort1RxChar; // przypisujesz swoje zdarzenia
     Twoj_ComPort.Open;
    
    end;
    
    procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
    begin
      // to odbierasz co dobrodziej Com zwróci ;]
    end;
    
    end.
    


    Raporty tak samo możesz tworzyć dynamicznie i są do tego fajne darmowe komponenty/klasy freereport delphi.
    Pozdro

    ps. jaki terminal wagowy obsługujesz w swoim programie ?
  • #5 5562158
    Kris20
    Poziom 16  
    Posty: 254
    Pomógł: 9
    Ocena: 22
    KeinXor dzięki za zainteresowanie oraz pomoc:) Dziś już padam i będę to męczył jutro po pracy, mam nadzieję że komunikację opanuję:)

    Jesli chodzi o terminal do domyślnie chciałem by ten program współpracował z 3 rodzajami terminali, ale chyba zostanę przy obsłudze tylko terminala firmy Rinstrum TW320R, mam go do dyspozycji więc mogę od razu testować:)

    Mam nadzieję, że będę mógł pytać o pomoc jak będę miał dalej problemy:P
    Dzięki:)
  • #6 5635533
    Kris20
    Poziom 16  
    Posty: 254
    Pomógł: 9
    Ocena: 22
    KeinXor mam problem z dynamicznym tworzeniem tego komponetu:(
    Cały czas czegoś mi brakuje i nie potrafię odebrać danych.
    Jakie jeszcze informacje należy zadeklarować oprócz nr portu, prędkości, parzystości, liczby bitów itd?
    Z góry dzięki:)
  • #7 5635824
    KeinXor
    Poziom 24  
    Posty: 511
    Pomógł: 62
    Ocena: 63
    Witam,
    zamieść kawałek kodu który masz to się mu przyjrzę, w ciemno trudno mi powiedzieć.
  • REKLAMA
  • #8 5636441
    Fyszo
    Poziom 37  
    Posty: 3987
    Pomógł: 223
    Ocena: 115
    Kris20 napisał:
    KeinXor mam problem z dynamicznym tworzeniem tego komponetu:(
    Cały czas czegoś mi brakuje i nie potrafię odebrać danych.
    Jakie jeszcze informacje należy zadeklarować oprócz nr portu, prędkości, parzystości, liczby bitów itd?
    Z góry dzięki:)

    Na początek rozgranicz sobie problem na 'sprzętowy' i 'programowy'. Czyli z aplikacji obsługującej urządzenie lub z terminala sprawdź czy połaczenie jest ok - aby rozwiązać problem sprzętowy. Potem szukaj rozwiązania programowego.
  • #9 5638143
    Kris20
    Poziom 16  
    Posty: 254
    Pomógł: 9
    Ocena: 22
    Witam. Sprzętowo jest ok. Gdy korzystam z cporta "normalnie" tzn wybierajac go z palety komponentów, jest ok, odbiera dane ładnie. Problem mam z dynamicznym stworzeniem transmisji:(

    KeinXor zxa parę godzin zamieszczę kod, jest poza domem:/
    Dzięki:)

    Dodano po 4 [godziny]:

    O to ten kawałek kodu.
    W pierwszej części dynamiczne utworzenie comporta, w drugiej procedura ComPort1RxChar.


    procedure TForm1.FormCreate(Sender: TObject);
    begin
          Twoj_ComPort:=TComPort.Create(nil);
          Twoj_ComPort.Connected:=True;
          Twoj_ComPort.Port := 'COM1';
          Twoj_ComPort.Events := [evRxChar];
          Twoj_ComPort.BaudRate := br9600;
          Twoj_ComPort.Parity.Bits := prNone;
          Twoj_ComPort.StopBits := sbOneStopBit;
          Twoj_ComPort.DataBits := dbEight;
          Twoj_ComPort.OnRxChar:=ComPort1RxChar;
          Twoj_ComPort.Open; // open port
    end;
    
    procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
    var
    s: string;
    begin
    Twoj_ComPort.ReadStr(s,Count);      //pobieram dane do s
      if s[1]=#2 then                   //sprawdzam czy pierwszy znak to poczatek nadawania
        begin
          Delete(s, Pos(#2, s), 1);     //kasuje nie potrzebne znaki, zostaje mi tylko wartosc wagi
            while Pos(' ', s) > 0 do
              Delete(S, Pos(' ', S), 1);
              tmpstr1:=s
        end;
      if Pos(#3, s)>0 then
        tmpstr2:=tmpstr1+s[1];
        label1.Caption:=tmpstr2;        //zapisuje wartosc wagi do labela
    end;



    Z góry dziękuję:)
  • #10 5652779
    KeinXor
    Poziom 24  
    Posty: 511
    Pomógł: 62
    Ocena: 63
    Witam,
    ostatnimi czasy mam syndrom ciągłego braku czasu i nie odwiedzałem forum...
    wracając do kodu który podałeś wygląda na poprawny... chociaż nie powinienneś stosować Twoj_ComPort.Connected:=True; zaraz po utworzeniu obiektu to po primo a po primo 2 to staraj się korzystać z metod klasy czyli Twoj_ComPort.Open; a nie po przez ustawienie jej właściwości.

    Pozdrawiam

    Zamieszczam działający kod
    
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, cport, StdCtrls;
    
    type
      TForm1 = class(TForm)
        Memo1: TMemo;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
        procedure ComPort1RxChar(Sender: TObject; Count: Integer);
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
      Twoj_Comport: TComPort;
    
    implementation
    
    {$R *.dfm}
    
    
    procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
    var
    s: string;
    begin
    Twoj_ComPort.ReadStr(s,Count);
    Memo1.Lines.Add(s);
    
    end;
    
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
          Twoj_ComPort:=TComPort.Create(Form1);
          Twoj_ComPort.Port := 'COM1';
          Twoj_ComPort.Events := [evRxChar];
          Twoj_ComPort.BaudRate := br9600;
          Twoj_ComPort.Parity.Bits := prNone;
          Twoj_ComPort.StopBits := sbOneStopBit;
          Twoj_ComPort.DataBits := dbEight;
          Twoj_ComPort.OnRxChar:=ComPort1RxChar;
          Twoj_ComPort.Open;
    end;
    
    end.
    
  • #11 5661292
    Kris20
    Poziom 16  
    Posty: 254
    Pomógł: 9
    Ocena: 22
    KeinXor niestety dalej nie chce działać, już nie wiem co jest.
    Wpisuje dokładnie taki kod jak podałeś i cisza:(
    Masz jakiś pomysł na to?
  • REKLAMA
  • #12 5671854
    mruczek
    Poziom 11  
    Posty: 130
    Pomógł: 3
    Ocena: 11
    Na razie za cienki jestem, ale też myślę o napisaniu programiku do odczytu wagi po rs232. Chciałbym dodać jeszcze wizualizację na wykresie (może zapis do jakiejś prostej bazy). Znalazłem kawałek kodu, który za jakiś tydzień będę miał możliwość przetestować z urządzeniem, może u ciebie zadziała:
    http://4programmers.net/Delphi/Artykuły/Obsłu...tów_COM_z_poziomu_Delphi_(wszystkie_windowsy)" target="_blank" rel="nofollow noopener ugc" class="postlink inline" title="" > http://4programmers.net/Delphi/Artykuły/Obsłu...tów_COM_z_poziomu_Delphi_(wszystkie_windowsy)
  • #13 5673355
    Kris20
    Poziom 16  
    Posty: 254
    Pomógł: 9
    Ocena: 22
    Korzystałem juz z informacji z linka, ktory zamiesciles. Jednak ja muszę stworzyć komponent Cporta dynamicznie i to wlasnie mi nie dziala:/
  • #14 5674112
    KeinXor
    Poziom 24  
    Posty: 511
    Pomógł: 62
    Ocena: 63
    @Kris20 kod który zamieściłem działa, sprawdziłem osobiście.
    Na twoim miejscu stara bym się diagnozować problem metodą dedukcji i wykluczania, nie wiem co dokładnie chcesz wymodzić ale spróbuj nawiązać komunikacje poprzez HyperTerminal lub przez Terminal v1.9b (dość popularny programik, swoją drogą napisany w delphi :]), korzystając z programów zewnętrznych wykluczysz czy błąd jest po stronie twojego programu czy może po stronie sprzętu.
    Pozdrawiam i życzę szybkiego rozwiązania problemu.
  • #15 5674837
    Kris20
    Poziom 16  
    Posty: 254
    Pomógł: 9
    Ocena: 22
    Hmm to dziwna sprawa.
    Za pomoca terminala odbieram dane bez problemu. Tak samo gdy korzystam z cporta z palety komponentow. Problem mam gdy wlasnie probuje go tworzyc dynamicznie. Poki co probuje to robic w Delphi 7, moze tu jest problem. Chcialbym sprobowac w Turbo Delphi ale nie potrafie znalezc cporta do Turbo Delphi:( Zastanawiam sie juz nawet nad Lazarus'em bo mam do niego cporta, tylko ze gorzej w nim z dostepem do accessowej bazy danych:/
    Pozdrawiam...:)

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy stworzenia programu w Delphi lub Visual Basic do odczytu danych wagi z portu RS232 COM oraz zapisu tych danych wraz z dodatkowymi informacjami (imię, nazwisko, nr rejestracyjny pojazdu) do bazy Access. Autor ma doświadczenie z Delphi 7 Enterprise, ale ze względu na brak legalnej wersji rozważa użycie Delphi 7 Personal, Turbo Delphi Explorer lub Visual Basic 2005 Express. W Delphi Personal brak komponentów ADO do obsługi bazy Access, natomiast w Turbo Delphi i Visual Basic problemem jest dostęp do portu COM. Wskazano, że w Turbo Delphi Explorer jest dostępny komponent ADO oraz można dynamicznie tworzyć komponenty typu TComPort z biblioteki CPort. Podano przykładowy kod dynamicznego tworzenia i konfiguracji portu COM, z uwzględnieniem parametrów takich jak port, prędkość transmisji, parzystość, bity danych i stopu oraz obsługę zdarzenia odbioru znaków. Autor ma problem z dynamicznym tworzeniem komponentu i odbiorem danych, mimo że sprzęt i połączenie działają poprawnie (potwierdzone przez testy z HyperTerminalem i standardowym komponentem CPort z palety). Sugerowano diagnozę problemu przez wykluczanie błędów sprzętowych i programowych oraz korzystanie z zewnętrznych terminali do testów. Autor rozważa także użycie Lazarusa, który posiada komponent CPort, ale ma ograniczenia w dostępie do bazy Access. W dyskusji pojawiła się sugestia użycia biblioteki ZeosLib jako alternatywy do ADO. Ostatecznie problemem pozostaje poprawne dynamiczne tworzenie i konfiguracja komponentu CPort w środowisku Delphi 7 lub Turbo Delphi Explorer do stabilnego odbioru danych z terminala wagowego Rinstrum TW320R.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA