2016-12-03 2 views
1

시리얼 포트를 사용하여 마이크로 컨트롤러 (STM32F103C8T6)와 통신하는 간단한 파이썬 스크립트가 있습니다. 한 번에 두 개의 44 바이트 메시지를 작성하기 위해 pySerial을 사용하고 있습니다.Python을 사용하여 시리얼을 통해 통신하기위한 최소 지연

[...] 
serial = serial.Serial(serial.tools.list_ports.comports()[0].device, 115200) 

packet0 = bytearray(INSERT_RELEVANT_44-BYTES) 
packet1 = bytearray(INSERT_RELEVANT_44-BYTES) 
serial.write(packet0) 

time.sleep(0.1) # Delay between communications 

serial.write(packet1) 
[...] 

통신 사이에 지연을 삽입해야합니다. 그렇지 않으면 작동하지 않습니다. 내 추론은 115200 bps의 전송 속도의 경우 메시지는 44 * 8/115200 = ~ 0,003 초 전송되어야하므로 패킷 전송 사이의 최소 간격이되어야합니다. 그러나 코드는 0,1보다 작은 값에서는 작동하지 않습니다.

왜? 내가 놓친 게 있니? 운영 체제 및 USB로 인해 지연이 발생한다고 가정하겠습니다 만, 0,7 초를 고려해서는 안됩니다. 최소 지연 시간을 사용하려면 어떻게 최적화 할 수 있습니까?

+0

* "작동하지 않을 것입니다"* - 진단 정보가 포함되지 않은 요약입니다. 당신의 * "추론"*은 약간 꺼져 있습니다. 그것은 문자 당 프레이밍의 2 비트를 설명하지 못합니다. 당신은 최소한의 지연으로 전송하는 것이 실용적이라고 생각하게합니다; 즉 그러한 패킷 레이트를 처리 (수신 및 처리) 할 수있는 수신기인가? 또한 수면 기능의 정확성과 해석 된 언어의 오버 헤드를 고려하십시오. – sawdust

+0

그것은 stm32에서 직렬 포트를 사용하는 방법에 따라 다릅니다. stm32에서 작성한 코드를 공유 할 수 있습니까? – saygins

+0

발신 측에서만 원인을 찾고있는 것 같습니다. 문자를 잃을 수있는 발신자와 수신자가 있습니다 (귀하의 경우 문자 그대로 문자가 손실 될 수있는 USB 대 직렬 어댑터가있는 것 같습니다). * 문제가있는 곳에서 더 많은 진단을하지 않으면 아마 도움이되지 않을 것입니다. – tofro

답변

0

오히려 그런 다음 UART 링크를 기반으로 소액의 지연을 계산, 당신은 단순히 송신 버퍼가 비어 있는지 여부를 확인하려면 직렬 드라이버를 폴링 수 :

이 어떤 대기 시간을 자동으로 회계의 장점이있다
serial.write(packet0) 
while serial.outWaiting() > 0 : 
    pass 
serial.write(packet1) 

, 라이브러리, 드라이버, USB-Serial 브리지의 체인에서 소프트웨어 오버 헤드 및 버퍼 제한이 있습니다. 그러나 STM32 직렬 I/O 구현의 문제를 해결할 수는 없지만 데이터를 스트리밍 할 수없는 이유에 대한 근본적인 문제를 해결해야합니다. STM32 디바이스의 구현이 제대로 수행되지 않을 가능성이 가장 큽니다.

+0

USB <> 직렬 어댑터는 여전히 일반적인 COM 포트처럼 각 바이트를 출력하기 위해 10 보를 필요로합니다. 따라서 좋은 선택이라고 할 수는 없지만 "할 수"있습니다. 따라서 오버 헤드에 퍼지 요인을 추가하는 것과 같은 최소 지연을 계산하십시오 . USB <> 직렬 어댑터의 버퍼 크기는 이것에 아무런 영향을 미치지 않습니다. 완전히 무의미합니다. – barny

+0

@barny : 아마 내 주장이 불투명했다. 우리는 실제 문제가 무엇인지 모릅니다. 문제는 해결책이 문제가 아니라는 것입니다.어댑터가 128 비트의 버퍼링을한다고하면, 지연없이 데이터 블럭 모두를 전송할 수 있으며 모든 데이터는 UART가 어댑터에서 STM32로 링크하는 시간보다 훨씬 짧은 시간에 PC의 관점에서 전송됩니다. 링크의 USB 부분에는 UART 섹션이없는 동안 흐름 제어 기능이 있습니다. 버퍼링은 물론 데이터가 스트리밍되는 경우에는 관계가 없지만 여기서 오류는 단 두 개의 44 바이트 블록 이후에 발생합니다. – Clifford

+0

당신은 여전히 ​​USB <> RS232 장치에서 중요한 것처럼 버퍼링에 대해 이야기하고 있습니다. 특히, 흐름 제어가 없다면 파이썬 코드에 관한 한 COM 포트는 일반적인 포트이며, 데이터는 "UART"에서 STM32 방향으로 전송되는 것처럼 빠르게 전송됩니다. 나는 시리얼을 가정하고 윈도우는 모두 버퍼를 유지할 것이다. 따라서 USB <> RS232 어댑터의 버퍼 크기는 전혀 상관이 없으므로 "답변"에 전혀주의를 기울이지 마십시오. – barny

관련 문제