118 lines
No EOL
4.2 KiB
C++
118 lines
No EOL
4.2 KiB
C++
#include "find_usb_serial_port.h"
|
|
|
|
#include <unistd.h>
|
|
#include <dirent.h>
|
|
|
|
/*---------------------------------------------------------------------*\
|
|
| |
|
|
| find_usb_serial_port |
|
|
| |
|
|
| This function returns the name of the first USB serial port matching|
|
|
| the given USB product and vendor ID. |
|
|
| |
|
|
| vid: Vendor ID code |
|
|
| pid: Product ID code |
|
|
| |
|
|
| returns: std::string containing port name "COMx" or "/dev/ttyX" |
|
|
| |
|
|
\*---------------------------------------------------------------------*/
|
|
|
|
std::string find_usb_serial_port(unsigned short vid, unsigned short pid)
|
|
{
|
|
std::string ret_string = "";
|
|
DIR* dir;
|
|
char symlink_path[1024] = {0};
|
|
struct dirent* ent;
|
|
char vid_pid[10] = {0}; //Store VID/PID
|
|
|
|
/*-----------------------------------------------------------------*\
|
|
| Open /sys/class/tty |
|
|
\*-----------------------------------------------------------------*/
|
|
dir = opendir("/sys/class/tty");
|
|
|
|
if(dir == NULL)
|
|
{
|
|
return ret_string;
|
|
}
|
|
|
|
/*-----------------------------------------------------------------*\
|
|
| Loop through all symlinks in /sys/class/tty directory to find |
|
|
| paths with "usb" in them. These links should have the USB device |
|
|
| index which can be used to find the VID/PID |
|
|
\*-----------------------------------------------------------------*/
|
|
ent = readdir(dir);
|
|
|
|
while(ent != NULL)
|
|
{
|
|
if(ent->d_type == DT_LNK)
|
|
{
|
|
char tty_path[1024];
|
|
strcpy(tty_path, "/sys/class/tty/");
|
|
strcat(tty_path, ent->d_name);
|
|
|
|
readlink(tty_path, symlink_path, 1024);
|
|
|
|
char * usb_string = strstr(symlink_path, "usb");
|
|
|
|
if(usb_string != NULL)
|
|
{
|
|
char * usb_dev = strstr(usb_string, "/");
|
|
usb_dev++;
|
|
usb_dev = strtok(usb_dev, "/");
|
|
|
|
char usb_path[1024];
|
|
|
|
strcpy(usb_path, "/sys/bus/usb/devices/");
|
|
strcat(usb_path, usb_dev);
|
|
|
|
char vendor_path[1024];
|
|
char product_path[1024];
|
|
|
|
strcpy(vendor_path, usb_path);
|
|
strcat(vendor_path, "/idVendor");
|
|
|
|
strcpy(product_path, usb_path);
|
|
strcat(product_path, "/idProduct");
|
|
|
|
std::ifstream vendor_file;
|
|
std::ifstream product_file;
|
|
std::string vendor_string;
|
|
std::string product_string;
|
|
|
|
vendor_file.open(vendor_path);
|
|
product_file.open(product_path);
|
|
|
|
std::getline(vendor_file, vendor_string);
|
|
std::getline(product_file, product_string);
|
|
|
|
snprintf(vid_pid, 10, "%04x", vid);
|
|
|
|
if(strcmp(vid_pid, vendor_string.c_str()) == 0)
|
|
{
|
|
snprintf(vid_pid, 10, "%04x", pid);
|
|
if(strcmp(vid_pid, product_string.c_str()) == 0)
|
|
{
|
|
char* port_string = NULL;
|
|
for(int i = strlen(tty_path); i > 0; i--)
|
|
{
|
|
if(tty_path[i] == '/')
|
|
{
|
|
port_string = &tty_path[i + 1];
|
|
break;
|
|
}
|
|
}
|
|
ret_string.append("/dev/");
|
|
ret_string.append(port_string);
|
|
|
|
return ret_string;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
ent = readdir(dir);
|
|
}
|
|
|
|
return ret_string;
|
|
|
|
} /* find_usb_serial_port() */ |