2012-06-26 84 views
2

我正在開發一個方向控制器。我有一個通過I2C與傳感器(指南針)通信的開發板。由於該板非常有限(沒有OS),我開發了一個簡單的程序來接收諸如以下內容:(1)'取0'讀取傳感器的寄存器0; (2)'設置0 10'將傳感器的寄存器0設置爲10.對於這些情況中的每一個,電路板返回:(1)'完成:10'。 (寄存器0的值爲10); (2)'完成';和(3)'錯誤:......'如有錯誤。有了這個,我正在嘗試開發一個shell腳本(bash)來發送命令並檢索數據,以便了解傳感器並開發控制器。通過shell腳本控制串口

我的問題是用下面的代碼:

# 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 

編輯:我不想要一個交互終端。我想根據需要使用這個例程。該例程是控制器(讀/寫傳感器的寄存器)的必要基礎,稍後將在板中實現。

+0

你見過以下帖子嗎? http://unix.stackexchange.com/questions/22545/how-to-connect-to-a-serial-port-as-simple-as-using-ssh – jpe

+0

爲什麼你不只是'等'頭'? –

+0

@jpe:我不想要一個交互式shell。我只想在必要時使用這個例程。 –

回答

0

爲了解決(#1)我修改了常規使用的Fd:

# $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