2012-01-16 157 views
39

串行端口從Windows我可以使用下面的命令的串行端口設備通信:寫入從Linux命令行

mode com1: baud=9600 data=8 parity=n stop=1 
copy con com1 
alt+18alt+2ctrl+z 

設備啓動所請求的操作。

當我嘗試從獨立的debian盒子或同一個Windows機器的debian virtualbox實例完成相同的操作時,我到目前爲止沒有運氣。

這裏有相應的Linux命令(至少我是這麼認爲的)

stty -F /dev/ttyS0 speed 9600 cs8 -cstopb -parenb 
echo '\x12\x02' > /dev/ttyS0 

什麼也沒有發生。

請問有人能指引我走向正確的方向嗎?

回答

16
echo '\x12\x02' 

將不被解釋,並且將逐字寫入字符串\x12\x02(和追加一個新行)到指定的串行端口。代替通過鍵入Ctrl鍵VCtrl鍵- [RCtrl鍵VCtrl鍵使用

echo -n ^R^B 

它可以在命令行上構建。或者使用編輯器鍵入腳本文件更容易。

stty命令應該工作,除非另一個程序干擾。一種常見的罪魁禍首是gpsd這看起來對GPS設備中被插入。

+0

非常感謝您的回覆,我嘗試了命令行中的echo -n CTRL + VCTRL + RCTRRL + VCTRL + B,但我無法使其工作,我想嘗試其他命令,因此我想知道如何你拿出這些翻譯(0x12 =^R,0x02 =^B),這些都不是ascii翻譯我想。 – 2012-01-16 08:46:50

+0

@erincarikan:使用'man ascii'來查看0x12與Ctrl-R的關係。他們純粹ascii。有可能某些ctrl組合不起作用,如ctrl- @(NUL)。編寫一個程序來執行這樣的二進制協議可能會更容易。 – wallyk 2012-01-16 08:56:52

+0

謝謝我完全瞭解它,但不幸的是它不起作用,我懷疑有些東西干擾stty,我沒有運行gpsd。我必須更多地考慮這一點。 – 2012-01-16 09:39:21

31

如果要使用十六進制代碼,您應該添加-e選項可啓用反斜線的解釋由回聲逃脫(但結果是一樣的與echoCTRL- [RCTRL)。而作爲wallyk說,你可能要添加-n防止換行的輸出:

echo -en '\x12\x02' > /dev/ttyS0 

另外,還要確保/dev/ttyS0是你想要的端口。

+0

謝謝,我確定它是我想要的端口,是否有一種簡單的測試串行連接的方式,echo總是返回成功。 – 2012-01-16 10:27:07

+0

+1用於提示-e選項 – Arunas 2013-01-11 18:57:13

+1

如果您使用'bash',請使用'$'''引用:'printf $'\ x12 \ x02'>/dev/ttyS0' – 2015-06-08 17:00:46

5

SCREEN:

:屏幕實際上是無法發送十六進制,據我所知。要做到這一點,使用echoprintf

我用的建議,在這篇文章中寫到串行端口,然後使用另一post的信息從端口讀取,結果好壞參半。我發現使用屏幕是一個「更容易」的解決方案,因爲它直接與該端口打開終端會話。 (我放在引號中比較容易,因爲屏幕有一個非常奇怪的界面,海事組織,並需要一些進一步的閱讀來弄清楚。)

可以發出此命令可以打開屏幕會話,然後您輸入的任何將被髮送到端口,加上返回值將被打印在它下面:

screen /dev/ttyS0 19200,cs8 

(更改以上,以適應您對速度,奇偶校驗,停止位等的需求)。我認識到屏幕不是「linux命令行」,因爲帖子專門要求,但我認爲它是在相同的精神。另外,您不必每次都輸入回顯和引號。

ECHO:

按照腐敗的Droid的答案。但是,直到我還使用cat命令(cat < /dev/ttyS0而我發送了echo命令之前,這對我沒有用。

PRINTF:

我發現,人們也可以用printf的 '%X' 命令:

c="\x"$(printf '%x' 0x12) 
printf $c >> $SERIAL_COMM_PORT 

再次,printf的,發送命令之前啓動cat < /dev/ttyS0

+0

沒有爲我工作,直到我作爲MrUser說:你必須在/ dev/ttyS0上進行監聽,然後才能寫入它。 – Gouda 2015-07-22 16:02:34