USB 허브가 USB-직렬 어댑터에서 데이터를 삭제함

USB 허브가 USB-직렬 어댑터에서 데이터를 삭제함

저는 현재 직렬 장치(주로 ARM 보드)로부터 데이터를 수신해야 하는 시스템을 설계하고 있습니다. 이를 달성하기 위해 일부 USB-직렬(FTDI232) 어댑터를 사용합니다. 설정을 테스트하기 위해 간단한 루프백 프로그램(9600보드)을 코딩하고 ARM 보드를 플래시한 후 데이터 손실 없이 내가 보낸 모든 것을 성공적으로 수신할 수 있었습니다.

그러나 이 시스템은 결국 많은 보드와 통신해야 합니다. 그래서 USB 허브를 USB 포트에 연결해서 더 많은 보드를 연결하는데 사용했습니다. 그러나 며칠 후 우리는 몇 가지 문제를 발견했습니다. 처음에는 약간의 비트 플립이 있었던 것 같았습니다. 그러다가 보드로부터 메시지를 받을 때 전체 바이트도 삭제된다는 사실이 밝혀졌습니다. 이러한 어댑터를 중간에 허브 없이 일반 USB 포트에 연결하면 문제가 사라졌습니다.

우리는 이것이 버퍼링 문제라고 가정했습니다. 직렬 컨트롤러나 장치가 데이터를 너무 빨리 전송하고 있을 수 있습니다. 따라서 우리는 직렬 측에 RTS/CTS 흐름 제어를 설치했습니다. 다시 말하지만, 직렬 어댑터가 PC에 직접 연결된 경우가 아니라 USB 허브에 의해 바이트가 삭제되었습니다.

USB 허브를 더 비싼 것으로 바꿨지만 아무 것도 바뀌지 않았습니다. PC를 바꿨지만 역시 문제가 해결되지 않았습니다. 또한 허브가 직렬 어댑터로 보내는 패킷을 삭제하지 않고 직렬 어댑터에서 보낸 패킷만 삭제한다는 점은 혼란스럽습니다.

이 문제를 어떻게 해결할 수 있는지 또는 문제의 원인이 무엇인지 아는 사람이 있습니까? 우리는 USB 허브가 원인이라고 생각하고 있습니다. 그러나 우리는 많은 장치를 연결해야 하므로 이에 의존합니다. 따라서 자체 직렬 처리 솔루션(전용 FPGA 또는 Pi 기반)을 만들기 전에 여기 누군가가 무슨 일인지 알고 있는지 묻고 싶었습니다. 더 빠른 폴링을 허용하는 Linux 구성 파일이 있습니까(폴링 문제인 경우)? 여기서는 직렬 어댑터가 문제가 아닌 것 같습니다.

답변1

이를 달성하기 위해 일부 USB-직렬(FTDI232) 어댑터를 사용합니다.

USB 2.0 HS 프로토콜을 사용하는 더 나은 어댑터를 구입하세요. HS 허브를 통한 FS 장치의 한 가지 점은 호스트가 분할 트랜잭션 프로토콜을 사용해야 한다는 것입니다. 이는 끔찍한 복잡성으로 인해 구현이 어려운 것으로 알려져 있습니다. 나는 분할 트랜잭션 엔진이 다수의 형편없는 FS UART 브리지에서 테스트되었다고 확신하지 않습니다.

또 다른 점은 많은 USB 2.0 허브에 단일 TT가 있으므로 전반적인 성능이 좋지 않으며 버퍼링/스케줄링에 매우 주의해야 한다는 것입니다. 다시 말하지만, 미친 CDC 폴링 프로토콜을 사용하면 모든 베팅이 중단되어야 합니다. FT232H를 기반으로 하는 더 나은 USB-UART 브리지를 구입하세요.

직접 호스트 연결과 USB 허브를 통한 연결의 차이점은 호스트의 경우 트랜잭션이 기본 FS 프로토콜에서 직접 수행되는 반면 허브를 통한 연결에는 분할 트랜잭션과 함께 작동하는 특수 드라이버가 필요하다는 것입니다. 약한 분할 트랜잭션 드라이버가 있을 수 있습니다.

답변2

USB2와 USB3 장치 및 인터페이스를 혼합할 때는 신중해야 합니다. 이러한 혼합으로 인해 일부 문제가 발생할 수 있습니다. 또한 일부 USB 허브는 단순히 쓰레기라는 점을 기억하십시오.

관련 정보