В 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 и номер интерфейса — это гораздо более гибко.
Любая помощь приветствуется!
В конце концов я нашел решение, поэтому я публикую для всех, кому это может понадобиться.
Вы можете открыть последовательный порт, используя один из 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");
}
Таким образом, вам не нужно ждать, пока данные станут доступными, и вам не придется иметь дело с блокировкой портов.