덫

성공적으로 읽을 때마다 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으로 교체됩니다 . 그래서 당신은AbBcC할 수 없다다음과 같은 일을 해라

tr '#' '#\r\n'

답변2

sed출력은 일반적으로 버퍼 크기가 채워질 때까지(4K 바이트 정도) 버퍼링되므로 GNU -u특정 옵션을 사용하여 출력을 버퍼링 해제할 수 있습니다.

보다파이프라인에서 버퍼링 끄기그리고 관련답변sed.

관련 정보