2012-06-26 5 views
2

Я разрабатываю контроллер ориентации. У меня есть плата разработки, которая связывается с датчиком (компасом) через I2C. Поскольку плата довольно ограничена (без ОС), я разработал простую программу для получения таких вещей, как: (1) «get 0» для чтения регистра датчика 0; (2) «установить 0 10», чтобы установить регистр датчика 0 со значением 10. Для каждого из этих случаев плата возвращает: (1) «Готово: 10.» (регистр 0 имеет значение 10); (2) «Готово»; и (3) «error: ...» в случае ошибки. При этом я пытаюсь разработать сценарий оболочки (bash) для отправки команд и получения данных, чтобы понять датчик и разработать контроллер.Управление последовательным портом через сценарий оболочки

Моя проблема заключается в следующем коде:

# read device output in the background. 
head -n 1 /dev/ttyUSB0 & 
head=$! 

# (#1): without the following stmt I get: 
# head: cannot open `/dev/ttyUSB0' for reading: : Protocol error 
sleep 0.1 

# send command to the device. 
echo "get 0" > /dev/ttyUSB0 

# (#2) wait for head. 
while kill -0 $head 2>/dev/null ; do : ; done 

Я думаю (# 1) вызывается для чтения/записи конфликт между «головой» и «эхо», но я не знаю, почему и Я понятия не имею, как его решить.

Другая проблема в (№ 2), где я хотел бы использовать таймаут. Я пытался что-то вроде:

timeout 1 bash -c "while kill -0 $head 2>/dev/null ; do : ; done" 

Но я получаю: Timeout: aborting command ``bash'' with signal 9 и программа застревает.

Кстати, до того, как приведенный выше код выполняется я инициализировать последовательный порт с:

stty -F /dev/ttyUSB0 9600 cs8 -cstopb 

EDIT: Я не хочу, интерактивный терминал. Я хочу использовать эту процедуру по мере необходимости. Эта процедура является необходимой основой контроллера (регистров датчика чтения/записи), который позже будет реализован на плате.

+0

Вы видели следующее сообщение? http://unix.stackexchange.com/questions/22545/how-to-connect-to-a-serial-port-as-simple-as-using-ssh – jpe

+0

Почему бы вам просто не подождать $ head? –

+0

@jpe: Мне не нужна интерактивная оболочка. Я хочу использовать эту процедуру только тогда, когда это необходимо. –

ответ

0

Для решения задачи (# 1) Я изменил процедуру использовать ФД:

# $1: the device filename, eg. /dev/ttyS0 
# $2: number of lines to read before exit. 

exec 3<>$1 

head -n "$2" 0<&3 & 
wait_pid=$! 

cat - 1>&3 

wait $wait_pid 

exec 3>&- 

EDIT: Для решения задачи (# 2), вместо того, чтобы обеспечить процедуру с поддержкой тайм-аута я делегировать эту ответственность вызывающего абонента. Однако в случае тайм-аута нам нужно очистить. Для этого я добавил следующее после wait_pid=$!:

trap="if kill -0 $wait_pid ; then kill -TERM $wait_pid ; fi" 
trap "$trap" SIGINT SIGKILL SIGTERM 
Смежные вопросы