使用设备VID / PID打开USB串行端口

时间:2015-07-09 10:37:08

标签: c++ c linux linux-device-driver ftdi

在Linux中,usb-serial转换器通常显示为/ 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和接口号 - 它更灵活。

任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

我最终找到了一个解决方案,因此我可以为任何可能需要此功能的人发帖。

您可以使用ftdi_usb_open_xxx()功能之一打开串口。对我来说,ftdi_usb_open_desc_index做了伎俩;如果您连接了多个相同类型的芯片,则index非常有用。

然后使用ftdi_set_baudrateftdi_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");
    }

这样您似乎不必等待数据可用,因此您不必处理阻塞端口。

相关问题