명령줄을 사용하여 직렬 포트에서 데이터를 보내고 받는 방법은 무엇입니까?

명령줄을 사용하여 직렬 포트에서 데이터를 보내고 받는 방법은 무엇입니까?

이전에는 Linux 및 Windows 환경에서 직렬 통신을 위해 C++ 및 Python을 사용해 왔습니다. Linux에서는 직렬 통신을 위해 picocom, minicom, Cutecom과 같은 프로그램도 사용했는데 이제는 외부 프로그램을 설치하지 않고도 간단한 Linux 명령을 사용하여 직렬 포트를 읽고 쓰고 싶습니다. Raspberry Pi에서 이 방법을 사용하여 Arduino 보드와 통신하겠습니다. 아래 예에서는 stty를 사용하여 직렬 포트 옵션을 설정하고 echo 및 cat 명령을 사용하여 직렬 포트에서 데이터를 보내고 읽지만 결국 출력이 표시되지 않습니다. 사이트에 이와 관련된 게시물이 있지만 나에게는 아무 효과가 없는 것 같습니다. Cutecom을 사용하여 Arduino와 통신할 수 있지만 다음 명령을 사용하면 아무런 응답이 표시되지 않습니다.

리눅스(우분투):

$ stty -F /dev/ttyUSB0 9600 cs8 -cstopb -parenb
$ echo "1" > /dev/ttyUSB0 //send data
$ cat /dev/ttyUSB0

참고용 Arduino Mega 코드:

#include <Arduino.h>

void setup() {
    Serial.begin(115200);
}

void loop() {

    if(Serial.available() > 0){
        Serial.println("[123,55,7777]");
    }
}

여기서는 1을 보내고 Arduino로부터 응답을 받습니다. 큐트컴 예시

이것은 간단해야 합니다. Arduino에 1 또는 임의의 문자를 보내면 명령줄에 [123,55,7777]이 반환되어야 합니다. 어떤 종류의 도움과 지도에도 감사드립니다.

다음은 시도한 코드이지만 데이터가 반환되지 않았습니다.

stty -F /dev/ttyUSB0 115200 cs8 -cstopb -parenb  #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 -e -n "\x01" > /dev/ttyUSB0     #SEND COMMAND HEX 0x01 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

감사해요

답변1

일반적인 문제는 장치가 꺼지면 일부 기본 구성으로 재설정되어 변경 사항이 손실된다는 것입니다. 열린 파일 설명자를 보유하면 이러한 상황을 피할 수 있습니다.

이와 같은 것 (테스트되지 않음)

#!/bin/bash
# Keep the ttyUSB0 device open on fd 3
exec 3<>/dev/ttyUSB0
stty -F /dev/ttyUSB0 9600 cs8 -cstopb -parenb
echo "1" >&3                 # send data
cat <&3                      # read the data

관련 정보