使用设备 VID/PID 打开 USB 串口
opening a usb-serial port using the device VID/PID
在Linux中,usb串口转换器通常显示为/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 open 函数打开基于 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)
现在的问题 - 我可以使用设备 vid/pid 而不是它的开发模式路径来打开 UART 端口吗?这一切都归结为 ftdi 函数调用,但我似乎找不到示例。
为什么我需要这样做?我不想知道节点路径。我应该可以只使用 VID/PID 和接口号 - 它更灵活。
感谢任何帮助!
我最终找到了解决方案,所以我发帖给可能需要的人。
您可以使用 ftdi_usb_open_xxx()
函数之一打开串口。对我来说,ftdi_usb_open_desc_index
成功了;如果连接了多个相同类型的芯片,索引很有用。
然后用ftdi_set_baudrate
和ftdi_set_line_property
配置端口。 read/write 和 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 connected
if(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");
}
这样您似乎不必等待数据可用,因此您不必处理阻塞端口。
在Linux中,usb串口转换器通常显示为/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 open 函数打开基于 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)
现在的问题 - 我可以使用设备 vid/pid 而不是它的开发模式路径来打开 UART 端口吗?这一切都归结为 ftdi 函数调用,但我似乎找不到示例。
为什么我需要这样做?我不想知道节点路径。我应该可以只使用 VID/PID 和接口号 - 它更灵活。
感谢任何帮助!
我最终找到了解决方案,所以我发帖给可能需要的人。
您可以使用 ftdi_usb_open_xxx()
函数之一打开串口。对我来说,ftdi_usb_open_desc_index
成功了;如果连接了多个相同类型的芯片,索引很有用。
然后用ftdi_set_baudrate
和ftdi_set_line_property
配置端口。 read/write 和 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 connected
if(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");
}
这样您似乎不必等待数据可用,因此您不必处理阻塞端口。