cat은 직렬에서 데이터를 읽는 데 신뢰할 수 있는 유일한 명령입니까?

cat은 직렬에서 데이터를 읽는 데 신뢰할 수 있는 유일한 명령입니까?

직렬 포트를 통해 초당 2회 지속적으로 데이터를 보내는 저울이 있습니다. 이 데이터를 읽는 신뢰할 수 있는 유일한 방법은 cat명령입니다. 다음은 작동합니다:

cat /dev/ttyUSB0

그런데 문제 cat는 데이터를 수신하지 못하기 때문에 EOF계속해서 데이터를 가져오는 것입니다. 나는 또한 그것을 시도 했고 head.readtail

head -1 /dev/ttyUSB0 | strings

매번 "거의" 작동하지만 때로는 오래된 데이터가 표시되고 cat 명령을 다시 실행해야만 문제가 수정(?)됩니다. 파이프 뒤의 문자열은 인쇄 가능한 데이터만 검색합니다.

read line < /dev/ttyUSB0 | echo $line

데이터가 검색되는 경우도 있지만 대부분 빈 행만 표시됩니다.

tail -1 < /dev/ttyUSB0

그냥 멈춰서 기다리면 EOF되지 않을까요?

bash내 문제는 데이터를 호출하고 "읽고" 검색할 수 있는 스크립트를 작성해야 한다는 것입니다 /dev/ttyUSB0. 를 사용할 예정입니다 . 하지만 절대 실패하지 않으므로 출력 한 줄만 캡처한 다음 중지 하는 방법이 있는지 head궁금합니다 .catcat

참고: 포트 구성은 9600 전송 속도, 1 시작 비트, 8 데이터 비트, 패리티 없음, 2 정지 비트입니다. 포트를 올바르게 설정하려면 다음 명령을 실행하십시오.

sudo stty -F /dev/ttyUSB0 9600 -parity cs8 cstopb

답변1

가장 좋은 방법은 tty를 원시 모드로 설정하고 메시지의 시작 부분을 볼 때까지 문자를 삭제한 다음 메시지의 끝에 도달할 때까지 문자를 인쇄하는 프로그램을 작성하는 것입니다. "raw"를 추가한 후 sttytty fgetc()에서 개별 문자를 가져오는 데 사용할 수 있습니다.

즉석 의사:

char = fgetc(serial_port);
if char == START_CHARACTER {
    putc(char);
    for (i=0;i<MESSAGE_LENGTH;i++){
        putc(fgetc(serial_port));
    }
}

이는 sed 및 raw tty를 사용하여 수행할 수도 있습니다. 다음 질문을 참조하세요. https://stackoverflow.com/questions/20943025/how-can-i-get-sed-to-quit-after-the-first-matching-address-range

관련 정보