Skocz do zawartości

RS458 i znikający ostatni znak


DCH

Pomocna odpowiedź

Potrzebuję pomocy z komunikacją dwóch Arduino po RS485. Mam podpięte do nich dwa konwertery UART – RS485: https://botland.com.pl/konwertery-usb-uart-rs232-rs485/4496-konwerter-uart-rs485-33v-arkrj11-waveshare-4777-5904422371463.html. W obu przypadkach konwertery są podpięte pod złącza TX (0) / RX (1) – czyli używam Serial1. Pin 2 jest stosowany do ustawiania stanu nadaje / słucha.

Problem:

- gdy po stronie nadawcy robię Serial1.print(„zxxcbb123$%^qw”); to po stronie odbiornika odbieram tekst „zxxcbb123$%^q” (bez ostatniego znaku) z dopisanym znakiem o kodzie HEX: ff;

- gdy po stronie nadawcy robię Serial1.println(„zxxcbb123$%^qw”); to po stronie odbiornika odbieram tekst „zxxcbb123$%^qw” (już z ostatnim zanikiem), znak 0d (CR) i znak o kodzie HEX: ff – nie ma za to spodziewanego 0a (LF);

Innymi słowy wygląda tak jakby w transmisji był ucinany ostatni znak a zamiast niego był wtawiany ten o kodzie HEX: ff.

Co robię źle?

 

PS. Po stronie odbiorcy kod jest prosty:

 

char character;

String message;

message = "";

  while (Serial1.available() > 0) {

    character = Serial1.read();

    message += character;

    Serial.write(character); //drukowanie na łącze szeregowe z USB 

  }

 

 

Link do komentarza
Share on other sites

(edytowany)

w sensie RX do TX i vice versa? I puścić tę samą komunikację po tak podłączonych arduino?

Problem w tym że jeda płytka to 3,3V a druga to 5V więc co najwyżej mogę zrobić tak przez konwerter poziomów logicznych.

Edytowano przez DCH
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

(edytowany)

Sprawdź jeszcze, czy w danym momencie przesyłasz dane na pewno tylko w jedną stronę. Ten konwerter RS485 pracuje w trybie half-duplex, czyli w danej chwili może transmitować dane tylko w jednym kierunku. Inaczej będą błędy. 

Edytowano przez jand
Link do komentarza
Share on other sites

dane przesyłam na 100% w jedną stronę. Jedno urządzenie tylko nadaje - co 2 sekundy. Drugie urządzenie tylko odbiera. Tryb odbioru i zapisu też są odpowiednio ustawione.

Samo podłączenie bezpośrednio daje inny wynik - poprawny. Nie ma żadnych dodatkowych czy podmienionych znaków. To co wysyłam dociera. Czyli jakby to konwertery podmieniały ten ostatni znak. W dokumentacji konwertera niestety nic na ten temat nie ma :(.

Link do komentarza
Share on other sites

I już coś wiemy.

Sam konwerter RS485 nie może nic podmieniać, bo jest za głupi. To coś na kształt wzmacniacza. Natomiast może zniekształcać sygnał - on, albo połączenia.

Jak zamienisz konwertery RS485 miejscami (ten z jednego Arduino do drugiego i na odwrót), to błąd się również przenosi na ten drugi, czy też nie?

Link do komentarza
Share on other sites

w obu konwerterach mam SP3485. Zamiana miejscami, zmiana kabli na inne - nic nie pomogło. Cały czas ten sam efekt.

Próbowałem też podłączyć inny konwerter SparkFun BOB-10124 ale nieskutecznie. Tak jakby nie działał (albo ja nie umiem go podłączyć choć wydaje mi się, że dobrze to robię). 

Link do komentarza
Share on other sites

(edytowany)

SparkFun BOB-10124 też ma układ SP3485.

A spróbuj zasilić oba konwertery z 3,3V. Co prawda SP3485 ma dopuszczalne napięcie zasilania +6V, ale jednak  to nominalnie układ na 3,3V.

Edytowano przez jand
Link do komentarza
Share on other sites

dobra, chyba rozgryzłem. Były dwie przyczyny problemu:

1. różna prędkość transmisji na USB/COM oraz UART w aplikacji działającej na Arduino. Wychodzi na to, że jeżeli dwa Arduino komunikują się po UART np. z prędkością 115200 to puszczanie komunikatów (np. w celu odczytania na komputerze) na USB w prędkości 9600 nie jest dobrym pomysłem.

2. sposób wysyłania ciągu znaków. Jeżeli wysyłamy zmienną String lub char[] to działy się jazdy z podmianką ostatniego znaku. Gdy wysyłałem znak po znaku to problem nie występował.

BOB-10124 niestety nie udało mi się uruchomić. 

Link do komentarza
Share on other sites

@jand nie mam zielonego pojęcia :(. Ale jak wiesz to chętnie się dowiem 🙂

PS BOB-10124 odpalony. Okazuje się, że podłączenie TX / RX pomiędzy płytką a Arduino trzeba zrobić krzyżowo.

Link do komentarza
Share on other sites

8 minut temu, DCH napisał:

jak wiesz to chętnie się dowiem

Nie wiem. Choć dla mnie jest to przesłanka, że problem leży całkiem gdzie indziej. Nie potrafię sobie wyobrazić, w jaki sposób znalezione przez Ciebie rozwiązania mogą mieć coś wspólnego z tego typu błędami.

Nie jest też dla mnie całkiem jasne, czy żeby te błędy zanikły to trzeba zastosować naraz oba te rozwiązania, czy też wystarczy dowolne z nich?

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.