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

Sterowanie portem COM. RS232

goldfire 03 Maj 2004 07:44 28887 62
  • #31
    robert dudziak
    Poziom 11  
    Jeżeli znasz visual basic to tam chyba jest najprościej napisać jakiś programik z wykorzystaniem portu.Korzysta się już bowiem z podprogramu w pakiecie vb.Niejakiej kontrolki MSCOMM32.ocx.Polecam bo sam napisałem kilka programów i działają bez zarzutów.
  • Banner Multimetr Fluke 87VBanner Multimetr Fluke 87V
  • #32
    centipede
    Poziom 16  
    głupie pytanie:
    jak w pascalu sprawdzić , czy bit jest równy "1" ??
  • #33
    elektryk
    Poziom 42  
    centipede napisał:
    głupie pytanie:
    jak w pascalu sprawdzić , czy bit jest równy "1" ??
    Zrobić and z odpowiednią maską i przyrównownać wynik do zera albo tej maski.
  • #34
    kniksc
    Poziom 12  
    Witam
    "Zrobić and z odpowiednią maską i przyrównownać wynik do zera albo tej maski." nie zrozumiałem prawie ani jednego słowa :)
    może mi ktoś powiedzieć co takiego trzeba zrobić w windowsie XP żeby działało tak jak w 98? (znaczysię żeby wogle działało)
    Dzięki pozdrawiam
  • #35
    BoskiDialer
    Poziom 34  
    maskowanie and działa tak samo w win XP jak i w 98.. to jest oczywiste.. maskowanie and polega na tym że dając jakąś maske, tylko jeden bit danych wejściowych wpływa na dane wyjściowe..
    np mając wartość 100 (hex $64) hce sprawdzić czy bit 5 jest ustawiony... robie maske $20 i robie and:
    $64 and $20 = $20
    jeśli wynik jest inne od zera albo równy masce oznacza to że bit jest ustawiony..
    jeśli sprawdzać bit pierwszy (maska $01) wynik będzie taki:
    $64 and $01 = $00 co oznacza że bit jest nieustawiony...
    "...(znaczysię żeby wogle działało) "
    jak by to niedziałało to by żaden program niedziałał...
    p.s. wynik maski może zwrócić maksymalnie tyle '1', ile bitów o wartości '1' ma maska..
  • #36
    shivanwk
    Poziom 11  
    mam w delphi takei 2 funkcje :
    function out32(PortAddress,ByVal:Integer):Integer
    stdcall;external 'inpout32.dll' name 'Out32';

    function Inp32(PortAddress:Integer):Integer
    stdcall;external 'inpout32.dll' name 'Inp32';

    i chcialbym za pomoca ich napisac program do wlaczania napiecia na jednym chociaz pinie

    jak zrobic?
  • Banner Multimetr Fluke 87VBanner Multimetr Fluke 87V
  • #37
    kniksc
    Poziom 12  
    dokładnie, ja też chciałbym coś takiego tylkoże w C i żeby działało pod XP bo pod 98 już wiem jak a pod XP nie mam bladego pojęcia wiem tylko że coś właśnie z tym inpout32.dll ma być ale co i jak ??
  • #38
    shivanwk
    Poziom 11  
    scaignelem sobie komponent:cia com port 1.14.zip
    i zrobilem programik do tego wstawiania napiecia
    lecz na woltomierzu wychadza mi skoki pomiedzy 4,8 a 5,2 zamiast 5V-0V
    co zle moze byc?
    dalem uziemienie do 5 a + do 8
  • #39
    blackrage
    Poziom 14  
    Korzystam z Delphi 3 i chciałbym żeby ktoś mi rzeczowo powiedział jak wysterować dwie linie z com1. Tylko chciałbym konkretnie
    xxxxxx - komenda ustawia 1 na pinie x
    yyyyyy - komenda ustawia 1 na pinie y
    tak samo ustawiające 0, i do którego pina podpiąć się minusem zasilania. Wolałbym nie korzystać z żadnego komponentu, może to również byc w WinApi.
  • #40
    BoskiDialer
    Poziom 34  
    Hm.. ostatnio przestudiowałem opis łącza szeregowego z powodu drobnego zaniku pamięci o rs'ie.. napałem że można sterować pinami RTS (7) i DTR (4). otóż po przestudiowaniu dokumentacji dowiedziałem się że pinem TxD (3) również można sterować bezpośrednio (nie za pomocą rejestru przesówanego):

    1 na TxD port[$3f8+3]:=port[$3f8+3] and (not $40);
    0 na TxD port[$3f8+3]:=port[$3f8+3] or $40;

    Może się to komuś przyda.
    ustawienie 0 powoduje wymuszenie stanu niskiego na TxD, ustawienie 1 powoduje podłączenie tego pinu do rejestru przesówanego który poza transmisją danych przyjmuje stan 1.
  • #41
    And!
    Admin grupy Projektowanie
  • #42
    BoskiDialer
    Poziom 34  
    Nie. ale można wykorzystać nakładke do programu (kompilując w delphi), który przy dostępie do Port[] będzie korzystał z biblioteki np DLPortIO (ja posiadam taką nakładke.. swojej produkcji...)
  • #43
    kekon
    Poziom 17  
    Ja napisałem własne procedury obsługi RS232 w Delphi korzystając z funkcji API i jest to najlepszy sposób. Dzięki nim można również dobrać się do portu LPT chociaż jak stwierdziłem ciężko się z nim pracuje.
    Pod Windows 2000 i wyżej obsługa portu metodą odwoływania się np. porzez asembler do portów sterownika RS232 na pewno nie zadziała. Niektórzy robili tak pod Win 98 i 95 ale jest to bardzo prymitywny sposób i może spowodować zawieszenie się systemu. Nie należy również korzystać z biblioteki DLPortIO i operować na rejestrach portu szeregowego mimo że, odwołuje się ona do portów w legalny sposób akceptowany przez Win. Korzystając z API można sterować dodatkowymi liniami portu, odczytywać ich stan oraz definiować zdarzenia (np. w zależności od zmiany stanu tych linii) itp.
  • #44
    UDMA
    Poziom 16  
    Obsługa RS232 w języku Python:
    Code:

    import serial
    uart = serial.Serial(0)
    uart.open()
    uart.write("hello")
    response=uart.read(5)   # czekamy na 5 bajtów
    uart.close()

    I to tyle w temacie.
  • #45
    kekon
    Poziom 17  
    Wygląda ciekawie. Tyle że, ten python nie jest zbyt popularny; poza tym jeśli te 5 bajtów nie przyjdzie, to czekanie będzie trwać w nieskończoność.
    Dodatkowo brak to podstawowych rzeczy: nie widzę tu:
    1. Ustawienie prędkości transmisji
    2. Typ transmiji (czy jest bit parzystości itp., liczba bitów)
    3. Rozmiar bufora nadawczego i odbiorczego
    4. Timeout
  • #46
    UDMA
    Poziom 16  
    kekon napisał:
    Wygląda ciekawie. Tyle że, ten python nie jest zbyt popularny;


    To się zmieni ponieważ jest moda na języki bardzo wysokiego poziomu. Python sam w sobie jest łatwy do nauczenia, tutaj zdecydowanie przebija C i C++.

    Cytat:

    poza tym jeśli te 5 bajtów nie przyjdzie, to czekanie będzie trwać w nieskończoność.


    Są timeouty. Można wybrać czy ma być blocking mode. Można w ostateczności uruchomić oddzielny wątek.

    Cytat:

    Dodatkowo brak to podstawowych rzeczy: nie widzę tu:
    1. Ustawienie prędkości transmisji
    2. Typ transmiji (czy jest bit parzystości itp., liczba bitów)
    3. Rozmiar bufora nadawczego i odbiorczego
    4. Timeout


    Jest wszystko tylko w przykładzie konstruktor klasy Serial ma parametry domyślne (9600 8N1).
    Bufor można zmienić w źródłach modułu (który de facto jest nakładką na win32 API).
    http://pyserial.sourceforge.net/
  • #47
    kekon
    Poziom 17  
    C++ i C faktycznie nie są zbyt dobrym językiem do programowania pod Windows. Ale do programowania np. mikrokontrolerów to zdecydowanienie najlepsze języki. Z tymi językami "bardzo wysokiego poziomu" też nie jest aż tak dobrze. Są one co prawda coraz wygodniejsze ale i wolniejsze. Poza tym, każda moda przemija. Programy np. napisane w Javie to porażka. Szeczególnie niektóre programy do projektowania dla elektroników. Są boleśnie wolne, wyskakują jakieś błędy i zawieszają się. Chociaż jak mówią "najlepszy jest taki język który się zna"
  • #48
    firedrake
    Poziom 11  
    Witam!!
    Jezeli ktos moze mi pomoc to mam taki problem.
    Potrzebuje wyslac komendy AT do modemu w telefonie. Jezeli robie to za pomoca terminala to wszystko jest OK.
    Jak robie to za pomoca mojego programiku to nie otzymuje zadnych info ani o bledzie ani o poprawnosci komendy tak jakby RTS nie bylo wlaczone a jest wymagane przez modem.
    Jak moge sprawdzic te linie za pomoca win32 API - dodam ze postepuje zgodnie z ksiazka RS232 Praktyczne programowanie.
    Robie tak jak tam autor pisze ale nie dziala.

    oto Czesc mojego kodu:

    //--------------------- wysylanie danych ------------------------------------
    int __fastcall Write_Comm(HANDLE hCommDev, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite)
    {
    DWORD NumberOfBytesWritten;

    // EscapeCommFunction(hCommDev, SETRTS);

    if (WriteFile(hCommDev, lpBuffer, nNumberOfBytesToWrite, &NumberOfBytesWritten, NULL))
    {

    // WaitCommEvent(hCommDev, &fdwEvtMask, NULL);

    // EscapeCommFunction(hCommDev, CLRRTS);

    return TRUE;
    }
    else return FALSE;



    }
    //----------- odebranie danych ----------------------------------------------
    int __fastcall Read_Comm(HANDLE hCommDev, LPVOID lpBuffer, LPDWORD lpNumberOfBytesRead, DWORD Buf_Size)
    {
    DWORD nNumberOfBytesToRead;

    ClearCommError(hCommDev, &Errors, &Stat);

    if (Stat.cbInQue)
    {
    if (Stat.cbInQue > Buf_Size)
    nNumberOfBytesToRead = Buf_Size;
    else
    nNumberOfBytesToRead = Stat.cbInQue;

    ReadFile(hCommDev, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, NULL);
    }
    else
    *lpNumberOfBytesRead = 0;
    return TRUE;

    }

    //------- otwarcie portu -----------------------------------------------------
    hCommDev = CreateFile(lpFileName, GENERIC_WRITE | GENERIC_READ, 0, NULL,
    OPEN_EXISTING, 0, NULL);

    if (hCommDev != INVALID_HANDLE_VALUE) // sprawdza czy port jest otwarty prawidlowo
    {
    OpenComm->Enabled = FALSE;
    CloseComm->Enabled = TRUE;

    SetupComm(hCommDev, cbInQueue, cbOutQueue); // inicjalizuje parametry komunikacyjne portu (wskaznik i bufory)

    dcb.DCBlength = sizeof(dcb); // aktualny rozmiar struktury DCB
    GetCommState(hCommDev, &dcb); // udostepnienie aktualnych parametrow DCB

    //---- parametry komunikacyjne -----
    dcb.BaudRate = predkosc; // predkosc transmisji
    dcb.Parity = parzystosc; // parzystosc
    dcb.StopBits = stop_bit; // bity stopu
    dcb.ByteSize = dane; // rozmiar danych

    dcb.fParity = TRUE; // sprawdzenie parzystosci
    dcb.fDtrControl = DTR_CONTROL_ENABLE; // liniia DTR stale aktywna
    dcb.fRtsControl = RTS_CONTROL_ENABLE; // linia RTS nieaktywna - aktywowana podczas nadawania
    dcb.fOutxCtsFlow = FALSE; // kontrola CTS wylaczona
    dcb.fOutxDsrFlow = FALSE; // kontrola DSR wylaczona
    dcb.fDsrSensitivity = TRUE; // kontrola DSR wylaczona
    dcb.fAbortOnError = FALSE; // przy bledzie wstrzymuje transmisje
    dcb.fOutX = FALSE; // wylaczenie XON-XOFF
    dcb.fInX = FALSE; // wylaczenie XON-XOFF
    dcb.fErrorChar = FALSE; // wylaczone zastepowanie bledow znakiem ErrorChar
    dcb.fNull = FALSE;

    SetCommState(hCommDev, &dcb); // reinicjalizacja DCB
    GetCommState(hCommDev, &dcb); // odczytanie aktualnych parametrow DCB
    GetCommMask(hCommDev, &fdwEvtMask);
    SetCommMask(hCommDev, EV_TXEMPTY | EV_CTS); // ustawia maski informujace o aktualnym stanie transmisji

    }

    //----------------- wysylanie -----------------------------------------------

    void __fastcall TForm1::wyslijClick(TObject *Sender)
    {

    if (hCommDev) // powtorne sprawdzenie czy port jest otwarty
    {
    EscapeCommFunction(hCommDev, SETRTS);

    strcpy(Buffer_O, sending); // sending zawiera komende AT+CBC
    Write_Comm(hCommDev, Buffer_O, strlen(Buffer_O));
    Sleep(1000); // opoznienie w celu odebrania bitow przez urzadzenie docelowe
    TransmitCommChar(hCommDev, 0x0D); // wymagany znak CR do zakonczenia komendy
    Sleep(10);

    FlushFileBuffers(hCommDev);

    Read_Comm(hCommDev, &Buffer_I[0], &Number_bytes_Read, sizeof(Buffer_I));

    if (Number_bytes_Read) // jezeli odebrano jakies bajty
    {

    odebral->Lines->BeginUpdate();
    odebral->Lines->Add(&Buffer_I[0]);
    odebral->Lines->EndUpdate();

    }
    }

    }
    else
    MessageBox(NULL, "Port nie zostal otwarty do transmisji.", "Blad",MB_OK);
    }
    // --------------------------------------------------------------------------


    Pozdrawiam!
  • #49
    rafalc
    Poziom 11  
    Witam.
    Nie znam sie na progamowaniu portów w delpfi ale sam kożystam z ksiązki "RS232 programowanie...." i niestety jezeli chodzi o Pascala i dane dotyczące programowania pod nim portów to znalazłem kilka małych błedów co skutecznie zajęło mi ładnchy parę godzin aby do nich dojść. Błedy te były w opisie znaczenia bitów rejestru sterującego RSem.
    To tak dla informacji. Bo w sumie nie wiem, może posiadam źle wydaną ksiązke ;)

    A teraz chciałem zadać swoje pytanie. Jak już wspomniałem programuje Rsa w pascalu. Używam sterownika portu a nie przerwań.
    1. Czemu ta metoda jest prymitywna?? (Kekon tak stwierdził na forum - prosze o odpowiedź)
    2. Testując połączenie w term95 tub hyperterminalu widze nadchodzące "znaczki" a gdy wykożystuje swój program to wychodzi że port jest pusty (transmisja jest, bo tak jest zaprogramowany uP)
    3. Gdy napisałem program kożystający z przerwań bit gotowości informacji do odczytu jest ustawiony (bit0 w rej AH) a z rejestru (AL dla AH=02H) odczytuje zero (tak jakby nic nienadeszło)

    Pracuje na Win98

    Oto fragment kodu streowania UART'em:
    stałe glob.:
    line_stat = $FD;
    line_ctrl = $FB;
    freq_divH = $F9;
    freq_divL = $F8;
    rx_tx = $F8;

    procedure konfigRS;
    var
    port_adr:word;
    begin;
    port_adr:=port+line_ctrl;
    asm {koniigurowanie UART}
    mov dx,port_adr
    mov al,$da {podawanie predkości transmisji ON,
    Parity, 7 bit˘w danych, 1 bit stopu}
    out dx,al
    end;
    port_adr:=port+freq_divL;
    asm {predkość transmisji 9600 bodów}
    mov dx,port_adr
    mov al,$0c
    out dx,al
    end;
    port_adr:=port+freq_divH;
    asm
    mov dx,port_adr
    mov al,$00
    out dx,al
    end;
    port_adr:=port+line_ctrl;
    asm {dopiero teraz możliwy odbiór i nadawanie}
    mov dx,port_adr
    mov al,$5a
    out dx,al
    end;
    end;

    I kod naisany dla przerwań:

    procedure konfigRS;
    var
    port_adr:word;
    begin;
    port_adr:=port;
    asm {koniigurowanie RS}
    mov dx,port_adr
    mov ah,$00
    mov al,$fA{EvenParity, 7 bits data, 1 bit stop,9600bps}
    int 14h
    end;
    End;

    function spr_lini: byte; {odzczyt stanu linii}
    var
    port_adr: word;
    temp: byte;
    begin;
    port_adr:=port;
    asm
    mov dx,port_adr
    mov ah,$03
    int 14h
    mov temp,ah
    end;
    spr_lini:=temp;
    end;

    function odczyt:byte;
    var
    port_adr: word;
    temp: byte;
    BEGIN;
    port_adr:=port;
    asm {odczyt z porut wartości która nadeszła}
    mov dx,port_adr
    mov ah,$02
    int 14h
    mov temp,al
    end;
    odczyt:=temp;
    end;
  • #50
    formatyk
    Poziom 13  
    pozwolcie ze sie podepne, bo mam pokrewny problem.

    Mam program w Builder C++ obslugujacy port rs232 bezposrednio przez API.

    otwieram go w nastepujacy sposob:

    Code:

          hCommDev = CreateFile(lpFileName, GENERIC_READ | GENERIC_WRITE,0, NULL, OPEN_EXISTING, 0, NULL);


    czyli standardowo. Chce przez niego przesylac dane BINARNE. Wszystko dziala prawie dobrze. Problem jest w tym, ze kiedy wysylam dane z kompa do uC to znak #13 jest pomijany (w odbiorniku go nie ma),
    a podczas odbioru na kompie z wyslanego znaku #10 robi się #13#10.

    ustawienia bcd wygladaja u mnie tak:

    Code:

                GetCommState(hCommDev, &dcb);

                dcb.BaudRate=CBR_9600;
                dcb.Parity = NOPARITY;           // ustawienie parzystości
                dcb.StopBits = ONESTOPBIT;        // bity stopu
                dcb.ByteSize = 8;                 // bity danych

                //-przykładowe ustawienia flag sterujących DCB-
                dcb.fParity = FALSE;              // sprawdzanie parzystości
                dcb.fDtrControl = DTR_CONTROL_DISABLE;

                dcb.fRtsControl = RTS_CONTROL_DISABLE;

                dcb.fOutxCtsFlow = FALSE;
                dcb.fOutxDsrFlow = FALSE;
                dcb.fDsrSensitivity = FALSE;
                dcb.fAbortOnError = FALSE;
                dcb.fBinary = TRUE;
                dcb.fOutX = FALSE;
                dcb.fInX = FALSE;
                dcb.fErrorChar = FALSE;
                dcb.fNull = FALSE;

                SetCommState(hCommDev, &dcb);


    transmisja jest nawiazywana w trybie 9600 bez parzystosci i bez kontroli przeplywu.
  • #51
    ucoder
    Poziom 10  
    Na forum znalazlem duzo wypowiedzi jak uzyc rs232 w c++ builder ale zadna nie pokazuje jak to zrobic od poczatku do konca. ponawiam pytanie ktore padlo juz wiele razy:

    -chcialbym wyslac zmienna 1 bajtowa przez port com.
    -uruchamiam srodowisko c++ builder
    -i co dalej

    chodzi mi o to ze nie mam ani zadnych komponentow ani bibliotek ani pojecia jak zaczac....
  • #52
    matee_wro
    Poziom 11  
    Czesc. Mam pytanie do formatyk`a. Czy moglbys pokazac swoj caly kodzik do rs-232?
  • #53
    billy_
    Poziom 10  
    BoskiDialer napisał:
    Ja polecam książke "RS 232C praktyczne programowanie od pascala i C++ do Delphi i Buildera" wyd Helion.

    Panowie... Dlaczego tak mieszacie komus...
    Są gotowe komponenty do delphi, C++ itd itp. Mam tutaj na mysli języki obiektowa. Sterowanie takim komponentem jest banalnie proste. Jeśli ktoś chce mogę udostępnić komponenty do RS232. Piszcie na mail :hostman@poczta.fm
  • #54
    formatyk
    Poziom 13  
    Moim zdaniem komponenty do obslugi RS nie sa zupelnie potrzebne i tylko zwiększają ilość kodu, jednocześnie ukrywając przed programistą prawdziwą nature portu.

    Zarówno API windowsa jak i pod linuxem swietnie sobie radzi i nie potrzeba zadnych dodatkow, ktore powodują że jest kilkanaście standardów odsługi w C/C++:
    potrzebne są 4 funkcje i znajomość struktury DCB:

    otworzenie portu:

    Code:

        HANDLE   hCommDev;   
        LPCTSTR  lpFileName;       
            lpFileName = "COM1";
         hCommDev = CreateFile(lpFileName, GENERIC_READ | GENERIC_WRITE,0, NULL, OPEN_EXISTING, 0, NULL);


    oczywiście flagi do createfile sobie mozna ustawiac roznie

    Zapisanie bufora na port:
    Code:

    int __fastcall Write_Comm(HANDLE hCommDev, LPCVOID lpBuffer,
                              DWORD nNumberOfBytesToWrite)
    {
       DWORD NumberOfBytesWritten;
       if (WriteFile(hCommDev, lpBuffer,nNumberOfBytesToWrite, &NumberOfBytesWritten, NULL) > 0)
     {
      ...
      }
    }


    Odczytanie z portu do bufora:

    Code:


    int __fastcall Read_Comm(HANDLE hCommDev, LPVOID lpBuffer,
                          LPDWORD lpNumberOfBytesRead, DWORD Buf_Size)
    {
        DWORD nNumberOfBytesToRead;

        ClearCommError(hCommDev, &Errors, &Stat);

        if (Stat.cbInQue > 0)
          {
            if (Stat.cbInQue > Buf_Size)
                nNumberOfBytesToRead = Buf_Size;
              else
                nNumberOfBytesToRead = Stat.cbInQue;

            ReadFile(hCommDev, lpBuffer, nNumberOfBytesToRead,
                     lpNumberOfBytesRead, NULL);

          }
          else
            *lpNumberOfBytesRead = 0;
        return TRUE;
    }


    Wyslanie jednego bajtu:
    Code:

       TransmitCommChar(hCommDev, 'l');


    Ustawianie parametrow transmisji (przykladowe, F1 na dcb):

    Code:

                GetCommState(hCommDev, &dcb);

                dcb.BaudRate=CBR_9600;
                dcb.Parity = NOPARITY;           // ustawienie parzystości
                dcb.StopBits = ONESTOPBIT;        // bity stopu
                dcb.ByteSize = 8;                 // bity danych

                //-przykładowe ustawienia flag sterujących DCB-
                dcb.fParity = FALSE;              // sprawdzanie parzystości
                dcb.fDtrControl = DTR_CONTROL_ENABLE;

                dcb.fRtsControl = RTS_CONTROL_ENABLE;

                dcb.fOutxCtsFlow = TRUE;
                dcb.fOutxDsrFlow = TRUE;
                dcb.fDsrSensitivity = TRUE;
                dcb.fAbortOnError = FALSE;
                dcb.fBinary = TRUE;
                dcb.fOutX = FALSE;
                dcb.fInX = FALSE;
                dcb.fErrorChar = FALSE;
                dcb.fNull = FALSE;

                SetCommState(hCommDev, &dcb);


    Przyklady głównie z helpa do borlanda.
    Polecam przycisk F1 oraz google.
  • #55
    KanGu
    Poziom 12  
    Code:


    pring temp1
    print temp2

    print a ' stan portu d5 jeśli jest sygnał wysyła wartość x na port com
    print 1' jeśli sygnał na porcie d5 zanikł wysyła 1



    są to dwie temperatury wysyłane na port com. W hyperterminalu odbieram je bez problemu jednak jak to zrobić żeby można je było wyświetlić w delphi na 2 elementach typu RichEdit i jak odczytać wartość sygnału z portu d5.
    Code:


      var

      query : PChar = 'CDAT?'+#13+#10;  // przykładowe zapytanie
                                      // zakończone parą znaków CR LF
      Buffer_O : ARRAY[0..cbOutQueue] of Char; // bufor wyjściowy
      Buffer_I : ARRAY[0..cbInQueue] of Char;  // bufor wejściowy
    //----------------------------------------------------------------------------------
    function TForm1.Read_Comm(hCommDev: THANDLE;
                               Buf_Size: DWORD): Integer;
      var
         nNumberOfBytesToRead: DWORD;
    begin
       ClearCommError(hCommDev, Errors, @Stat);
       if (Stat.cbInQue > 0) then
         begin
            if (Stat.cbInQue > Buf_Size) then
              nNumberOfBytesToRead := Buf_Size
              else
                 nNumberOfBytesToRead := Stat.cbInQue;
             ReadFile(hCommDev, Buffer_I, nNumberOfBytesToRead,
                      Number_Bytes_Read, NIL);
             Read_Comm := 1;
         end
           else
              begin
                Number_Bytes_Read := 0;
                Read_Comm := 0;
              end;
    end;
    //-----------------------------
      FlushFileBuffers(hCommDev);
      Until (Write_Comm(hCommDev, StrLen(Buffer_O)) <> 0);

      if (Read_Comm(hCommDev, SizeOf(Buffer_I)) > 0) then // odbiór
                                                           // danych
      RichEdit1.Text := Buffer_I
      else
      RichEdit1.Text := 'Brak danych';


    To jest część kodu odpowiadająca odbieraniu danych jak to przedefiniować żeby móc odebrać temperatury wysłane w sposób podany powyżej? Jak uruchomię tą aplikacje z takimi ustawieniami to pokazuje mi na komponencie ciąg dziwnych znaków.
    Z wysyłaniem nie mam problemów tylko z odbiorem, nie umiem markować sygnałów nie rozumiem komunikacji między mikrokontrolerem i delphi tzn. nie wiem jak z poziomu mikrokontrolera oznaczyć daną temperaturę, a następnie jak w delphi odczytać to oznaczenie i wyświetlić temperaturę.
  • #56
    tahitus
    Poziom 2  
    potrzebuje zrobić program ( najlepiej w borland c++ builder 6 albo delphi 7)
    który będzie wysyłał i odbiarał bity z dwóch pinów na porcie COM

    ( na jednym pinie wysyła na drugim odbiera)

    proszę o cały kod źródłowy programu

    z góry dziękuję[/url]
  • #57
    formatyk
    Poziom 13  
    tahitus napisał:


    proszę o cały kod źródłowy programu


    czyzby wyżej go nie było ?

    Zresztą ja poproszę o przelew na konto, to mogę wysłać cały kod źródłowy (;

    Z tym co jest wyżej można zrobić wszystko co się chce na RS232.
  • #58
    maciek11
    Poziom 17  
    Witam
    Czy miałby ktoś jakiś przykładowy programik z wykorzystaniem polecenia bioscom, bo dopiero zaczynam się interesować sterowaniem portami w C i nie do końca wiem co w trawie piszczy:D Napisałem też programik a asemblerze odczytujący stan rs-a, ale po przerzuceniu do C się wykładał przy kompilacji. Dodałem go w ten sposób: asm {treść z asm-a} i wydaje mi się że tu raczej nie ma błędu, ale chyba chodzi o przerwania DOS-a których, jak się dowiedziałem nie można używać w Builderze.
    Z góry dziękuję za pomoc
  • #59
    tahitus
    Poziom 2  
    w takim razie czy może mi ktoś przysłać przykładowy program razem z kodami źródłowymi??

    mój e-mail to:
    panzdzich1(malpa)wp.pl
  • #60
    Mustela73
    Poziom 12  
    ludzie,
    A moze by tak samemu troche pomyslec, a nie zaraz caly program. Obsluga Com'a jest naprawde prosta.
    formatyk wszystko podal.
    gotowe programy mozna poszukac na msn albo sourceforge czy czyms podobnym.

    przykladowy program mozna sprobowac samemu napisac.

    to nic innego jak:

    zainicjowac parametry transmisji,
    otworzyc port,
    sprawdzic status otwarcia,
    odczytac dane z portu,
    cos z nimi zrobic,
    zapisac dane do portu,
    zamknac port
    Koniec.

    w odpowiednie miejsca wstaw kod formatyka i masz.

    Pozdrawiam