Linux程序开发要用到串口编程怎么样知道插入的USB设备是什么类型的设备

荷里活老耄 2009-10-28 03:36:45
Linux程序开发要用到串口编程怎么样知道插入的USB设备是什么类型的设备。
我下了个捕获内核发过来的netlink消息的程序,
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <sys/un.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <linux/types.h>
#include <linux/netlink.h>
#include <errno.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>

#define UEVENT_BUFFER_SIZE 2048

static int init_hotplug_sock()
{
const int buffersize = 1024;
int ret;

struct sockaddr_nl snl;
bzero(&snl, sizeof(struct sockaddr_nl));
snl.nl_family = AF_NETLINK;
snl.nl_pid = getpid();
snl.nl_groups = 1;

int s = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
if (s == -1)
{
perror("socket");
return -1;
}
setsockopt(s, SOL_SOCKET, SO_RCVBUF, &buffersize, sizeof(buffersize));

ret = bind(s, (struct sockaddr *)&snl, sizeof(struct sockaddr_nl));
if (ret < 0)
{
perror("bind");
close(s);
return -1;
}

return s;
}

int main(int argc, char* argv[])
{
int hotplug_sock = init_hotplug_sock();

while(1)
{
/* Netlink message buffer */
char buf[UEVENT_BUFFER_SIZE * 2] = {0};
recv(hotplug_sock, &buf, sizeof(buf), 0);
printf("%s\n", buf);

/* USB 设备的插拔会出现字符信息,通过比较不同的信息确定特定设备的插拔,在这添加比较代码 */

}
return 0;
}


但是在插入两种不同的USB设备的时候,无法判别设备的类型。
下面是插入一种USB设备三次返回的结果
add@/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb1/1-1
add@/class/usb_endpoint/usbdev1.4_ep00
add@/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb1/1-1/1-1:1.0
add@/class/usb_endpoint/usbdev1.4_ep81
add@/class/usb_endpoint/usbdev1.4_ep01
add@/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb1/1-1/1-1:1.0/ttyUSB0
add@/class/tty/ttyUSB0
add@/class/usb_device/usbdev1.4

add@/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb1/1-1
add@/class/usb_endpoint/usbdev1.5_ep00
add@/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb1/1-1/1-1:1.0
add@/class/usb_endpoint/usbdev1.5_ep81
add@/class/usb_endpoint/usbdev1.5_ep01
add@/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb1/1-1/1-1:1.0/ttyUSB0
add@/class/tty/ttyUSB0
add@/class/usb_device/usbdev1.5

add@/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb1/1-1
add@/class/usb_endpoint/usbdev1.6_ep00
add@/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb1/1-1/1-1:1.0
add@/class/usb_endpoint/usbdev1.6_ep81
add@/class/usb_endpoint/usbdev1.6_ep01
add@/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb1/1-1/1-1:1.0/ttyUSB0
add@/class/tty/ttyUSB0
add@/class/usb_device/usbdev1.6

其中的usbdev1.4,usbdev1.5,usbdev1.6是不断累加的。

这是插入另外一种USB设备四次:
add@/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb1/1-1
add@/class/usb_endpoint/usbdev1.23_ep00
add@/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb1/1-1/1-1:1.0
add@/class/usb_endpoint/usbdev1.23_ep81
add@/class/usb_endpoint/usbdev1.23_ep01
add@/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb1/1-1/1-1:1.0/ttyUSB0
add@/class/tty/ttyUSB0
add@/class/usb_device/usbdev1.23

add@/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb1/1-1
add@/class/usb_endpoint/usbdev1.24_ep00
add@/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb1/1-1/1-1:1.0
add@/class/usb_endpoint/usbdev1.24_ep81
add@/class/usb_endpoint/usbdev1.24_ep01
add@/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb1/1-1/1-1:1.0/ttyUSB0
add@/class/tty/ttyUSB0
add@/class/usb_device/usbdev1.24

add@/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb1/1-1
add@/class/usb_endpoint/usbdev1.25_ep00
add@/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb1/1-1/1-1:1.0
add@/class/usb_endpoint/usbdev1.25_ep81
add@/class/usb_endpoint/usbdev1.25_ep01
add@/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb1/1-1/1-1:1.0/ttyUSB0
add@/class/tty/ttyUSB0
add@/class/usb_device/usbdev1.25

add@/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb1/1-1
add@/class/usb_endpoint/usbdev1.26_ep00
add@/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb1/1-1/1-1:1.0
add@/class/usb_endpoint/usbdev1.26_ep81
add@/class/usb_endpoint/usbdev1.26_ep01
add@/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb1/1-1/1-1:1.0/ttyUSB0
add@/class/tty/ttyUSB0
add@/class/usb_device/usbdev1.26
...全文
391 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
newman0708 2010-08-13
  • 打赏
  • 举报
回复
在我机器上要改一小点才能看到结果,如下。
还有具有root权限才能连接成功。
Linux newman0708 2.6.26-2-686

int main(int argc, char* argv[])
{
int hotplug_sock = init_hotplug_sock();

while(1)
{
/* Netlink message buffer */
char buf[UEVENT_BUFFER_SIZE * 2] = {0};
recv(hotplug_sock, &buf, sizeof(buf), 0);
if(strlen(buf)>0)
printf("%s\n", buf);

/* USB 设备的插拔会出现字符信息,通过比较不同的信息确定特定设备的插拔,在这添加比较代码 */

}
return 0;
}
荷里活老耄 2009-11-02
  • 打赏
  • 举报
回复
恩 上次找到了。原来串口设备插入linux里面的时候,会在/dev文件夹下生成ttyUSBn(n=0,1,2,3...)
也就是说我们可以通过从套接接收到的字符串中提取路径。如:add@/class/tty/ttyUSB0 ,设备文本打开路径就是/dev/ttyUSB0。
winter_sui 2009-10-28
  • 打赏
  • 举报
回复
原来内核还有这样一个功能阿,通过网络向外输出东西。netlink我还头一次听说。

add@/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb1/1-1/1-1:1.0
这些东西是设备路径么。如果是路径的话,你可以把它open了,然后通过ioctl之类的
调用应该可以得到设备的信息。

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧