Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Wysłanie ciągu znaków po RS232

min_max 02 Mar 2009 19:21 2586 6
  • #1 02 Mar 2009 19:21
    min_max
    Poziom 10  

    Drodz koledzy mam pytanie co do wysyłania ciągu znaków po RSie spod C++. Mianowicie mam napoisać program, który łączy się poprzez RS232. W programie mam juz ustawione połączenie (parametry), otwarcie i zamknięcie COMa, a teraz nie wiem jak zrealizować po pierwsze:
    Protokół XON XOFF,
    po drugie - jak wysłać ciąg znaków poprzez port. Czy mógłby ktoś być tak uprzejmy i wytłumaczyć mi mniej więcej to? Mam książke Daniluka, i tam zawarta jest obsługa wysłania pliku:

    Code:
    //----------------wysłanie pliku--------------------------------------
    
    void __fastcall TForm1::SendClick(TObject *Sender)
    {
        DWORD  FileSizeHigh;

        ProgressBar1->Max = 0;

        if (hCommDev > 0)
          {
          memset(Buffer_O, 0, cbOutQueue);

          if ((_lopen(FileListBox1->FileName.c_str(),OF_READ)) !=
                      HFILE_ERROR)
            {
             hfile_s = _lopen(FileListBox1->FileName.c_str(), OF_READ);
             ProgressBar1->Max=GetFileSize((HANDLE)hfile_s,
                                           &FileSizeHigh);

             while (_lread(hfile_s, &Buffer_O[0], 1))
               {
                Write_Comm(hCommDev, 1);
                ProgressBar1->StepIt();
               }
             _lclose(hfile_s);

             FlushFileBuffers(hCommDev);
            }
            else
              MessageBox(NULL, "Nie wybrano pliku do transmisji.",
                         "Błąd !", MB_OK);
          }
          else
            MessageBox(NULL, "Niewłaściwa nazwa portu lub port jest"
                       " aktywny.", "Błąd", MB_OK);
    }


    A Ja chciał bym wysłać komendę na sztywno wpisaną np komendę:
    Code:
    :FUNCtion<N>RANGe

  • #2 02 Mar 2009 20:27
    Usunięty
  • #3 02 Mar 2009 20:40
    min_max
    Poziom 10  

    No ok tylko Ja nie zabardzo jestem programowaty. A jeszcze może wiesz jak zaimplementować i obsłużyć protokół XON XOFF?

  • #5 02 Mar 2009 23:33
    ekomont
    Poziom 15  

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

    if (hCommDev != INVALID_HANDLE_VALUE)
    // sprawdza, czy port jest otwarty prawidłowo
    {
    dcb.DCBlength = sizeof(dcb); // aktualny rozmiar
    // struktury DCB
    GetCommState(hCommDev, &dcb); // udostępnienie aktualnych
    // parametrów DCB
    dcb.BaudRate = CBR_1200; // prędkość transmisji
    dcb.fParity = TRUE; // sprawdzanie parzystości
    dcb.Parity = NOPARITY; // ustawienie parzystości
    dcb.StopBits = TWOSTOPBITS; // bity stopu
    dcb.ByteSize = 7; // bity danych
    dcb.fTXContinueOnXoff = 1; // XON XOFF
    SetCommState(hCommDev, &dcb); // reinicjalizacja DCB

    }

  • #7 28 Kwi 2009 19:05
    min_max
    Poziom 10  

    Odświeżam temat...

    Moja aplikacja trochę "przyrosła", wysyłane są i odbierane znaki, wszystko działa jak należy już, lecz mam jeszcze jeden problem. W tej chwili wysyłam zapytanie do oscyloskopu (oczywiscie po uprzednim poustawianiu parametrow transmisji i flag sterujących), następnie muszę "czekać" aż mi napłyną znaki do bufora, następnie je pobrać. W kodzie (oczywiście nie będę wszystkiego wklejać) mam to tak:

    * wysyłam dane do oscyloskopu (zapytanie) poprzez wywołanie odpowiedniej funkcji
    * "zamrażam" aplikacje na odpowiedni czas (w najdłuższym czasie na 8,5sek) co pozwala pochłonąć dane z oscyloskopu do pamięci, zwalniam aplikację aby pobrać dane z bufora

    Code:
    Sleep (8500);
    
    Read_Comm(hCommDev, &Number_Bytes_Read, sizeof(Buffer_I));
    (jesli zwolnie wczesniej to mi nie pobierze całości danych) i poźniej:
    Code:
    bool __fastcall Read_Comm(HANDLE hCommDev, LPDWORD lpNumberOfBytesRead, DWORD Buf_Size){
    
       DWORD nNumberOfBytesToRead;
       *lpNumberOfBytesRead = 0;
       ClearCommError(hCommDev, &Errors ,&Stat);
       if (Stat.cbInQue > 0){
          if (Stat.cbInQue > Buf_Size)
             nNumberOfBytesToRead = Buf_Size;
          else
             nNumberOfBytesToRead = Stat.cbInQue;
       }
       return ReadFile(hCommDev, &Buffer_I[0], nNumberOfBytesToRead, lpNumberOfBytesRead, NULL);
    }


    I tu moje pytanie, wiem że można użyć zdarzenia onRxChar (zdarzenie poru), aby wykryć koniec napływania danych, ponieważ oscyloskop ZAWSZE kończy pobierane dane znakiem 0x0A

    Czy ktoś pomógł by mi aby aplikacja "poszła" dalej dopiero w momencie wykrycia znaku 0x0A??

 
Black Friday do -15%
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME
Ferguson