Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Visual Studio Oprogramowywanie RS232 TextBox

kneht 22 Sep 2010 15:36 2329 4
  • #1
    kneht
    Level 2  
    Witam.

    Piszę aplikację której zadaniem jest komunikowanie się z ATmega32 i wyświetlanie odebranych informacji po RS232 w TextBoxie. I o ile komunikacja przebiega prawidłowo tzn. udaje mi się otrzymać informacje z portu COM i zapisać je w pliku txt o tyle nie potrafię odebranych informacji wyświetlić w TextBoxie.

    Zmienna z której chcę wyświetlić dane jest typu BYTE
    BYTE RS_buf=0; //bufor danej 


    Zapis do pliku realizuję poprzez
    fputc (RS_buf, fp);

    gdzie fp jest to wskaźnik do FILE

    Nie potrafię jednak wyświetlić tego na TextBoxie
    Próbuje to zrobić w następujący sposób:
    Text_Czujnik_Temperatury->Text=System::Convert::ToString(RS_buf); 


    Najlepiej byłoby gdyby zawartość TextBoxa aktualizowała się na bierząco tzn. po odebraniu znaku ten znak nie kasowałby wszystkiego z TextBoxa tylko dopisywał się...jednakże próbowałem już przy pomocy
    Text_Pomiar->AppendText(RS_buf);


    Próbowałem również odczytać plik do którego zapisuje i wyświetlic go ale również to nie przechodzi.

    std::fstream plik_odczyt;//fstream plik_zapis; 
    plik_odczyt.open("Pomiary.txt"); 
    Text_Czujnik_Temperatury->Text=System::Convert::ToString(plik_odczyt);

    W TextBoxie wyświetla mi się wtedy napis True.

    Próbowałem również wyświetlić stringa w podobny sposób
    std::string wyswietl; 
    wyswietl="wyswietlany tekst"; 
    Text_Czujnik_Temperatury->Text=System::Convert::ToString(wyswietl); 
    


    I to również nie działa. Byłbym wdzięczny gdyby mi ktoś podpowiedział w jaki sposób mogę zrealizować wyświetlanie RS_buf na TextBoxie najlepiej jeśli poprzez dopisywanie kolejnych znaków do zawartości TextBoxa

    Udało mi się rozwiązać problem przez:

    Text_Pomiar->Text=Text_Pomiar->Text + Convert::ToChar(RS_buf); 


    Jednakże proszę o nie zamykanie jeszcze tego tematu gdyż na pewno napotkam jeszcze jakieś trudności:|

    Napotkałem kolejny problem...nie wiem w jaki sposób miałbym zrealizować taką funkcję która co jakiś czas po uruchomieniu automatycznie by sie wywoływała. Tzn chodzi mi o to że odpalam przyciskiem zbieranie pomiarów i one co 100ms się zbierają i aktualizuje się treść TextBoxa...jednakże nie chodzi mi o to żeby po wciśnięciu przycisku program wpadł w pętle nieskończoną i nie reagował na żadne inne wciskania przycisków tylko żeby można było np zakończyć zbieranie pomiarów przez inny przycisk.. Muszę użyć wątków czy też da się to zrealizować jakoś łatwiej... jeżeli tak to w jaki sposób się za to zabrać...

    Próbowałem w taki :
    CreateThread(NULL, 0, Watek, &cout, 0, 0);
    pod Dev C++ udaje mi się uzyskać wielowatkowość jednakże tutaj to nie przechodzi...

    Będę wdzięczny za jakiekolwiek sugestie
  • Helpful post
    #2
    paczek86
    Level 14  
    kneht wrote:

    Napotkałem kolejny problem...nie wiem w jaki sposób miałbym zrealizować taką funkcję która co jakiś czas po uruchomieniu automatycznie by sie wywoływała. Tzn chodzi mi o to że odpalam przyciskiem zbieranie pomiarów i one co 100ms się zbierają i aktualizuje się treść TextBoxa...jednakże nie chodzi mi o to żeby po wciśnięciu przycisku program wpadł w pętle nieskończoną i nie reagował na żadne inne wciskania przycisków tylko żeby można było np zakończyć zbieranie pomiarów przez inny przycisk.. Muszę użyć wątków czy też da się to zrealizować jakoś łatwiej... jeżeli tak to w jaki sposób się za to zabrać...

    Próbowałem w taki :
    CreateThread(NULL, 0, Watek, &cout, 0, 0);
    pod Dev C++ udaje mi się uzyskać wielowatkowość jednakże tutaj to nie przechodzi...

    Będę wdzięczny za jakiekolwiek sugestie


    Z tego co widzę używasz managed C++. Zatem aby korzystać z wielowątkowości proponowałbym zainteresować się klasą Thread, zamiast funkcjami WinAPI (przykłady kodu znajdziesz :arrow: tutaj - na dole strony, w zakładce C++).

    Jednak opisaną funkcjonalność najprościej będzie zrealizować z wykorzystaniem komponentu Timer z Windows Forms. W procedurze obsługi zdarzenia 'Tick' zrealizujesz odczyt i dodawanie wyników do TextBoxa. Uruchamianie i zatrzymywanie akwizycji danych obsłużyć można poprzez metody 'Start' i 'Stop' klasy Timer, zaś okres próbkowania można ustawić we właściwości 'Interval'.
  • #3
    kneht
    Level 2  
    Dzięki wielkie paczek86 informacje były pomocne. Teraz napotkałem kolejny problem..mianowicie chcąc określić parametry transmisji stworzyłem sobie comboBoxa w którym mam podane określone szybkości i teraz mam problem z przekonwertowaniem tych wartości na int..próbowałem przy pomocy funkcji atoi oraz StrToInt ale nie wyszło

    
    int szybkoscTransmisji;
    string szybkosc = comboBox_Szybkosc->Text;
    szybkoscTransmisji=comboBox_Szybkosc->Text+Convert::ToInt32;
    


    generalnie chcę odczytać wybór z comboBoxa i poźniej użyć jej w taki sposób:

    
    dcb.BaudRate = szybkoscTransmisji;
    


    Ma ktoś jakieś sugestie??
  • Helpful post
    #4
    paczek86
    Level 14  
    kneht wrote:
    stworzyłem sobie comboBoxa w którym mam podane określone szybkości i teraz mam problem z przekonwertowaniem tych wartości na int..próbowałem przy pomocy funkcji atoi oraz StrToInt ale nie wyszło

    
    int szybkoscTransmisji;
    string szybkosc = comboBox_Szybkosc->Text;
    szybkoscTransmisji=comboBox_Szybkosc->Text+Convert::ToInt32;
    

    Funkcje atoi pochodzi z niezarządzanego C++ (a właściwie C), zaś StrToInt to jakaś borlandowska mutacja. W zarządzanym C++ nie uda się wykonać konwersji przy ich użyciu.

    kneht wrote:
    Ma ktoś jakieś sugestie??

    Poniższy sposób powinien zadziałać.
    
    int szybkoscTransmisji = Convert::ToInt32(comboBox_Szybkosc->Text);
    
  • #5
    kneht
    Level 2  
    Dzięki wielkie:) Póki co nie mam aktualnie problemów ,ale mam do Ciebie pytanie?? Jaką książkę byś polecił do nauki programowanie w Visualu..chodzi mi o to aby opisane w niej były Windowsowe formy z toolboxa i powiedzmy opisane korzystanie z narzędzi wbudowanych w Visuala np takiej konwersji jakiej dokonałeś. Do tej pory pisałem w C i było to głownie związane z mikrokontrolerami trochę C++ i assemblera ale generalnie trywialne rzeczy w Visualu sprawiają mi problemy.

    Dodano po 2 [godziny] 28 [minuty]:

    Napotkałem na kolejne problemy..mianowicie..
    Chciałbym w pliku zapisywać razem z pomiarami datę ich zebrania..

    usiłuję to zrobić przy pomocy fputc

    
    std::string Data;
    Data = Convert::ToString(System::DateTime::Now);
    fp=fopen("Pomiary.txt", "+a");
    if ((fp=fopen("Atrybuty.txt", "a+"))==NULL)
    fputs(Data,fp);
    fclose(fp);
    


    Jednak nie udaje mi sie to. W jaki sposób mógłbym to zrealizować ewentualnie jakich funkcji użyć??