Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1

Użytkownik


Witam!
Mam problem z ustawieniem odpowiednich parametrów transmisji między debianem, a arduino, które jest podłączone do portu szeregowego komputera. Chcę do arduino wysłać cyfrę "1" takim poleceniem:
echo '1' > /dev/ttyUSB0
Przed wywołaniem powyższego polecenia ustawiłem następjące parametry transmisji:
stty -F /dev/ttyUSB0 9600 --> prędkość transmisji stty -F /dev/ttyUSB0 parodd --> brak bitu parzystości stty -F /dev/ttyUSB0 cs8 --> rozmiar znaku 8 bitów stty -F /dev/ttyUSB0 -cstopb --> 1 bit stopu stty -F /dev/ttyUSB0 crtscts --> sprzętowa kontrola przepływu
Powyższe polecenie można zastąpić jednym:
stty -F /dev/ttyUSB0 9600 parodd cs8 -cstopb crtscts
Po wywołaniu powyższego polecenia sprawdziłem aktualnie ustawienia
root@pic:/home/pic# stty -F /dev/ttyUSB0 9600 parodd cs8 -cstopb crtscts root@pic:/home/pic# stty -F /dev/ttyUSB0 -a speed 9600 baud; rows 0; columns 0; line = 0; intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0; parenb parodd cs8 hupcl -cstopb cread clocal crtscts -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel -iutf8 -opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 -isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke root@pic:/home/pic#
Jak widać ustawienia zostały zapisane, ale w dalszym ciągu nie mogę wysłać do arduino cyfry "1"
Jeżeli do komunikacji używam minicom-a to wszystko działa ok. Ustawienia parametrów transmisji w minicom są takie:
kom| A - Urządzenie szeregowe : /dev/ttyUSB0 |
Port| B - Lokalizacja pliku blokującego : /var/lock |
| C - Program Callin : |
Wciś| D - Program Callout : |
| E - Bps/Parzystość/Bity : 9600 8N1 |
| F - Sprzętowa kontrola przepływu : Tak |
| G - Programowa kontrola przepływu : Nie |
| |
| Które ustawienie zmienić?Do arduino mam wgrany taki program
/*
Simple LED sketch
*/
int led = 13; // Pin 13
void setup()
{
pinMode(led, OUTPUT); // Set pin 13 as digital out
// Start up serial connection
Serial.begin(9600); // baud rate
Serial.flush();
}
void loop()
{
String input = "";
// Read any serial input
while (Serial.available() > 0)
{
input += (char) Serial.read(); // Read in one char at a time
delay(5); // Delay for 5 ms so the next char has time to be received
}
if (input == "1")
{
digitalWrite(led, HIGH); // on
}
else if (input == "2")
{
digitalWrite(led, LOW); // off
}
}W związku z tym mam pytanie. Co muszę jeszcze ustawić lub poprawić, abym mógł przez stty komunikować się z arduino?
Ostatnio edytowany przez prosze (2015-11-26 13:37:50)
Offline

Użytkownik


Znalazłem częściowe rozwiązanie na innym forum, które wymaga otwarcia dwóch konsol.
W pierwszej konsoli wpisujemy polecenie
tail -f /dev/ttyUSB0
Następnie nie zamykając pierwszej konsoli otwieramy drugą i wpisujemy
echo -n "1" > /dev/ttyUSB0
W tym momencie dioda zostaje zapalona. Podpowie ktoś jak zmienić ustawienia stty, aby to samo zrobić w jednej konsoli?
Offline







Palacz








tail -f /dev/ttyUSB0 & echo -n "1" > /dev/ttyUSB0
?
Może jeszcze między poleceniami sleepa wpleść jeśli była by potrzeba opóźnienia drugiego polecenia.
Offline



człowiek pasjonat :D
ilin napisał(-a):
Kod:
tail -f /dev/ttyUSB0 & echo -n "1" > /dev/ttyUSB0?
Może jeszcze między poleceniami sleepa wpleść jeśli była by potrzeba opóźnienia drugiego polecenia.
tail -f /dev/ttyUSB0 && sleep 5; echo -n "1" > /dev/ttyUSB0
?
Offline




Zbanowany





2408
Ostatnio edytowany przez uzytkownikubunt (2016-12-01 01:27:57)
Offline

Użytkownik


tail -f /dev/ttyUSB0 & echo -n "on" > /dev/ttyUSB0
tail -f /dev/ttyUSB0 & sleep 2; echo -n "on" > /dev/ttyUSB0
Dwa powyższe polecenia działają poprawnie. Natomiast te poniżej zapala diodę dopiero po jego zatrzymaniu (ctrl+z).
pic@pic:~$ tail -f /dev/ttyUSB0 && sleep 5; echo -n "on" > /dev/ttyUSB0 ^Z [18]+ Zatrzymano tail -f /dev/ttyUSB0 pic@pic:~$
Zastanawiałem się dlaczego nie można zapalić diody tylko jednym polecaniem echo -n "on" > /dev/ttyUSB0?
Zauważyłem jeszcze taką rzecz, że jak w jednej konsoli wpiszę polecenie tail -f /dev/ttyUSB0, a w drugiej polecenie echo -n "1" > /dev/ttyUSB0 to dioda się zapali, czyli prawidłowo. Tylko, że jak w pierwszej konsoli zatrzymam działanie pierwszego polecenia, tak jak powyżej, to w drugiej konsoli nadal mogę zapalać i gasić diodę. Wygląda na to, że ubicie polecenia przez ctrl+z nie powoduje jego zatrzymania. Jego zatrzymanie następuje dopiero po zamknięciu konsoli. Czy tak powinno być?
Ostatnio edytowany przez prosze (2015-11-27 11:10:55)
Offline



Użytkownik

Użytkownik


Znalazłem takie wyjaśnienie:
& - Ocenia po obu stronach tej operacji.
&& - Ocenia lewą stronę operacji, jeśli będzie ona "true" to dopiero ocenia prawą strone.
Bardziej interesuje mnie dlaczego pierwsze polecenie nie działa bez drugiego.
Offline




Zbanowany





2410
Ostatnio edytowany przez uzytkownikubunt (2016-12-01 01:28:00)
Offline



Użytkownik
pytanie kontrolne: kiedy skończy się tail?
Offline

Użytkownik


Kiedy tail kończy działanie? W moim przypadku tail kończy działanie dopiero po zamknięciu konsoli w której był uruchomiony. Nie pomaga jego zatrzymanie przez ctrl+z bo mimo tego, że jest komunikat o zatrzymaniu programu to w drugiej konsol polecenie echo -n "on" > /dev/ttyUSB0 działa poprawnie.
Dodatkowo zauważyłem, że jak uruchomię taila pierwszym, albo drugim poniższym poleceniem to zakończyć jego działanie mogę tylko przez zamknięcie konsoli. Z tego wniosek, że tail nigdy nie kończy działania bo z opcją -f pracuje w nieskończonej pętli.
tail -f /dev/ttyUSB0 & echo -n "on" > /dev/ttyUSB0 tail -f /dev/ttyUSB0 && sleep 5; echo -n "on" > /dev/ttyUSB0
Ostatnio edytowany przez prosze (2015-11-27 14:21:19)
Offline




Zbanowany





2411
Ostatnio edytowany przez uzytkownikubunt (2016-12-01 01:28:01)
Offline



Użytkownik
@prosze: źle wnioskujesz.
tail się skończy jak mu zabraknie wejścia. ctrl-z nie kończy programu a tylko go zatrzymuje.
może tak zacznij od man bash, a potem będziesz dywagować o tym, co ci się wydaje?
Offline







Podobno człowiek...;)








uzytkownikubunt napisał(-a):
Aby wiedzieć czy jakiś program jest uruchomiony można użyć np. takich poleceń:
Kod:
ps aux | grep tail pgrep tail
Z tym grepem to zabiłeś kotka.
pidof tail
l nie wystarczy.
Ostatnio edytowany przez Jacekalex (2015-11-27 18:45:54)
Offline




Zbanowany





2412
Ostatnio edytowany przez uzytkownikubunt (2016-12-01 01:28:02)
Offline



Użytkownik
dobra zwracam honor (źle się wyraziłem). bardziej chodziło mi o różnicę między wstrzymaniem a zakończeniem procesu.
btw. akurat piszę taki programik na arduino, jego część to taki prosty readline, jak przetestuję to tu wrzucę.
//edytka:
#include <stdlib.h>
#define UHZ 100
#define SERBUF_LEN 64
char serial_buffer[SERBUF_LEN];
byte serial_size=0;
void setup()
{
Serial.begin(9600);
pinMode(13,OUTPUT);
digitalWrite(13,0);
}
void loop()
{
doSerial();
delay(1000 / UHZ);
}
void execSerialCommand()
{
byte led;
if (!strcmp(serial_buffer,"on")) {
led = 1;
}
else if (!strcmp(serial_buffer,"off")) {
led = 0;
}
else {
Serial.println("Nie rozumiem polecenia"):
return;
}
digitalWrite(13,led);
Serial.println("Zrobione");
}
void doSerial()
{
char sdata;
for (;;) {
if (!Serial.available()) return;
sdata=Serial.read();
if (sdata == 8) { // backspace
if (serial_size) serial_size--;
continue;
}
if (sdata == '\n' || sdata == '\r') {
if (serial_size) {
serial_buffer[serial_size]=0;
execSerialCommand();
serial_size=0;
}
continue;
}
if (serial_size < SERBUF_LEN - 1) {
serial_buffer[serial_size++]=sdata;
}
}
}Ostatnio edytowany przez ethanak (2015-11-29 10:29:51)
Offline
Strony: 1