![cat은 직렬에서 데이터를 읽는 데 신뢰할 수 있는 유일한 명령입니까?](https://linux55.com/image/115337/cat%EC%9D%80%20%EC%A7%81%EB%A0%AC%EC%97%90%EC%84%9C%20%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC%20%EC%9D%BD%EB%8A%94%20%EB%8D%B0%20%EC%8B%A0%EB%A2%B0%ED%95%A0%20%EC%88%98%20%EC%9E%88%EB%8A%94%20%EC%9C%A0%EC%9D%BC%ED%95%9C%20%EB%AA%85%EB%A0%B9%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
직렬 포트를 통해 초당 2회 지속적으로 데이터를 보내는 저울이 있습니다. 이 데이터를 읽는 신뢰할 수 있는 유일한 방법은 cat
명령입니다. 다음은 작동합니다:
cat /dev/ttyUSB0
그런데 문제 cat
는 데이터를 수신하지 못하기 때문에 EOF
계속해서 데이터를 가져오는 것입니다. 나는 또한 그것을 시도 했고 head
.read
tail
head -1 /dev/ttyUSB0 | strings
매번 "거의" 작동하지만 때로는 오래된 데이터가 표시되고 cat 명령을 다시 실행해야만 문제가 수정(?)됩니다. 파이프 뒤의 문자열은 인쇄 가능한 데이터만 검색합니다.
read line < /dev/ttyUSB0 | echo $line
데이터가 검색되는 경우도 있지만 대부분 빈 행만 표시됩니다.
tail -1 < /dev/ttyUSB0
그냥 멈춰서 기다리면 EOF
되지 않을까요?
bash
내 문제는 데이터를 호출하고 "읽고" 검색할 수 있는 스크립트를 작성해야 한다는 것입니다 /dev/ttyUSB0
. 를 사용할 예정입니다 . 하지만 절대 실패하지 않으므로 출력 한 줄만 캡처한 다음 중지 하는 방법이 있는지 head
궁금합니다 .cat
cat
참고: 포트 구성은 9600 전송 속도, 1 시작 비트, 8 데이터 비트, 패리티 없음, 2 정지 비트입니다. 포트를 올바르게 설정하려면 다음 명령을 실행하십시오.
sudo stty -F /dev/ttyUSB0 9600 -parity cs8 cstopb
답변1
가장 좋은 방법은 tty를 원시 모드로 설정하고 메시지의 시작 부분을 볼 때까지 문자를 삭제한 다음 메시지의 끝에 도달할 때까지 문자를 인쇄하는 프로그램을 작성하는 것입니다. "raw"를 추가한 후 stty
tty 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