성공적으로 읽을 때마다 RFID 태그의 고유 ID를 Linux(Raspberry Pi) 상자의 직렬 포트로 보내는 RFID 리더가 있습니다. 문제는 개행 문자 없이 전송된다는 것입니다. 다음은 출력의 예입니다.
root@scalepi:~/scale# ./grabserial -d "/dev/ttyUSB4" -b 9600
$A0112OKD9990001200005643E#$A0112OKD9990001200005643E#$A0112OKD9990001200005643E#$A0112OKD9990001200005643E#$A0112OKD9990001200005643E#$A0112OKD9990001200005643E#$A0112OKD9990001200005643E#$A0112OKD9990001200005643E#$A0112OKD9990001200005643E#$A0112OKD9990001200005643E#$A0112OKD9990001200005643E#$A0112OKD9990001200005643E#
다음과 같은 새 줄을 사용하여 각 항목을 텍스트 파일에 쓰고 싶습니다.
$A0112OKD9990001200005643E#
$A0112OKD9990001200005643E#
$A0112OKD9990001200005643E#
보시다시피 각 항목은 $로 시작하고 #으로 끝납니다.
이 줄을 사용하여 출력을 sed로 파이핑하고 # 뒤에 새 줄을 추가하려고 시도했지만 sed가 데이터를 처리하기 전에 새 줄을 찾고 있다고 생각했기 때문에 출력은 0이었습니다.
./grabserial -d "/dev/ttyUSB4" -b 9600 | sed 's/#/#\r\n/g'
출력을 파일로 리디렉션한 다음 동일한 sed 명령을 통해 해당 파일을 cat하면 예상한 결과를 얻을 수 있지만 읽을 수 있도록 이 형식으로 파일에 데이터를 쓸 수 있어야 합니다. 실시간.
root@scalepi:~/scale# ./grabserial -d "/dev/ttyUSB4" -b 9600 > /tmp/test2.txt
^C
root@scalepi:~/scale# cat /tmp/test2.txt | sed 's/#/#\r\n/g'
$A0112OKD9990001200005643E#
$A0112OKD9990001200005643E#
$A0112OKD9990001200005643E#
root@scalepi:~/scale#
누구든지 나에게 어떤 제안이 있으면 매우 감사하겠습니다. 감사해요!
편집-업데이트
아래의 "tr" 솔루션을 시도한 후 라이브 출력을 얻을 수 있지만 파이프를 통해 리디렉션하거나 stdout/stderr을 통해 리디렉션을 시도하면 라인을 얻는 대신 한 번에 50-60줄의 버퍼링된 결과를 얻습니다. 바이라인 결과.
다음 명령은 직렬 포트에 들어갈 때 실시간 출력을 제공합니다.
./grabserial -d "/dev/ttyUSB4" -b 9600 | tr '#' '\n'
다음 명령은 한 번에 50~60줄씩 출력합니다(실시간 아님).
./grabserial -d "/dev/ttyUSB4" -b 9600 | tr '#' '\n' | sed -u 's/$/#\r/g'
다음 명령은 한 번에 50줄 또는 60줄씩(실시간이 아님) 텍스트 파일로 출력합니다.
./grabserial -d "/dev/ttyUSB4" -b 9600 | tr '#' '\n' > /tmp/test1.txt
FWIW, "grabserial" 대신 직렬 포트를 읽으려면 cat을 사용하여 동일한 결과를 얻었습니다.
다음 명령은 실시간 결과를 제공합니다.
cat /dev/ttyUSB4 | tr '#' '\n'
그러나 파이프나 stdout 리디렉션을 통해 출력을 리디렉션하려고 하면 텍스트 파일에 버퍼링된 데이터 덩어리가 표시됩니다.
cat /dev/ttyUSB4 | tr '#' '\n' > /tmp/test4.txt
답변1
#
문자를 개행 문자로 번역(또는 음역) 할 수 있습니다.
tr '#' '\n'
그래서
./grabserial -d "/dev/ttyUSB4" -b 9600 | tr '#' '\n'
너한테 줘야지
$A0112OKD9990001200005643E
$A0112OKD9990001200005643E
$A0112OKD9990001200005643E
$A0112OKD9990001200005643E
$A0112OKD9990001200005643E
$A0112OKD9990001200005643E
$A0112OKD9990001200005643E
$A0112OKD9990001200005643E
$A0112OKD9990001200005643E
$A0112OKD9990001200005643E
$A0112OKD9990001200005643E
$A0112OKD9990001200005643E
︙
실시간. 만약 너라면필요파운드 기호 및/또는 캐리지 리턴을 사용하면 위의 내용을 파이프로 연결할 수 있습니다.
… sed 's/$/#\r/'
( 줄의 끝을 나타낸다는 사실을 sed
(그리고 일반적으로 정규식을) 사용하세요 .$
덫
tr
출력이 파이프나 파일로 들어갈 때 출력을 버퍼링하는 데 문제가 있을 수 있습니다. 아마도 이것을 처리하는 가장 좋은 방법은 다음을 따르는 것입니다.알파의 조언
예를 들어 버퍼링을 끄십시오 stdbuf
.
./grabserial -d "/dev/ttyUSB4" -b 9600 | stdbuf -oL tr '#' '\n' | sed 's/$/#\r/' > RFIDs.txt
명확하지 않은 경우 옵션은 stdbuf
소문자 o
(oh)와 대문자 L
(ell)이며, 이는 표준 출력이 라인 버퍼링되어야 함을 나타냅니다.
결론(TL;DR) #1:
그래서 당신은 사용할 수 있어야합니다
./grabserial -d "/dev/ttyUSB4" -b 9600 | stdbuf -oL tr '#' '\n' > RFIDs.txt
#
끝에 항목이 없는 항목을 가져오거나
./grabserial -d "/dev/ttyUSB4" -b 9600 | stdbuf -oL tr '#' '\n' | sed 's/$/#/' > RFIDs.txt
#
가 포함된 항목을 가져오되 는 포함하지 않음 \r
또는 끝에 항목 가져오기
./grabserial -d "/dev/ttyUSB4" -b 9600 | stdbuf -oL tr '#' '\n' | sed 's/$/#\r/' > RFIDs.txt
입장하기#
그리고\r
끝에 있어요 .
결론(TL;DR) #2:
주문을 어떻게 종료하는지 말씀하지 않으셨습니다. Ctrl+ 를 입력 C하면가능한문제 1 의 원인. 그렇다면 다음을 시도하십시오.
- 위의 명령줄 중 하나를 백그라운드에 넣은
&
다음 사용하세요. - 종료할 준비가 되면 a를 수행
ps
하고 프로세스의 PID를 얻은grabserial
다음 - 명령으로 죽여라
kill
.
결론(TL;DR) #3:
실시간으로 데이터를 읽을 수 있어야 하지만 자세히 설명할 필요는 없다고 하셨습니다. stdin에서 읽을 수 있는 프로그램/스크립트가 있는 경우 다음을 시도해 보십시오.
./grabserial -d "/dev/ttyUSB4" -b 9600 | stdbuf -oL tr '#' '\n' | stdbuf -oL tr '#' '\n' | stdbuf -oL tr '#' '\n' | sed 's/$/#\r/'티셔츠RFIDs.txt | 귀하의 프로그램
데이터를 프로그램으로 전송하는 동안 출력 파일에 데이터를 써야 합니다.
결론(TL;DR) #4:
사실, cat
과 가 잘 작동 한다면 grabserial
실제로 둘 중 어느 것도 필요하지 않습니다.
stdbuf -oL tr '#' '\n' < /dev/ttyUSB4 | sed 's/$/#\r/' > RFIDs.txt
또한 잘 작동해야 합니다.
____________
1 귀하의 업데이트에 따르면 이것은 귀하의 문제가 아닐 수도 있지만 다른 사람에게 도움이 될 수 있도록 여기에 남겨 둡니다.
tr
이는 기본적으로 일대일 기반으로 작동한다는 점에 유의하세요 . (약간 화려한 작업을 수행할 수 있는 옵션도 있습니다.) 예를 들어,
tr 'abc…' 'ABC…'
, , , 등 a
으로 교체됩니다 . 그래서 당신은A
b
B
c
C
할 수 없다다음과 같은 일을 해라
tr '#' '#\r\n'
답변2
sed
출력은 일반적으로 버퍼 크기가 채워질 때까지(4K 바이트 정도) 버퍼링되므로 GNU -u
특정 옵션을 사용하여 출력을 버퍼링 해제할 수 있습니다.
보다파이프라인에서 버퍼링 끄기그리고 관련답변sed
.