[英]opening a usb-serial port using the device VID/PID
在Linux中,USB串行轉換器通常在/ dev目錄:/ dev / ttyUSBx中顯示為一個節點。
要使用串行轉換器,第一步是打開端口,然后進行配置,依此類推。
port = open("/dev/ttyUSB0", O_RDWR);
如果要使用串行設備(I2C或SPI),則ftdi提供了可以用作普通UART端口或i2c / spi的設備(如FT4232或FT232h)。
對於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
。 如果您連接了多個相同類型的芯片,則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 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");
}
這樣,您似乎不必等待數據可用,因此您不必處理阻塞端口。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.