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.

Builder C++ + RS232 - przeróbka programu z konsoli na okienk

kasaidolar 20 Maj 2008 17:03 3600 12
  • #1 20 Maj 2008 17:03
    kasaidolar
    Poziom 19  

    Witam serdecznie kolegów!
    Postanowiłem przestać bawić sie tylko AVRami i zrobic cos na kompie :) Cale życie programuje w Builderze ale robie zawsze programy konsolowe. Chciałbym teraz przerobić taki program:

    Code:

    //---------------------------------------------------------------------------

    #include <vcl.h>
    #pragma hdrstop
    #include <windows.h>
    #include <stdio.h>
    //---------------------------------------------------------------------------

    #pragma argsused
    int main()
    {
       HANDLE hCom;    //uchwyt portu
       DCB dcb;        //konfiguracja portu
       BOOL fSuccess;  //flaga pomocnicza
       BYTE RS_buf;    //bufor danej
       DWORD RS_ile;   //ilosc bitow wyslanych
       
       //otwarcie portu COM2 z prawami RW
       hCom = CreateFile( TEXT("COM2"), GENERIC_READ | GENERIC_WRITE,
            0,    // exclusive access
            NULL, // default security attributes
            OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

       //pobranie aktualnych ustawien portu
        GetCommState(hCom, &dcb);

       //ustawienie naszej konfiguracji
       dcb.BaudRate = CBR_9600;     // predkosc transmisji           2400
       dcb.ByteSize = 8;             // ilosc bitow danych
       dcb.Parity = NOPARITY;        // brak bitu parzystosci
       dcb.StopBits = TWOSTOPBITS;    // dwa bity stopu

       SetCommState(hCom, &dcb);

       
       while(1)
       {           
            ReadFile( hCom, &RS_buf, 1, &RS_ile, 0);

          if(RS_ile==1)
          {
             if(RS_buf == 1)   break;
             printf("%c", RS_buf);
          }
       }
       return 0;
    }
    //---------------------------------------------------------------------------


    na taki w okienkach :). Ogolnie chce wyswieltac w formie wykresu dane nadsylane z RSa :).
    Doszedlem do momentu w okienkach ze mam wykres i moge przyciskiem rysowac dane ale takie jak podam na sztywno.. Nie umiem wyciagnąć z mojego wczesniejszego porgramu danych na okienka :) Bardzo prosze o pomoc - kilka wskazowek :) Pozdrawiam

    0 12
  • #2 20 Maj 2008 17:14
    JIIIS
    Poziom 16  

    nie za bardzo rozumiem, jaki komponent chcesz uzyc do wykresu, jak przechowujesz dane, jak probujesz wyswietlac dane na wykresie?

    0
  • #3 20 Maj 2008 17:39
    kasaidolar
    Poziom 19  

    Juz wszystko tlumacze. Mam napisany program jak powyzej. Program wyswietla w konsoli to co przyjdzie z uC po rs232 (0.... 1023) - ale to przychodzi raczej jako string.
    Ja chce zrobic program na okienkach uzywając komponentu Chart aby te dane z RS wyswieltal na wykresie.

    Jestem na etapie takim że program powyzej dobrze otwiera mi port com, dobrze zczytuje dane. Chciałbym aby te dane były wyświetlane w okienkach - powiedzmy zeby chociaz w pierwszej kolejności gdzieś mi wypisywal na okienku co dostal.
    W okienku uzywam takiej procedury:

    Code:
    void __fastcall TForm1::Button1Click(TObject *Sender)
    
    {
    Form1->Chart1->Series[0]->Add(ZMIENNA_Z_RS232) ;
    }


    Gdy zmienna jest ustawiona na sztywno to po nacisnieciu przycisku spokojnie rysuje punkt po punkcie ale nie chce rysowac zmiennej odebranej z RS232 - uzywam tez funkcji atoi ale tez nie pomaga :) Gdzies cos robie zle :)

    0
  • #4 20 Maj 2008 17:46
    erl
    Poziom 12  

    A jak wygląda wczytywanie wartości do zmiennej ? Najlepiej zamieść cały kod albo wyśli na maila.

    0
  • #5 20 Maj 2008 17:56
    kasaidolar
    Poziom 19  

    Staram sie w ten sposob to zrobic:

    Code:

    //---------------------------------------------------------------------------

    #include <vcl.h>
    #pragma hdrstop

    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;


    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    Form1->Chart1->Series[0]->Add(500) ;
    }
    //---------------------------------------------------------------------------

    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
            HANDLE hCom;    //uchwyt portu
            DCB dcb;        //konfiguracja portu
            BOOL fSuccess;  //flaga pomocnicza
            BYTE RS_buf;    //bufor danej
            DWORD RS_ile;   //ilosc bitow wyslanych

       //otwarcie portu COM2 z prawami RW
       hCom = CreateFile( TEXT("COM2"), GENERIC_READ | GENERIC_WRITE,
            0,    // exclusive access
            NULL, // default security attributes
            OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

       //pobranie aktualnych ustawien portu
        GetCommState(hCom, &dcb);

       //ustawienie naszej konfiguracji
       dcb.BaudRate = CBR_9600;     // predkosc transmisji           2400
       dcb.ByteSize = 8;             // ilosc bitow danych
       dcb.Parity = NOPARITY;        // brak bitu parzystosci
       dcb.StopBits = TWOSTOPBITS;    // dwa bity stopu

       SetCommState(hCom, &dcb);


            int zmienna;


            ReadFile( hCom, &RS_buf, 1, &RS_ile, 0);

            zmienna = atoi( &RS_buf );

            Form1->Chart1->Series[0]->Add(zmienna);
    }
    //---------------------------------------------------------------------------

    0
  • Pomocny post
    #6 20 Maj 2008 18:08
    JIIIS
    Poziom 16  

    nie mam jak sprawdzic tego programu, ale hm, moze sprobuj najpierw wyswietlic na labelce co ci przychodzi z portu:

    Label1->Caption = RS_buf;

    nie wiem, czemu uzywasz atoi skoro RS_buf jest typu liczbowego (BYTE), chyba, ze ma byc stringiem :P

    0
  • Pomocny post
    #7 20 Maj 2008 23:46
    Fyszo
    Spec od GSM

    Utwórz tablicę danych, a po odebraniu danych wyświetlaj wszystko. Wystarczy tylko że do kodu który posiadasz, dodasz kopiowanie odebranej wartości do tablicy. A potem z tablicą możesz robić co chcesz.

    0
  • #8 21 Maj 2008 00:06
    kasaidolar
    Poziom 19  

    Staram sie to zrobic od jakis pieciu godzin :) Mam chyba jakas zla ta funkcje 'czytania' - nie umiem wpisac do tablicy tych danych ktore potrzebuje... Robilem tak:

    Code:
          while(1)
    
       {
            //printf("\n");
            fSuccess = ReadFile( hCom, &RS_buf, 1, &RS_ile, 0);
            if (!fSuccess)
            {
                printf ("ReadFile failed with error %d.\n", GetLastError());
                return 5;
            }

          if(RS_ile==1)
          {
             if(RS_buf == 1)   break;

             bufor[j]=RS_buf;
             j++;
           //  printf("%c", RS_buf);
          }
          if(j>2)
          j =0;
          zmienna1 = atoi(bufor);
          printf("%d ", zmienna1);
       }


    Ale nie dziala :)

    0
  • #10 21 Maj 2008 15:15
    kasaidolar
    Poziom 19  

    Ja nie bardzo rozumiem funkcję ReadFile. Ona pobiera chyba po jednym znaku i przy nastepnym wywolaniu pobiera kolejny - tak mi sie wydaje. Jesli tak jest musze te znaki jako ascii gdzies zapisac zeby zrobic z tego int'a. Np dostaje 4 5 7 (w ascii czyli 52 53 55) a chce miec 457 inta zeby do wykresu wrzucic. Czasami procek wysyla mi jedna cyfre czasami dwie trzy lub cztery i mam problem zeby to ogarnac :)

    0
  • Pomocny post
    #11 21 Maj 2008 15:53
    Dżyszla
    Poziom 42  

    ReadFile odczytuje z przypisanego pliku (portu) dane zapisując je pod adresem pierwszej zmiennej w ilości w 3 parametrze. Ilość faktycznie zapisanych znaków jest zachowywana pod adresem zmiennej drugiej... Nie wiem, co może ostatni parametr znaczyć.
    Aczkolwiek jeśli odbierasz znaki będące cyframi, to aby wyliczyć wartość wystarczy:

    Code:

    wynik=0;
    while (...)
    {
       char znak_cyfra=ReadFile(...)
       if (znak_cyfra>='0') && (znak_cyfra<='9')
           wynik=wynik*10+znak_cyfra-'0';
       else
         Błąd();
    }
    To co jest u Ciebie to najpierw porównywanie zmiennej RS_buf z 1 ... no chyba, że 1 jest separatorem, a reszta faktycznie może być wyłącznie z przedziału '0' do '9'. Niemniej wolałbym deklarację tego buff zobaczyć oraz specyfikację przesyłanych danych.

    0
  • #12 21 Maj 2008 19:36
    kasaidolar
    Poziom 19  

    Praktycznie każda wasza podpowiedz okazała sie trafna :)

    Poniżej działający kod:

    Code:

    //---------------------------------------------------------------------------

    #include <vcl.h>
    #pragma hdrstop
    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    //---------------------------------------------------------------------------

    #pragma argsused
    int main()
    {
       HANDLE hCom;    //uchwyt portu
       DCB dcb;        //konfiguracja portu
       BOOL fSuccess;  //flaga pomocnicza
       BYTE RS_buf;    //bufor danej
       DWORD RS_ile;   //ilosc bitow wyslanych
       
       //otwarcie portu COM2 z prawami RW
       hCom = CreateFile( TEXT("COM2"), GENERIC_READ | GENERIC_WRITE,
            0,    // exclusive access
            NULL, // default security attributes
            OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);


       //pobranie aktualnych ustawien portu
        GetCommState(hCom, &dcb);

       //ustawienie naszej konfiguracji
       dcb.BaudRate = CBR_9600;     // predkosc transmisji           2400
       dcb.ByteSize = 8;             // ilosc bitow danych
       dcb.Parity = NOPARITY;        // brak bitu parzystosci
       dcb.StopBits = TWOSTOPBITS;    // dwa bity stopu

       SetCommState(hCom, &dcb);


      char bufor[6];
      int j = 1;
      int zmienna1;

      printf(" Czekam na pierwszy znak... \n ");

    while (1)

        {

            j=1;

       ReadFile( hCom, &RS_buf, 1, &RS_ile, 0);
       if(RS_ile == 1)
       {
            if(RS_ile == 1)
            {
            bufor[0]=RS_buf;
            }

       bufor [0]= RS_buf;

       while(RS_ile == 1)
       {

            ReadFile( hCom, &RS_buf, 1, &RS_ile, 0);

            if(RS_ile == 1)
            {
            bufor[j]=RS_buf;
            j++;
            }

            if(RS_ile==0)
            {
            bufor[j]='\0';
            }

       }

            for(int i = 0; i < j ; i++)   // bez +1
            {
            printf("%d ", bufor[i]);
            }

            zmienna1 = atoi(bufor);
            printf("Wynik = %d ,", zmienna1);
           
         }

           }

       getch();
       return 0;
    }
    //---------------------------------------------------------------------------8


    Mając juz zmienna1 moge ja wyswietlac w wykresie :) Dziekuje Wam za poswiecony czas :) Temat zamykam. Pozdrawiam!

    Dodano po 4 [minuty]:

    A czy wiecie moze jak w builderze w wykresie Chart zrobic tak ze jak dojdzie wykres do konca skali to ma caly sie wyczyscic i dalej rysowac od poczatku?

    Dodano po 10 [minuty]:

    ok juz wiem :) Clear();

    0
  • #13 10 Lip 2008 20:05
    qasar1
    Poziom 9  

    czesc powiedz mi co źle robie osmieliłem sie skorzystac z twojego rozwiązania ale nie łapie mi bajtów - na RS_ile wywala mi cagle zero nie pojmuje tego a na konsolowym programie jest wszystko własnie ok
    może czegos nie widze jestem 24 h na nogach :)

    przyReadFile( hCom, &RS_buf, 1, &RS_ile, 0);
    Memo1->tekst = RS_ile
    if(RS_ile == 1)
    {
    if(RS_ile == 1)
    {
    bufor[0]=RS_buf;
    }
    .
    .
    .

    0
TME logo Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME
TME Logo