2010-07-20 25 views
0

현재 시리얼 포트를 통해 PC에 연결된 임베디드 디바이스가 있습니다. PC에서 데이터를받는 데 문제가 있습니다. PCI 직렬 포트 카드를 사용할 때 데이터를 즉시 수신 할 수 있습니다 (지연 없음). 직렬 포트에 내장 된 USB-to-Serial 플러그 또는 마더 보드를 사용할 때 데이터 읽기 (32 바이트 패킷의 경우 40ms)를 지연해야합니다.시리얼 전송 UART 지연

하드웨어간에 유일한 차이점은 UART입니다. PCI 카드는 16650을 사용하고 플러그/마더 보드는 표준 16550A를 사용합니다. PCI 카드는 28 바이트에서 인터럽트하도록 설정되고 플러그는 14 바이트에서 인터럽트로 설정됩니다.

나는 56700 Baud (이 도움이되는 경우)에 연결되어 있습니다.

지연이 듀티 사이클의 대부분이되어 실제로 전송 시간이 길어집니다. (10 분 이동 대 1 시간 이동).

왜 플러그/마더 보드와 지연을 사용해야하는 이유에 대한 설명이 있습니까? 누구든지이 지연 최소화 또는 제거에 대한 가능한 해결책을 제안 할 수 있습니까?

+0

하드웨어 흐름 제어 기능을 사용하도록 설정 했습니까? 내장 된 장치가 16650을 사용합니까? – nmichaels

+0

아니요, 하드웨어 흐름 제어가 켜져 있지 않습니다. 현재 RX/TX와 지상선 만 사용하고 있습니다. 임베디드 장치는 atmel atmega 128L 및 7.3728 MHz 크리스털을 사용합니다. 나는 이것을 "16650 호환"이라고 생각합니다. Peter : 예 마더 보드의 인터럽트 지점을 조정할 수 있습니다. 그러나 그 범위는 16550 UART (16 바이트 FIFO 버퍼)를 사용하기 때문에 1-14 바이트이기도합니다. 지연은 실제로 마더 보드 연결의 불일치 오류를 1 시간의 긴 전송 동안 수백에서 10 미만으로 최소화하는 데 도움이되었습니다. –

답변

2

Linux에는 사용할 수있는 직렬 드라이버에 대해 ASYNC_LOW_LATENCY 플래그가 있습니다. 어떤 드라이버를 사용 하던지간에 비슷한 점이있을 수 있습니다.

그러나 대기 시간은 대량 전송에 차이를 만들어서는 안됩니다. 전송이 시작될 때 40ms가 더 걸릴 것입니다. 이것이 드라이버가 처음에는 걱정하지 않는 이유입니다. 해당 전송 속도 및 대기 시간에서 32 바이트 패킷을 수행하는 경우 약 100 패킷의 창 크기를 사용하여 sliding window protocol을 사용하도록 전송 프로토콜을 리팩터링하는 것이 좋습니다. 즉, 100 패킷 전에 보낸 패킷에 대한 ACK를받지 못한 경우에만 전송을 중지하고 싶습니다.

+0

패킷 크기를 32 바이트에서 256 바이트로 늘렸으므로 지연을 40ms에서 65ms로 늘려야했습니다. 이로 인해 내 의사 소통 시간이 1 시간에서 14 분으로 단축되었습니다. –

0

아마도 다른 USB 직렬 변환기가 다른 결과를 생성합니다. 우리는 FTDI가 임베디드 장치와 통신하는 데 적합하다는 것을 발견했습니다. 일부 변환기는 오랫동안 데이터를 버퍼링하거나 파쇄하는 것으로 보입니다.

나는 마더 보드 연결에 문제가 본 적이 없어 - 거기에 무슨 일이 일어나고 있는지 확실하지! 마더 보드 직렬 포트의 인터럽트 지점을 변경할 수 있습니까?

+0

직렬/USB 변환기에서 두 번째. 나는 하루 종일 ascii 데이터로 작동하지만 높은 (115,200) 비트 속도로 바이너리 데이터가 손상되는 것을 보았습니다. – nmichaels

+0

내가 사용중인 USB- 직렬 변환기는 Prolific 칩을 사용하는 Trendnet TU-S9입니다. PCI 카드는 Sunix 브랜드입니다. –

0

나는 USB to serial converter를 가지고있다. 내 브레이크 아웃 상자에 연결하고 루프백을 만들면 문제없이 1Mbps 가까이에서 보내고받을 수 있습니다. 직렬 포트는 ASCII 데이터로 변환 될 수있는 바이너리 데이터를 전송합니다.

사용 닷넷 내가 모든 바이트에 이벤트를 발생 내 소프트웨어를 설정 (ReceivedBytesThreshold = 1),하지만 그게 의미하지 않습니다.