Skocz do zawartości

[C#] Problem z wysyłaniem i odbieraniem znaków w sposób ciągły


Mors

Pomocna odpowiedź

Dzień dobry

Korzystam z tutorialowego kodu stąd:

https://forbot.pl/blog/port-szeregowy-interfejs-usart-czyli-komunikacja-mikrokontrolera-z-komputerem-id1122

Postanowiłem sobie przetestować program na 1 komputerze, na dwóch połączonych ze sobą modułach obsługujących komunikację szeregową, tak aby jeden nadawał, drugi odbierał i na odwrót. Uruchamiam do tego plik .exe dwa razy i po prostu na jednym porcie ustawiam jeden COM, a na drugim - drugi.

Jako że u mnie odbieranie i nadawanie pojedynczych znaków działa dobrze (to co wysyła jeden terminal, z powodzeniem odbiera drugi), postanowiłem nieco zmodyfikować program, dodając generowanie losowych znaków oraz ich wysyłanie jeden po drugim (ustaliłem sobie, że będzie to 1000 losowych znaków). Oto, co zrobiłem:

Fragment:

private void butSend_Click(object sender, EventArgs e) 
        { 
            if (port.IsOpen) 
            { 
                DodajKolorowy(rtbTerminal, ((Int32)numericSend.Value).ToString("X") + " ", System.Drawing.Color.Black); 
                Byte[] tosend = { (Byte) numericSend.Value}; 
                port.Write(tosend, 0, 1); 
            } 
            else System.Windows.Forms.MessageBox.Show("Aby wysłać bajt musisz ustanowić połączenie"); 
        }

zamieniłem na:

private void butSend_Click(object sender, EventArgs e)
        {

         Random rnd = new Random();

        if (port.IsOpen) //jeżeli połączenie jest aktywne...
            {

                  for (int i = 1; i <= 1000; i++)
                  {
                  int random = rnd.Next(0, 255); //utwórz losową zmienną z zakresu 0-255
                  string random_s = random.ToString("X2"); //i przypisz do zmiennej tekstowej w postaci hex-a dwupozycyjnego
                  Byte[] tosend = BitConverter.GetBytes(random); //zapisujemy losowe znaki do zmiennej tosend...
                  DodajKolorowy(rtbTerminal, DateTime.Now.ToString("HH:mm:ss ") + "Wysłany znak: " + random_s + "\n", System.Drawing.Color.DarkViolet); 
                  
                  port.Write(tosend, 0, 1);
                
                }
            } 
            else System.Windows.Forms.MessageBox.Show("Aby wysłać bajt musisz ustanowić połączenie"); 
        }


(być może to zbyt łopatologiczny sposób, ale oto, co uzyskałem):

- okazuje się, że po uruchomieniu programów, wybraniu 9600 prędkości i ustawieniu portów COM, a potem naciśnięciu przycisku następuje wysyłka 1000 znaków, jednakże to, co zostaje wyświetlone jako odebrane w jednym terminalu nie zgadza się z wysyłanym z drugiego terminala. Odebrana zostaje tylko część znaków (około 125, z tym że raz to może być właśnie 125, a innym razem np. 129 różniąc się nieznacznie - chyba znaki albo ich rozmiar muszą mieć jakieś znaczenie). Pozostałe brakujące znaki dochodzą dopiero po naciśnięciu ponownym przycisku jako "spóźnione", tak jakby utknęły gdzieś w buforze i nie załapały się na właściwy transport.

Nie chce mi się wierzyć, by to był jakiś sprzętowy problem, bo tak jak wspomniałem, znaki pojedyncze wysyłają się poprawnie - tj., na oryginalnym kodzie, albo gdy ustawię w pętli for liczbę taką, by wysyłał się pojedynczy znak. Jednak w przypadku gdy zmniejszę np. z 1000 na 100 znaków, to i tak ułamek z tych stu znaków zostanie odebranych. Co może być przyczyną takiej sytuacji?

Pozdrawiam serdecznie

Mateusz

Edytowano przez Mors
podpis
Link do komentarza
Share on other sites

34 minuty temu, Mors napisał:
string random_s = random.ToString("X2"); //i przypisz do zmiennej tekstowej w postaci hex-a dwupozycyjnego
                  Byte[] tosend = BitConverter.GetBytes(random); //zapisujemy losowe znaki do zmiennej tosend...

Przeczytaj ze zrozumieniem do skutku 😉 (i sprawdź jaki jest typ zmiennej random)

Edytowano przez H1M4W4R1
  • Lubię! 1
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.