나는 Raspberry Pi에 있는 4개의 USB 직렬 포트에서 데이터를 만성적으로 기록하고 있는데, 이는 결국 추가 처리를 위해 로컬 네트워크의 다른 컴퓨터에 도달해야 합니다. 보기보다 상황을 더 복잡하게 만드는 몇 가지 제한 사항이 있습니다. 지금까지 시도한 모든 결과는 데이터가 무작위로 누락되거나 잘못된 순서로 표시되는 결과를 가져왔습니다. 저는 Python으로 프로그래밍을 하고 있습니다. 죄송합니다. 다음 내용은 꽤 길지만 상황을 완벽하게 설명하고 싶었습니다.
데이터 요약은 다음과 같습니다.
ㅏ. 각 직렬 포트는 2개의 115.2kb 데이터 측정 채널(즉, 8개 데이터 채널)을 출력하는 센서에 연결됩니다. 각 측정에 대한 데이터는 하나의 행으로 구성됩니다. 이 두 줄은 하나의 메시지가 아닌 직렬 장치에서 개별적으로 전송됩니다.
b. 각 측정은 "XXXX.xxxxxxxxxx chX" 형식의 타임스탬프로 시작됩니다. 정수 부분은 1부터 시작하여 무한히 증가하는 초이고, 소수 부분은 소수점 이하 11자리(10피코초 분해능)입니다. 타임스탬프 뒤에는 고유 식별자 "chA", "chB" 등이 최대 "chH"까지 오고 줄은 개행 문자로 끝납니다. 타임스탬프예데이터 - 외부 장치로부터 펄스가 수신되면 표시됩니다. 예는 다음과 같습니다. "123.12345678901 chD\n"
b. 공칭 데이터 속도는 채널당 초당 1회 측정입니다.
씨. 8개 판독값의 각 "섹션"에 대해 모든 유효한 타임스탬프가 중앙값의 +/-0.5초 내에 있어야 한다고 규정할 수 있습니다. 전파는 일반적으로 몇 마이크로초에 가깝기 때문에 1초 범위는 유효한 데이터에 많은 여유를 제공합니다.
섹션 d의 타임스탬프는 두 번째 경계에 걸쳐 있거나 모두 1초 내에 발생할 수 있습니다(단계 관계는 시작 시 임의로 설정됩니다).
e. 각 섹션의 데이터 행이 수신되는 순서는 보장되지 않습니다. 다음은 예시 섹션입니다.
1234.01231231231 확인 1234.02342342342chB 1233.99999912345ch 1234.03453453453chC 1234.03213213213 chD 1234.04324324324프랑 1234.01234567890 chG 1233.99999954321chH
이는 다음을 나타냅니다. (1) 섹션의 데이터는 정수 초에 걸쳐 있을 수 있습니다. (2) 데이터는 채널 순서로 수신되지 않을 수 있습니다. (3) 데이터는 항상 오름차순으로 수신되지 않습니다.
엄격한 채널 ID 순서(chA, chB, chC, chD, chE, chF, chG, chH)에 따라 각 섹션의 데이터를 배치해야 합니다. 위의 예는 다음과 같이 기록되어야 합니다.
1234.01231231231 확인 1234.02342342342chB 1234.03453453453chC 1234.03213213213 chD 1233.99999912345ch 1234.04324324324프랑 1234.01234567890 chG 1233.99999954321chH
내 현재 접근 방식은 다음과 같습니다.
각 직렬 포트에 대해 별도의 스레드에서 실행되는 Serial.read() 호출이 있으며 공통 대기열을 제공합니다. 이 대기열은 모두 0으로 초기화된 8개 항목 목록을 사용하여 처리합니다. 여기서 각 목록 항목은 채널과 연결되어 있습니다( 예를 들어, list[0]은 chA이고, list[1]은 chB입니다. 등). 각 데이터 행이 들어오면 타임스탬프가 해당 채널의 적절한 슬롯에 배치됩니다. 목록에 더 이상 0 값이 없으면 섹션이 완료되고 chA에서 chH까지 목록을 반복하여 각 값을 출력한 후 다음 섹션에서 0으로 만듭니다.
질문:
이것은 일반적으로 작동하지만 무작위로 데이터의 순서가 잘못되었습니다. 예를 들어 한 채널의 직렬 데이터가 1초 동안 누락되어 목록의 슬롯이 1초 후에 다음 타임스탬프로 채워집니다. 전체 섹션이 사라지는 경우도 있습니다(드물지만). 내 생각엔 직렬 데이터의 문제가 비동기적으로 들어오는 것으로 밝혀졌으며 임의 처리 지연으로 인해 값이 손실되는 것으로 나타났습니다(테스트 결과 직렬 데이터가 실제로 RPi로 전송되는 것으로 확인되었습니다. 손실은 그에서 발생합니다). 처리).
처음에는 동일한 네트워크에 있는 원격 시스템이 유선을 통해 데이터를 얻을 수 있도록 소켓 서버에 데이터를 공급했습니다. 네트워크 스택이 문제의 원인일 수 있다고 생각하여 RPi에 로컬로 데이터를 작성해 보았습니다. 더 잘 작동하지만 여전히 누락되고 순서가 잘못된 샘플이 표시됩니다.
그래서 저는 메시지 손실을 일으키는 병목 현상을 피하거나 데이터를 적절한 섹션으로 재정렬할 수 있는 일종의 재구성 프로그램을 제공하는 방법을 찾고 있습니다. 또한 단일 스레드에서 4개의 통신 포트를 읽는 것이 최선의 접근 방식인지 확실하지 않습니다. 어떤 아이디어라도 크게 감사하겠습니다. 다시 한번 죄송합니다. 질문이 너무 길어졌습니다.
감사해요! 남자