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

C# konwersja zmiennej odebranej przez RS232 na liczbę.

pitboo 24 Lis 2013 18:10 1878 11
  • #1 24 Lis 2013 18:10
    pitboo
    Poziom 12  

    Uczę się programować w Visual Studio C#. Napisałem program odbierający dane z układu mikroprocesorowego. Dane to wartości temperatury z czujnika. I tu pojawił się problem gdyż odebrane dane z RS232 są typu string i przy wyświetlaniu otrzymuje znaki ASCII. Próbowałem sposobów z konwersją zmiennych. Program się skompilował bez błędów jednak gdy odbieram pierwszą dana program wysypuje się z błędem.

    Dana odebrana jest zdefiniowana jako

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Próbowałem ją skonwertować tą linijką
    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    i otrzymuje komunikat o błędzie:

    "An exception of type 'System.FormatException' occurred in mscorlib.dll but was not handled in user code

    Additional information: Nieprawidłowy format ciągu wejściowego.

    If there is a handler for this exception, the program may be safely continued."

    0 11
  • #2 24 Lis 2013 18:56
    -rafal-
    Poziom 14  

    Podaj może cały projekt z VS to może jakoś pomożemy bo to co napisałeś to mało mówi, a konwersja jaką używasz jest ok i u mnie działa.

    Dokładniej:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    0
  • #3 24 Lis 2013 21:19
    cepelia
    Poziom 20  

    to ja z innej beki... jak w microkontrolerze stworzyłeś ramkę do wysłania znaku do programu ??

    0
  • #4 24 Lis 2013 22:05
    pitboo
    Poziom 12  

    -rafal- napisał:
    Podaj może cały projekt z VS to może jakoś pomożemy bo to co napisałeś to mało mówi, a konwersja jaką używasz jest ok i u mnie działa.

    Dokładniej:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Sprawdzę w najbliższym czasie ... i dam znać czy zadziałało bo nie znałem dokładnej składni tej komendy ;]

    0
  • #5 24 Lis 2013 22:11
    -rafal-
    Poziom 14  

    pitboo napisał:
    -rafal- napisał:
    Podaj może cały projekt z VS to może jakoś pomożemy bo to co napisałeś to mało mówi, a konwersja jaką używasz jest ok i u mnie działa.

    Dokładniej:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Sprawdzę w najbliższym czasie ... i dam znać czy zadziałało bo nie znałem dokładnej składni tej komendy ;]


    To jest tylko przykład tego jak ja użyłem, lepiej powiedz faktycznie jak budujesz ramkę bo ma to istotne znaczenie a jeszcze lepiej zamieść projekty.

    0
  • #6 24 Lis 2013 22:18
    pitboo
    Poziom 12  

    cepelia napisał:
    to ja z innej beki... jak w microkontrolerze stworzyłeś ramkę do wysłania znaku do programu ??


    Trochę nie rozumiem pytania. Ramkę po prostu cyklicznie wysyłając kolejne znaki. Ja zbudowałem sobie system urządzeń o różnych funkcjach i na PC robię synoptykę do tych urządzeń. Ramkę złożyłem sobie sam nie staram się komunikować z jakimś profesjonalnym urządzeniem więc nie wdawałem się w tematy protokołów tylko utworzyłem sam. Zamysł jest taki że w pierwszej danej wysyłany jest adres urządzenia identyfikujący je, w drugiej zmiennej wysyłana jest komenda a w trzeciej zmiennej wysyłam wartość czegoś. Dwa pozostałe bity będą przeznaczone na CRC. Na mikroprocesorze zrealizowałem to tak ale jeszcze nie mam przetestowanego do końca. Ogólnie w poprzednim projekcie który działał robiłem to tak

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    a ramkę wysyłałem tak

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Jeśli jest coś niezrozumiałe to pytaj pomogę. Nebawem opiszę projekt krok po kroku na mojej stronce www.mikroprocesory.info.pl Zapraszam

    Tak teraz czytam. Pytasz o ramkę czy znak ??? Bo znak to po prostu wysyłam 8 bitową zmienną. a ramka to kilka znaków po sobie

    0
  • Pomocny post
    #7 24 Lis 2013 22:25
    -rafal-
    Poziom 14  

    Czy ja dobrze rozumiem czy Ty chcesz RS232 równolegle łączyć ? ;o do tego to się używa RS485 tam masz Mastera i reszta Slave na RS232 takiego czegoś nie ma...
    Pokarz jak odbierasz w VS.

    0
  • #8 24 Lis 2013 22:30
    pitboo
    Poziom 12  

    -rafal- napisał:
    pitboo napisał:
    -rafal- napisał:
    Podaj może cały projekt z VS to może jakoś pomożemy bo to co napisałeś to mało mówi, a konwersja jaką używasz jest ok i u mnie działa.

    Dokładniej:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Sprawdzę w najbliższym czasie ... i dam znać czy zadziałało bo nie znałem dokładnej składni tej komendy ;]


    To jest tylko przykład tego jak ja użyłem, lepiej powiedz faktycznie jak budujesz ramkę bo ma to istotne znaczenie a jeszcze lepiej zamieść projekty.


    Wcześniej pisałem w Codegear 2009 c++ i nie miałem takiego problemu ale było to kilka lat temu teraz wziąłem się za coś nowego C# visual studio i prawdę mówiąc w VS ramka jeszcze nie powstała na razie starałem się odebrać cyklicznie wysyłaną wartość temperatury z uP czyli 8 bitową zmienną. Niestety w VS odbieram Stringa z rs232 i nie wiedziałem co z nim zrobić bo z uP wysyłałem 8 bitową zmienną liczbową z wartością temperatury a w tej chwili program w VS wygląda tak.

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #9 24 Lis 2013 22:36
    -rafal-
    Poziom 14  

    Ale kombinujesz... przeglądnij to to może sam dojdziesz dlaczego CI nie działa (parę zbędnych rzeczy jak dla Ciebie ale może się połapiesz.)

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Ten kod działa na 100% a u Ciebei brakuje zdaje się:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    0
  • #10 24 Lis 2013 23:02
    pitboo
    Poziom 12  

    -rafal- napisał:
    Ale kombinujesz... przeglądnij to to może sam dojdziesz dlaczego CI nie działa (parę zbędnych rzeczy jak dla Ciebie ale może się połapiesz.)

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Ten kod działa na 100% a u Ciebei brakuje zdaje się:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Pod COM faktycznie mam podpiętego MAX485. Przepływem danych steruje linią RTS. i transmisja działa w 100% wysyłam i odbieram dane tylko te odebrane traktowane są jak char zamiast jak liczba. Nie rozumiem kodu z twojej sugestii. Port COM parametryzuję z poziomu designe więc parity i bity stopu tam sobie ustawiam. Co powoduje ta linijka ???
    Kod: csharp
    Zaloguj się, aby zobaczyć kod
    Ja korzystałem z samouczków z neta i też nie do końca kumam wszystkie moje linijki ale wydaje mi sie że linia którą mi sugerujesz odpowiada za przerwanie wywołujące zdarzenie gdy odebrane zostaną dane przez COM'a. U mnie niby tą funkcję miała pełnić
    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Ja myślę że twoja sugestia odnośnie konwersji ze string na int wyczerpie mój temat ... tylko sprawdzić dopiero jutro będę mógł bo nie chce rozkładać dzisiaj znowu wszystkiego ;]. Te parametry repleace przy konwertowaniu chyba są kluczowe dlatego mi się kompiluje ale jak przyjdzie dana to mi wywala.

    0
  • Pomocny post
    #11 24 Lis 2013 23:36
    -rafal-
    Poziom 14  

    Ta linijka tak jak mówisz przypisuje zdarzenie odebrania danych na porcie które odbywa się w nowym wątku. Co do metod Replace(); w moim kodzie odpowiadają one tylko i wyłącznie za skasowanie znaku powrotu karety i końca linii (CR+LF) i szczerze wątpię aby rozwiązało to Twój problem.

    0
  • #12 25 Lis 2013 00:30
    pitboo
    Poziom 12  

    Problem rozwiązałem. Dzięki ci -rafal-. Ukierunkowałeś mnie i nakierowałeś na problem. Problemem i głównym moim błędem było stosowanie metody odczytu danych z portu COM jako

    Kod: csharp
    Zaloguj się, aby zobaczyć kod
    co wymusza typ zmiennej DanaOdebrana jako string. Zmieniłem metodę odczytu na
    Kod: csharp
    Zaloguj się, aby zobaczyć kod
    czyli faktycznie na to na czym mi zależało. Odbiorze bajtu w formie binarnej jako wartości liczbowej. Problem wynikał z niezrozumienia kodu z samouczka. Drążąc temat dotarłem do różnych metod odczytu danych z portu COM a myślałem że jest jedna jak w samouczku sugerowali. Dziękuję za pomoc i pozdrawiam.

    0