2012-01-16 34 views
39

Từ cửa sổ tôi có thể giao tiếp với một thiết bị cổng nối tiếp sử dụng lệnh sau:bằng văn bản cho cổng nối tiếp từ dòng lệnh Linux

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

Device bắt đầu các hoạt động yêu cầu.

Khi tôi cố gắng thực hiện thao tác tương tự từ hộp debian độc lập hoặc từ một phiên bản ảo debian của cùng một máy cửa sổ, tôi không có may mắn cho đến nay.

Dưới đây là các lệnh linux tương đương (ít nhất tôi nghĩ vậy)

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

Không có gì xảy ra.

Ai đó có thể đưa tôi đi đúng hướng không?

Trả lời

16
echo '\x12\x02' 

sẽ không được diễn giải, và theo nghĩa đen sẽ viết chuỗi \x12\x02 (và nối thêm dòng mới) vào cổng nối tiếp được chỉ định. Thay vì sử dụng

echo -n ^R^B 

mà bạn có thể xây dựng trên dòng lệnh bằng cách gõ CtrlVCtrlRCtrlVCtrlB. Hoặc dễ dàng hơn khi sử dụng trình chỉnh sửa để nhập vào tệp tập lệnh.

Lệnh stty sẽ hoạt động, trừ khi chương trình khác can thiệp. Một thủ phạm phổ biến là gpsd trông cho các thiết bị GPS được cắm vào.

+0

Cảm ơn bạn rất nhiều vì đã trả lời, tôi đã thử lệnh echo -n CTRL + VCTRL + RCTRRL + VCTRL + B từ dòng lệnh nhưng tôi không thể thực hiện được, tôi muốn thử các lệnh khác, vì vậy tôi muốn biết bạn đưa ra các bản dịch này (0x12 =^R, 0x02 =^B), đây không phải là bản dịch ascii mà tôi cho là. –

+0

@erincarikan: sử dụng 'man ascii' để xem cách 0x12 liên quan đến Ctrl-R. Chúng là ascii thuần khiết. Có thể một số kết hợp ctrl sẽ không hoạt động, như ctrl- @ (NUL). Nó có thể được dễ dàng hơn để viết một chương trình để làm một giao thức nhị phân như thế này. – wallyk

+0

cảm ơn tôi hoàn toàn có nó, nhưng tiếc là nó không hoạt động, tôi nghi ngờ rằng một cái gì đó là can thiệp với stty, tôi không có gpsd chạy. Tôi phải nhìn vào điều này nhiều hơn. –

31

Nếu bạn muốn sử dụng mã hex, bạn nên thêm -e tùy chọn để cho phép giải thích các dấu chéo ngược thoát bởi echo (nhưng kết quả là giống như với echoCtrlRCtrlB). Và như wallyk nói, bạn có thể muốn thêm -n để ngăn chặn đầu ra của một dòng mới:

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

Cũng đảm bảo rằng /dev/ttyS0 là cổng mà bạn muốn.

+0

cảm ơn, tôi chắc chắn rằng nó là cổng mà tôi muốn, là có một cách đơn giản hơn để kiểm tra kết nối nối tiếp, echo luôn luôn trả về thành công. –

+0

+1 để đề xuất tùy chọn -e – Arunas

+1

Nếu bạn đang sử dụng 'bash', sử dụng' $ '' 'trích dẫn:' printf $ '\ x12 \ x02'>/dev/ttyS0' –

5

SCREEN:

LƯU Ý: màn hình thực sự là không thể gửi hex, như xa như tôi biết. Để làm điều đó, hãy sử dụng echo hoặc printf

Tôi đã sử dụng đề xuất trong bài đăng này để ghi vào cổng nối tiếp, sau đó sử dụng thông tin từ một số khác post để đọc từ cổng. Tôi thấy rằng việc sử dụng màn hình là một giải pháp "dễ dàng hơn", vì nó sẽ mở một phiên đấu nối trực tiếp với cổng đó. (Tôi đặt dễ dàng hơn trong dấu ngoặc kép, bởi vì màn hình có một giao diện thực sự lạ, IMO, và có một số đọc thêm để tìm ra nó.)

Bạn có thể thực hiện lệnh này để mở một phiên màn hình, sau đó bất cứ điều gì bạn gõ sẽ được gửi đến cảng, cộng với giá trị trả về sẽ được in dưới nó:

screen /dev/ttyS0 19200,cs8 

(Thay đổi ở trên để phù hợp với nhu cầu của bạn cho tốc độ, chẵn lẻ, dừng bit, vv) Tôi nhận ra màn hình không phải là "dòng lệnh linux" như bài viết yêu cầu cụ thể, nhưng tôi nghĩ rằng đó là trong cùng một tinh thần. Ngoài ra, bạn không phải gõ tiếng vọng và trích dẫn mọi lúc.

ECHO:

theo câu trả lời thuộc về pháp quan droid. BAO GIỜ, điều này đã không làm việc cho tôi cho đến khi tôi cũng sử dụng lệnh cat (cat < /dev/ttyS0) trong khi Tôi đã gửi lệnh echo.

printf:

tôi thấy rằng người ta cũng có thể sử dụng '% x' lệnh printf của:

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

Một lần nữa, cho printf, bắt đầu cat < /dev/ttyS0 trước khi gửi lệnh.

+0

Không có gì làm việc cho tôi cho đến khi tôi làm như MrUser nói: bạn phải lắng nghe trên/dev/ttyS0 trước khi bạn có thể viết cho nó. – Gouda

Các vấn đề liên quan