Strona 1 z 1

Odczyt / zapis portu /dev/ttyS0

: 22 lut 2011, 14:10
autor: 2n3055
Witam wszystkich.

Chciałbym napisać prosty skrypt uruchamiany co jakiś czas z cron'a wysyłający i odbierający dane z urządzenia podpiętego do portu rs232 (/dev/ttyS0).
Zadanie udało mi się częściowo rozwiązać:

Kod: Zaznacz cały

#!/bin/bash
echo -en "1\r" > /dev/ttyS0 
cat /dev/ttyS0 > ./plik.txt
Dane są wysyłane poprawnie. Odbierana odpowiedź jest zapisywana do pliku, jednak po odczycie danych cat nie zamyka się i skrypt cały czas pozostaje uruchomiony.
Jak można wymusić zakończenie cat po odczycie danych z urządzenia?
Z góry dziękuję za pomoc.

Odp: Odczyt / zapis portu /dev/ttyS0

: 22 lut 2011, 18:21
autor: Chmiela2121
Możliwe, że to co napiszę jest bzdurą, ale wydaje mi się, że cat zakończy swoje działanie, gdy odbierze EOF. Jeżeli jest to prawdą, a to urządzenie nie wysyła tego sygnału po zakończeniu swojej pracy, to może być problem. Najprościej byłoby napisać program, który zrobi to samo co cat, a zakończy swoje działanie nie czekając na EOF a na sygnał kończący od urządzenia. Pytanie zatem, co jest ostatnim znakiem wysyłanym przez urządzenie?

Odp: Odczyt / zapis portu /dev/ttyS0

: 23 lut 2011, 09:17
autor: beluosus
Użyj dd albo zabij cat np po sekundzie.

Odp: Odczyt / zapis portu /dev/ttyS0

: 23 lut 2011, 19:30
autor: 2n3055
Witam!
Dziękuję Wam za odpowiedzi.
dd z parametrem count rozwiązało sprawę:

Kod: Zaznacz cały

dd if=/dev/ttyS0 of=./plik.txt count=1
i wszystko zaczęło działać.
Do Chmiela2121 - jestem w tej komfortowej sytuacji, że to co wysyła urządzenie do komputera zależy ode mnie, ale nie udało mi się dojść w jaki sposób mogę nadać EOF.
Wie ktoś może jaką sekwencję znaków ascii programy nasłuchujące odbiorą jako znak EOF?

Pozdrawiam!

Odp: Odczyt / zapis portu /dev/ttyS0

: 23 lut 2011, 19:38
autor: Dwimenor

Kod: Zaznacz cały

Wie ktoś może jaką sekwencję znaków ascii programy nasłuchujące odbiorą jako znak EOF?
Zajrzyj do man ascii

Odp: Odczyt / zapis portu /dev/ttyS0

: 23 lut 2011, 20:37
autor: Chmiela2121
"The actual value of EOF is system-dependent (but is commonly -1, such as in glibc[1]) and is unequal to any valid character code." (Wikipedia).

Skoro masz możliwość ustalenia sygnału wyjściowego z urządzenia to możesz wydać na koniec sygnał EOT (4 dziesiętnie). I użyć programu o kodzie, na kształt:

Kod: Zaznacz cały

#include <iostream>
#include <cstdio>

int main(){
	char c;
	
	while((c = fgetc(stdin)) != 4){ //EOT = 4 (dec.)
		std::cout << c; 
	}
	
	return 0;
}
Ale nie wiem czy jest sens, skoro dd działa jak należy.

Re: Odczyt / zapis portu /dev/ttyS0

: 22 kwie 2013, 12:12
autor: szaro102
2n3055 w jaki sposób ustawiasz parametry (prędkość, parzystość, bity ....) transmisji w swoim skrypcie?