Skocz do zawartości

RS458 i znikający ostatni znak


Pomocna odpowiedź

Napisano

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 

  }

 

 

(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
(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

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 :(.

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?

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ę). 

(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

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ć. 

@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.

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?

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...