Làm thế nào để gửi dữ liệu đến một cổng nối tiếp và xem bất kỳ câu trả lời?


37

Trên Linux, tôi muốn gửi một chuỗi lệnh (tức là một số dữ liệu) đến một cổng nối tiếp (chứa các ký tự điều khiển) và lắng nghe phản hồi (thường có thể chứa các ký tự điều khiển).

Làm thế nào tôi có thể làm điều này đơn giản nhất có thể trên Linux? Một ví dụ được đánh giá cao!



Tôi không cài đặt chặn.
Alex

1
đề cử mở lại - nó không phải là một bản sao như đề xuất.
peterph

một số người quá ngu ngốc họ chỉ đề xuất các câu hỏi như là công khai. Đầu tiên bận tâm đọc các câu hỏi và trả lời.
Denis

Câu trả lời:


54

Tất cả các thiết bị trên Unix được ánh xạ tới một tệp thiết bị, các cổng nối tiếp sẽ là /dev/ttyS0 /dev/ttyS1....

Trước tiên hãy xem các quyền trên tệp đó, giả sử bạn đang sử dụng /dev/ttyS1.

ls -l /dev/ttyS1

Bạn sẽ muốn truy cập read.write, nếu đây là một hệ thống được chia sẻ thì bạn nên xem xét các hậu quả bảo mật của việc mở nó cho mọi người.

chmod o+rw /dev/ttyS1

Một phương pháp thô rất đơn giản để ghi vào tệp, sẽ sử dụng echolệnh đơn giản .

echo -ne '\033[2J' > /dev/ttyS1

và để đọc

cat -v < /dev/ttyS1

Bạn có thể có con mèo chạy trong một thiết bị đầu cuối và lặp lại trong lần thứ hai.

Nếu mọi thứ đều vô nghĩa, thì tốc độ truyền, cài đặt bit có thể cần cài đặt trước khi bạn bắt đầu gửi. sttysẽ làm điều đó. !! LƯU Ý stty sẽ sử dụng stdin làm mô tả tệp mặc định để ảnh hưởng.

Các lệnh tương đương.

stty 19200 < /dev/ttyS1
stty 19200 -F /dev/ttyS1

Điều này có thể là đủ để bạn kịch bản một cái gì đó và đăng nhập? Không chắc chắn những gì bạn đang cố gắng để đạt được.

Để tương tác nhiều hơn, hãy nhớ cách tiếp cận cài đặt mặc định của bạn sẽ là sử dụng minicomnó chỉ là một chương trình thực hiện mọi thứ tôi đã đề cập cho đến nay. (tương tự như hyperterminal trong Windows, bạn có thể quen thuộc).

Một giải pháp trung gian, sẽ sử dụng một chương trình đầu cuối giống như screensẽ hoạt động trên một thiết bị nối tiếp.

screen /dev/ttyS1

man screen man minicom man stty để biết thêm thông tin


Tôi không nhận được bất kỳ đầu ra nào cả. Có ý kiến ​​gì không?
Goldname

Có thể điều khiển luồng phần cứng, tắt bằng lệnh atty hoặc dây cao trong cáp nối tiếp, tìm kiếm cáp modem null.
X Tian

1
# stty -speed 38400 -f /dev/ttyUSB1trả vềstty: invalid argument '-speed'
Pro Backup

1
trên stty, nó là -F (viết hoa F) để đặt thiết bị. Ngoài ra tham số tốc độ của bạn là sai. Bạn có thể sử dụng tốc độ để có tốc độ truyền của cổng, hoặc tốc độ hoặc tốc độ (không có dấu trừ) để đặt tốc độ đầu vào và đầu ra, hoặc chỉ một số để đặt cả tốc độ đầu vào và đầu ra, như vậy: stty 19200 -F / dev / ttyS ....
Paulus

Thật ngạc nhiên không ai nhận thấy điều đó trước đây, cảm ơn bạn @Pro Backup Tôi đã sửa ví dụ này.
X Tian

11

Tất cả bạn phải làm là mở hai thiết bị đầu cuối. Trong thiết bị đầu cuối đầu tiên, bạn catmọi thứ từ thiết bị, vd

cat /dev/ttyS0

trong thiết bị đầu cuối khác, bạn có thể gửi các ký tự và văn bản hex tùy ý đến thiết bị đầu cuối, ví dụ như sau:

echo -e "\x7E\x03\xD0\xAF und normaler Text" > /dev/ttyS0

Các echo -elệnh cho phép việc giải thích thoát xuyệc ngược.

Tất nhiên người ta phải đảm bảo rằng (i) các cài đặt nối tiếp (tốc độ, độ dài từ, ctrl luồng, v.v.) là chính xác và (ii) thiết bị nối tiếp (ở đầu bên kia) không bị chặn.


Bạn đã trả lời 10 phút này sau khi tôi viết câu trả lời của mình ở trên và bạn chưa thêm bất kỳ thông tin nào cả!
X Tian

Ôi xin lỗi, tôi không đọc hết câu trả lời của bạn. Tôi thấy rằng câu trả lời của tôi được bao gồm trong câu hỏi của bạn, vì vậy tôi sẽ chấp nhận câu trả lời của bạn là câu trả lời đúng, như bạn đã mô tả đúng như những gì tôi đã mô tả.
Alex

Tôi không biết nhiều về cổng COM. Bạn có thể giải thích "thiết bị nối tiếp (ở đầu bên kia) không chặn" nghĩa là gì không? Một số vấn đề với tường lửa?
Sopalajo de Arrierez

9

Các chương trình nói chuyện với các thiết bị nối tiếp:

picocom
minicom
socat

hoặc từ vỏ bạn có thể làm:

stty -speed 19200 < /dev/ttyS0 # sets the speed of the port
exec 99<>/dev/ttyS0 (or /dev/ttyUSB0...etc)
printf "AT\r" >&99
read answer <&99  # this reads just a CR
read answer <&99  # this reads the answer OK
exec 99>&-

của bạn là một câu trả lời tuyệt vời đã dạy tôi về các mô tả tập tin hai chiều. Tuy nhiên, bạn có chắc cú pháp dòng cuối cùng để đóng bộ mô tả là đúng không? Tôi nhận được lỗi cú pháp. Tôi nghĩ exec 99<&-hoặc exec 99>&-nên hoặc được sử dụng. Hoặc có thể cả hai?
Yankee

1
lỗi đánh máy .. bạn nói đúng
Zibri

7

Đây có thể là một cách tiếp cận tốt hơn:

stty -F /dev/ttyUSB0 115200 raw -echo   #CONFIGURE SERIAL PORT
exec 3</dev/ttyUSB0                     #REDIRECT SERIAL OUTPUT TO FD 3
  cat <&3 > /tmp/ttyDump.dat &          #REDIRECT SERIAL OUTPUT TO FILE
  PID=$!                                #SAVE PID TO KILL CAT
    echo "R" > /dev/ttyUSB0             #SEND COMMAND STRING TO SERIAL PORT
    sleep 0.2s                          #WAIT FOR RESPONSE
  kill $PID                             #KILL CAT PROCESS
  wait $PID 2>/dev/null                 #SUPRESS "Terminated" output

exec 3<&-                               #FREE FD 3
cat /tmp/ttyDump.dat                    #DUMP CAPTURED DATA

Điều này là rất tốt bởi vì nó tự động hóa quá trình! Thay đổi duy nhất tôi sẽ thực hiện, hoàn toàn là tùy chọn, là xác nhận nội dung nhận được giống như đã gửi - có thể chỉ là một số đếm hoặc đầy đủ trên diff.
HiDefLoLife

4

Bạn có thể đọc và ghi vào thiết bị một cách tương tự như vậy:

cat /dev/cu.usbmodem411 & cat > /dev/cu.usbmodem411

Tin nhắn của bạn được gửi đến lần thứ hai cattừ stdinvà lần đầu tiên catchuyển tiếp phản hồi đến stdout, biến thiết bị đầu cuối của bạn thành một phòng chat.

Để hoàn tất, ctrl-c, sau đó chạy fgsau đó ctrl-cmột lần nữa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.