открытие последовательного USB-порта с помощью устройства VID / PID

В Linux преобразователи usb-serial обычно отображаются как узел в каталоге / dev: / dev / ttyUSBx.

Чтобы использовать последовательный преобразователь, сначала откройте порт, затем настройте его и т. Д.

port = open("/dev/ttyUSB0", O_RDWR);

Если вы хотите использовать последовательное устройство (I2C или SPI), ftdi предлагает устройства (например, FT4232 или FT232h), которые можно использовать как обычный порт UART или i2c / spi.

Для работы i2c / spi вы должны использовать отдельный драйвер — я использую открытый исходный код libmpsse. Это библиотека, которую вы должны установить, чтобы она работала параллельно со стандартным драйвером FTDI, поскольку она построена на этом.

Итак, теперь, если я хочу открыть порт как UART, я использую обычную функцию открытия (упомянутую выше). И если я хочу подключить устройство i2c / spi, я использую функцию открытия libmpsse, которая открывает порт на основе VID / PID:

struct mpsse_context *Open(int vid, int pid, enum modes mode, int freq, int endianess, int interface, const char *description, const char *serial)

Теперь вопрос — могу ли я открыть порт как UART, используя устройство vid / pid вместо пути к его режиму разработки? Все сводится к вызовам функций ftdi, но я не могу найти пример.

Почему мне нужно сделать это так? Я не хочу знать путь к узлу. Я должен быть в состоянии использовать только VID / PID и номер интерфейса — это гораздо более гибко.

Любая помощь приветствуется!

1

Решение

В конце концов я нашел решение, поэтому я публикую для всех, кому это может понадобиться.

Вы можете открыть последовательный порт, используя один из ftdi_usb_open_xxx() функции. Для меня, ftdi_usb_open_desc_indexсделал трюк; index полезен в случае, если у вас подключено более одного чипа одного типа.

Затем вы настраиваете порт с ftdi_set_baudrate а также ftdi_set_line_property, И читать / писать с ftdi_read_data()/ftdi_write_data(),

Вот короткий пример:

    struct ftdi_context ftdic;

// ftdilib initialization
if(ftdi_init(&ftdic) == 0)
{

ftdi_set_interface(&ftdic, IFACE_C);//this is where my serial device is connectedif(ftdi_usb_open_desc_index(&ftdic, vid, pid, NULL, NULL, 0) == 0)
{
printf("serial port open\n");

if(ftdi_set_baudrate(&ftdic, 9600) < 0)
{
printf("baudrate incorrect\n");
}if(ftdi_set_line_property(&ftdic, BITS_8, STOP_BIT_1, NONE)<0)
{
printf("line settings incorrect");
}

for(;;)
{
unsigned char c;
ftdi_read_data(&ftdic, &c, 1);
printf("0x%2x ",c);
}
}
else
{
printf("could not open serial port \n");
}
}
else
{
printf("init failed\n");
}

Таким образом, вам не нужно ждать, пока данные станут доступными, и вам не придется иметь дело с блокировкой портов.

0

Другие решения


По вопросам рекламы [email protected]