리눅스 고속 문자 감지 RS232

리눅스 고속 문자 감지 RS232

Linux의 rs232 라인 내에서 문자 간 시간을 감지하려면 C로 코드를 작성해야 합니다. 문자 간 감지 시간은 1ms일 수 있습니다. 그래서 들어오는 문자에 매우 빠르게 타임스탬프를 찍을 무언가가 필요합니다. 내가 말하는 매우 빠른 속도는 1ms 미만입니다. 목표는 프레임의 끝과 라인의 새 프레임의 시작을 감지하는 것입니다.

나는 코딩 솔루션을 요청하지 않고 단지 내가 어떤 경로를 취해야 하는지 알 수 있도록 초기 도움을 원합니다. Linux에서 이 작업을 수행할 수 있습니까? 이런 시간에 도달하려면 드라이버를 수정해야 합니까? 또는 사용자 공간에 있는 무언가가 이를 수행할 수 있습니다(그렇지 않다고 생각합니다).

답변1

온보드 UART입니까, 아니면 USB 동글입니까? 첫 번째로, 타임스탬프와 함께 데이터를 저장하고, 타임스탬프가 있는 데이터를 사용자 공간에 전달하고, 사용자 공간에서 이를 정렬하도록 직렬 드라이버 인터럽트 루틴을 수정했습니다. Linux는 실시간이 아니지만 모든 인터럽트에 1ms 이내에 응답할 수 있을 것으로 기대하므로 이 정도면 충분합니다.

USB 동글의 경우 이미 마이크로초 단위의 타임스탬프를 제공하므로 일반 직렬 USB 드라이버와 함께 usbmon사용하거나 해당 타임스탬프에 액세스할 수 있도록 직렬 USB 드라이버를 수정할 수 있어야 한다고 생각합니다 .usbmon

답변2

Linux의 rs232 라인 내에서 문자 간 시간을 감지하려면 C로 코드를 작성해야 합니다.

귀하는 다음을 게시했습니다.XY 문제.

1ms 이상의 무음은 프레임의 끝이자 새 프레임의 시작을 의미하기 때문에 그렇게 하고 싶습니다.

(RS-232와 같은 비동기 직렬 통신에서의 BTW, 부적격 사용"액자"모든 캐릭터가 액자에 담겨 있기 때문에 모호합니다. EG UART가 '프레이밍 오류'를 보고하면 문자가 (아마도) 손실되었습니다. 아마도 실제로는 패킷이나 메시지 단위를 의미하는 것 같습니다.)

귀하의 추가 의견은 마침내 해결이 필요한 실제 X 문제를 드러냅니다.
실제 문제는 메시지 간 간격을 감지하는 것이므로 Y에 대한 원래 질문은 소프트웨어에서 정확하게 구현하기 어려울 뿐만 아니라 X 문제에 대한 실행 가능한 솔루션도 아닙니다.

메시지 간 간격을 감지하기 위해 소프트웨어로 수신된 문자 간의 시간 간격을 "측정"하는 것과 관련된 모든 솔루션은 결함이 있는 솔루션입니다. 이 접근 방식은 퇴화된 경우에 실패합니다.
메시지의 마지막 문자가 도착하고 (한동안) 더 이상 문자가 없으면 마지막으로 수신된 메시지는 다음과 같습니다.정지알고리즘이 시간 차이를 계산할 수 있도록 다음 문자(다음 메시지의 첫 번째 바이트)를 기다리는 동안 무한정입니다.
"다음 문자"가 수신되지 않는 한 "메시지 끝"은 결정되지 않으며 마지막 유효한 메시지는 완료되지만 처리되지 않습니다.

적절한 해결책은 문자가 수신되었는지 또는 수신되지 않았는지 측정할 수 있는 하드웨어를 사용하는 것입니다. 일부 Atmel USART에는수신기 시간 초과메시지 간 간격을 감지하는 기능입니다.

가능한 소프트웨어 솔루션에는 U(S)ART 드라이버가 수신된 문자 간의 시간 간격을 계산하는 데 사용하는 (고해상도) 주기 타이머가 필요합니다. DMA 대신 PIO를 사용하면 드라이버는 각 문자가 수신될 때 간격 수를 재설정해야 합니다. 개수가 임계값을 초과하면(예: 개수 * Interval_time > inter_message_gap_time) 수신자가 너무 오랫동안 침묵하여 메시지 간 간격을 나타냅니다.

관련 정보