c++ - 使用设备 VID/PID 打开 USB 串口

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

在 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 打开功能,它根据 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 和接口(interface)编号 - 它更加灵活。

感谢任何帮助!

最佳答案

我最终找到了解决方案,所以我发布给可能需要它的任何人。

您可以使用 ftdi_usb_open_xxx() 函数之一打开串口。对我来说,ftdi_usb_open_desc_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");
    }

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

关于c++ - 使用设备 VID/PID 打开 USB 串口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31314977/

相关文章:

c++ - 如何在可变参数模板函数中访问参数

c++ - C++运行时链接错误的含义?

c++ - 用 C/C++ 扩展 Python

linux - 关于grep的问题

linux - 在 Mac OS X 下模拟 Linux 二进制文件

c++ - 您多久检查一次 C++ 新指令中的异常?

c++ - 这是使用抽象工厂模式的示例吗?

c++ - gdb: 在 0x2aaaaaaab000 添加的符号文件系统提供的 DSO 中找不到可加载的部分

c - C 中的字符串中添加了不需要的字符

c++ - 在 C++ 程序中嵌入数据