Serial port - odbieranie danych TX -> RX

Masz problem z Arduino? Tutaj możesz szukać pomocy.
ODPOWIEDZ
wojciech_69
Młodszy majsterkowicz
Posty: 36
Rejestracja: 30 gru 2013, 14:28

Serial port - odbieranie danych TX -> RX

Post autor: wojciech_69 » 30 gru 2013, 14:47

Witam,

załóżmy, że chcę zrobić komunikację pomiędzy dwoma Arduino UNO R3. Zasada działania ma być taka, że jeżeli arduino_1 odbierze jakikolwiek (bądź konkretny) sygnał od arduino_2 wtedy wykona określoną czynność.

Zapoznałem się z tutorialem: http://majsterkowo.pl/serial-port/ jednak zastanawia mnie gdzie i jak podpiąć przewody RX oraz TX (wiem że RX -> TX; TX -> RX).?

W powyższym tutku nie ma biblioteki: <SoftwareSerial.h> oraz niema konkretnie zdefiniowanych pinów które mają wysyłać i odbierać dane np: SoftwareSerial mySerial(3, 2); // piny RX, TX , czy nie podając numerów pinów standardowo Arduino będzie się komunikować pinami oznaczonymi na "płytce" jako RX i TX?

Jestem początkujący w zabawie z Arduino więc proszę o jakieś konkrety.

PS. nie wiem czy nie mylę zagadnień, ale czym jest (wg tego na co wskazuje biblioteka SoftwareSerial) serial programowy a czym sprzętowy i jak się komunikują?

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


siwy2411
Młodszy majsterkowicz
Posty: 29
Rejestracja: 4 cze 2013, 14:56

Re: Serial port - odbieranie danych TX -> RX

Post autor: siwy2411 » 2 sty 2014, 19:59

Serial sprzętowy powinien być wykorzystany w projekcie, o ile nie ma ku temu przeciwwskazań. Dlaczego? Ponieważ jest on obsługiwany przez specjalne układy zawarte w mikrokontrolerze, a co za tym idzie nie obciąża samego mikrokontrolera swoim działaniem (a na pewno robi to w mniejszym stopniu niż Serial programowy). Serial sprzętowy a mikrokontrolerach atmega 8,328 i pokrewnych znajduje się na pinach 2 i 3 (RX oraz TX).

Serial programowy (np. ten z biblioteki SoftwareSerial) zapewnia taką samą funkcjonalność jak sprzętowy, jednak w tym celu wykorzystuje moc obliczeniową mikroprocesora, czyli potencjalnie może spowolnić wykonywanie reszty programu. Serial programowy może być włączony na praktycznie dowolnych pinach mikrokontrolera.

Czyli jeżeli nie wykorzystujesz pinów RX/TX w innym celu, oraz nie wykorzystujesz Seriala sprzętowego do komunikacji z komputerem to użyj sprzętowego, w przeciwnym razie użyj programowego.

EDIT: Oczywiście nie ma żadnych przeciwwskazań, żeby na jednym Arduino wykorzystać Serial sprzętowy, który będzie połączony z Serialem programowym na drugim Arduino, trzeba tylko oczywiście pilnować poprawnie ustawionego bauda.
wojciech_69
Młodszy majsterkowicz
Posty: 36
Rejestracja: 30 gru 2013, 14:28

Re: Serial port - odbieranie danych TX -> RX

Post autor: wojciech_69 » 3 sty 2014, 09:27

siwy2411, to podsumowując deklaracja i użycie sprzętowego wygląda w dużym skrócie następująco:
Serial.print("Ładny napis");
....
znak = Serial.read();
Serial.print(znak);
...
natomiast programowy należy zapisać następująco:
<SoftwareSerial.h>
SoftwareSerial mySerial(3, 2);
...
mySerial.print("Ładny napis");
...
znak = mySerial.read();
Serial.print(znak);
...
zgadza się?

Tylko jak się nie mylę w przypadku użycia sprzętowego, podczas wysyłki i odbioru danych migają diody RX oraz TX na Arduino natomiast używając programowego migania nie zaobserwujemy, zgadza się?
siwy2411
Młodszy majsterkowicz
Posty: 29
Rejestracja: 4 cze 2013, 14:56

Re: Serial port - odbieranie danych TX -> RX

Post autor: siwy2411 » 3 sty 2014, 14:47

oba Seriale przed użyciem należy uruchomić, konfigurując ich prędkość oraz ramkę transmisji danych, w przypadku Seriala sprzętowego np. poleceniem Serial.begin(9600); (po liczbie określającej prędkość transmisji można także użyć parametrów, jeżeli domyślna ramka (8 bitów danych, 1 bit stopu, brak bitu parzystości) nam nie odpowiada - więcej o tym można przeczytać tutaj - http://arduino.cc/en/Serial/Begin ), w przypadku SoftwareSerial na pewno bardzo podobnie, jeżeli nie identycznie - nie powiem dokładnie, bo nigdy nie używałem Seriala programowego. Poza tym, podane przez Ciebie kody są poprawne.
co do diod - masz rację, wynika to z prostego faktu, że diody zawarte na płytce są po prostu podłączone do linii sprzętowego Seriala RX/TX i dlatego migają podczas transmisji. Jeżeli podłączysz Serial programowy pod linie, na których też podłączysz diody to również zaobserwujesz takie miganie pokazujące transmisję danych.
wojciech_69
Młodszy majsterkowicz
Posty: 36
Rejestracja: 30 gru 2013, 14:28

Re: Serial port - odbieranie danych TX -> RX

Post autor: wojciech_69 » 3 sty 2014, 15:13

Tak wiem, że najpierw należy je uruchomić.

siwy2411, a jak wytłumaczyć następujący przypadek... Podłączyłem się moim Arduino przewodami RX i TX do 2 i 3 pinu COMa mojego netbooka (przejściówka z usb na rs232), odpaliłem konsole dla Arduino oraz netbooka i gdy w Arduino wysyłam jakiś ciąg znaków np:
Serial.print("Ciąg znaków");
to netbook odczytuje to jako ciąg dziwnych, porozrzucanych znaków np: "uy=.*gky yu". Tak samo, gdy próbuję wysłać cokolwiek z netbooka w drugą stronę (pojedyncze litery).

Dodam, iż w Arduino oraz netbooku prędkość jest identyczna: 9600.

Czy to możliwe, że dzieje się ponieważ do komunikacji muszę użyć jakiegoś układu np MAX232N, czy powinno hulać również bez tego?
siwy2411
Młodszy majsterkowicz
Posty: 29
Rejestracja: 4 cze 2013, 14:56

Re: Serial port - odbieranie danych TX -> RX

Post autor: siwy2411 » 3 sty 2014, 23:01

hmmm... używasz przejściówki usb<->uart czy przejściówki usb<->rs232 i potem kabelkami z rs232 do układu?
wojciech_69
Młodszy majsterkowicz
Posty: 36
Rejestracja: 30 gru 2013, 14:28

Re: Serial port - odbieranie danych TX -> RX

Post autor: wojciech_69 » 4 sty 2014, 08:31

Jak pisalem wczesniej, uklad bezposredmio podpiety pod przejsciowke usb-rs232.
siwy2411
Młodszy majsterkowicz
Posty: 29
Rejestracja: 4 cze 2013, 14:56

Re: Serial port - odbieranie danych TX -> RX

Post autor: siwy2411 » 4 sty 2014, 13:56

na 99% musisz przepuścić te sygnały przez jakiś konwerter np. max232
za wikipedią:
"Specyfikacja napięcia [szyny RS-232] definiuje "1" logiczną jako napięcie -3V do -15V, zaś "0" to napięcie +3V do +15V."
a atmega działa na logice 0/5V. jeżeli miałeś pecha to mogłeś czasami usmażyć atmegę.
jaffar
Młodszy majsterkowicz
Posty: 43
Rejestracja: 10 sty 2013, 18:21

Re: Serial port - odbieranie danych TX -> RX

Post autor: jaffar » 4 sty 2014, 14:49

Na pewno masz dobrze ustawione bity stopu i wielkość ramki danych?
Arturr300
Starszy majsterkowicz
Posty: 307
Rejestracja: 16 paź 2013, 17:24

Re: Serial port - odbieranie danych TX -> RX

Post autor: Arturr300 » 4 sty 2014, 16:45

Dlaczego nie możesz podłączyć po prostu przez USB?
hertzh1
Majsterkowicz
Posty: 62
Rejestracja: 29 sty 2014, 12:23

Re: Serial port - odbieranie danych TX -> RX

Post autor: hertzh1 » 29 sty 2014, 12:49

witam chciałem połączyć atmegę 328p z przejściówką usb-rs232 rozumiem już że wykorzystanie pinów rx i tx jest niemożliwe (różnica napięć) widziałem jednak w jakimś przykładzie że koś używał softserial do obsługi komend AT z elefonem motorola. Czy w związku z tym zwykły rs (nie konwerter z usb) używwa innych napięć. Do tej pory połączenie atmegi z konwererem rs232-usb powodowało wyświetlanie samych krzaczków (używając sofserial jak i pinów x rx). Ze względu na to że stawiam pierwsze kroki w mikrokonrolerach chciałbym wiedzieć czy konieczne jest użycie konwersji uart rs232 czy może wystarczą jakieś oporniki? A może lepiej zastosować konwerer usb - uart? Kolejny dzień walczę z tematem i nadal krzaczki w erminalu.
hertzh1
Majsterkowicz
Posty: 62
Rejestracja: 29 sty 2014, 12:23

Re: Serial port - odbieranie danych TX -> RX

Post autor: hertzh1 » 29 sty 2014, 18:42

Wiem że mając układ max323 mogę zrobić konwersje, chodziło mi jednak o to, że w tym jednym artykule (niestety nire mogę wrzucić linku) udało się porozumieć z urządzeniem (telefonem) bez takiego układu. Chciałbym wiedzieć czy telefon posługuje się uart'em, czy rs232?
hertzh1
Majsterkowicz
Posty: 62
Rejestracja: 29 sty 2014, 12:23

Re: Serial port - odbieranie danych TX -> RX

Post autor: hertzh1 » 31 sty 2014, 14:21

Dziękuję za pomoc. Udało mi się znaleźć stronę na której zostało dobrze wyjaśnione dlaczego nie można połączyć kontrolera bezpośrednio z rs232. Po krotce można to powiedzieć tak dla mikrokontrolerów (w tym Arduino) napięcie dla stanu niskiego (logiczne 0) jest około 0V, a dla stanu wysokiego (logiczne 1) jest to napięcie bliskie napięciu zasilania. Natomiast dla rs232 zakres stanu niskiego jest od -3V do -25V a dla wysokiego jest to +3V do +25V. Jest to dużo więcej niż może przeżyć nasz mikrokontroler. Mimo iż sygnał może mieć to samo kodowanie to różnice w napięciach powodują że jest on nie zrozumiały między urządzeniami. Dodatkowo Atmegi (nie wszystkie, większość stosowanych z Arduino IDE) mogą wytrzymać max -0,5v
Proszę kolegów o wyrozumiałość, że to co przytaczam nie jest zbyt ścisłe, ale są to informacje podstawowe, jakie mogą oszczędzić początkującym wiele poszukiwań.
ODPOWIEDZ

Strony partnerskie: