精华内容
下载资源
问答
  • 自己编写的串口助手,实测0丢包率,而且支持热插拔。网上绝大部分的串口助手都不支持热插拔,所以自己编写一个。实测很好用,不要随意侵权珍惜我的劳动成果
  • 基于WPF的串口助手 自动检测串口 支持热插拔 C#语言 VS2015工程
  • 1、使用Windows API串口编程方法实现的串口工具(**支持热插拔功能**),Serial.cpp为串口通信类。界面是使用MFC编程的。编译工具是vs2017,也可在vs2008编译执行,此zip中包含可执行的源代码和可直接使用的exe。 注意...
  • } //打开串口函数 void openSerialPort() { if(m_pSerialPort->isOpen()) { m_pSerialPort->clear(); m_pSerialPort->close(); } m_pSerialPort->setPortName(m_pComboBox->currentText().split(":").at(1)); if(!m...
    .pro文件添加:QT       += serialport
    
    //添加头文件
    #include <QSerialPort>
    #include <QSerialPortInfo>
    
    //头文件声明类成员变量
    QSerialPort m_pSerialPort;
    QComboBox* m_pComboBox;
    QTextEdit* m_pTextEdit;
    QLineEdit* m_pLineInput;
    
    //构造函数文件
    QSerialPort m_pSerialPort = new QSerialPort();
    m_pTextEdit = new QTextEidt();
    m_pComboBox = new QComboBox();
    m_pLineInput = new QLineEdit();
    //接收信息信号与槽的连接
    connect(m_pSerialPort, &QSerialPort::readyRead, this, &Widget::onRecvInfo);
    //发生错误时信号与槽的连接
    connect(m_pSerialPort, static_cast<void (QSerialPort::*)(QSerialPort::SerialPortError)>(&QSerialPort::error), this, &Widget::onHandleSerialError);
    
    //初始化ComboBox(运行程序后自动获取设备的所有可用连接)
    void initComboBox()
    {
        m_pComboBox->clear();
        static QList<QSerialPortInfo> serialPortNameList = QSerialPortInfo::availablePorts();
        for(int i = 0; i < serialPortNameList.count(); i++)
            m_pComboBox->addItem("Com " + QString("%1:").arg(i, 2, 10, QChar('0')) +        serialPortNameList.at(i).portName());
    }
    
    
    
    //打开串口函数
    void openSerialPort()
    {
        if(m_pSerialPort->isOpen())
        {
            m_pSerialPort->clear();
            m_pSerialPort->close();
        }
        m_pSerialPort->setPortName(m_pComboBox->currentText().split(":").at(1));
        if(!m_pSerialPort->open(QIODevice::ReadWrite))
            return ;
        m_bInputBtn = true;
        //设置波特率和读写方向
        m_pSerialPort->setBaudRate(QSerialPort::Baud115200, QSerialPort::AllDirections);
        //设置数据位
        m_pSerialPort->setDataBits(QSerialPort::Data8);
        //设置无流控制
        m_pSerialPort->setFlowControl(QSerialPort::NoFlowControl);
        //设置无校验位
        m_pSerialPort->setParity(QSerialPort::NoParity);
        //一位停止位
        m_pSerialPort->setStopBits(QSerialPort::OneStop);
    }
    
    //接收信息槽函数
    void Widget::onRecvInfo()
    {
        QByteArray info = m_pSerialPort->readAll();
        m_pTextEdit->append(info);
        m_pTextEdit->moveCursor(QTextCursor::End);
        //转为16进制
        //QByteArray hexData = info.toHex();
    }
    
    //错误处理槽函数
    void Widget::onHandleSerialError(QSerialPort::SerialPortError error)
    {
        if (error == QSerialPort::ResourceError) {
                QMessageBox::critical(this, tr("Error"), "串口连接中断,请检查是否正确连接!");
                m_pSerialPort->close();
        }
    }
    
    //发送信息到设备函数
    void sendMsg()
    {
        QString str = m_pLineInput->text();
        str = str + "\n";
        QByteArray byteArry = str.toLatin1();
        m_pSerialPort->write(byteArry);
        m_pLineInput->clear();
    }

     

    展开全文
  • MiniGUI鼠标热插拔支持

    千次阅读 2015-07-21 19:05:17
    因产品需求,需要minigui支持USB鼠标支持热插拔功能。但是奇怪的是测试人员说以前测试的时候是支持usb热插拔的,现在不行了。这叫我情何以堪,我压根就没动什么呀,从linux内核到文件系统再到minigui 的库,我印象中...

        因产品需求,需要minigui支持USB鼠标支持热插拔功能。但是奇怪的是测试人员说以前测试的时候是支持usb热插拔的,现在不行了。这叫我情何以堪,我压根就没动什么呀,从linux内核到文件系统再到minigui 的库,我印象中压根就没动和鼠标相关的东西,怎么会出现以前可以,现在不可以呢?于是我从两个方面着手,project和MiniGUI.cfg文件开始排查。

        痛下一番功夫才定位到问题所在,MiniGUI.cfg文件配置问题:

    正确配置:

    # IAL engine
    ial_engine=console
    mdev=/dev/mice
    mtype=IMPS2

    我配置成:

    # IAL engine
    ial_engine=console
    mdev=/dev/mouse0
    mtype=IMPS2

    这样的配置不是不可以使用,唯一区别就是它不支持热插拔,程序运行时鼠标被拔掉再插上时,鼠标时不可用。

    至于为什么?这里从网上转来一篇帖子供参考:

    ****************************************************************************************************************************

    Linux设备文件简介

    原文 :   http://lamp.linux.gov.cn/Linux/device_files.html

    作者:金步国

    版权声明

    本文作者是一位自由软件爱好者,所以本文虽然不是软件,但是本着 GPL 的精神发布。任何人都可以自由使用、转载、复制和再分发,但必须保留作者署名,亦不得对声明中的任何条款作任何形式的修改,也不得附加任何其它条件。您可以自由链接、下载、传播此文档,但前提是必须保证全文完整转载,包括完整的版权信息和作译者声明。

    其他作品

    本文作者十分愿意与他人共享劳动成果,如果你对我的其他翻译作品或者技术文章有兴趣,可以在如下位置查看现有作品的列表:

    BUG报告,切磋与探讨

    由于作者水平有限,因此不能保证作品内容准确无误,请在阅读中自行鉴别。如果你发现了作品中的错误,请您来信指出,哪怕是错别字也好,任何提高作品质量的建议我都将虚心接纳。如果你愿意就作品中的相关内容与我进行进一步切磋与探讨,也欢迎你与我联系。联系方式:MSN: csfrank122@hotmail.com

    概述

    设备管理是linux中比较基础的东西,但是由于Linux智能程度的越来越高,Udev的使用越来越广泛,使得越来越多的Linux新用户对 /dev 目录下的东西变得不再熟悉。有时候遇见问题就会变得抓狂。

    Linux 中的设备有2种类型:字符设备(无缓冲且只能顺序存取)、块设备(有缓冲且可以随机存取)。每个字符设备和块设备都必须有主、次设备号,主设备号相同的设备是同类设备(使用同一个驱动程序)。这些设备中,有些设备是对实际存在的物理硬件的抽象,而有些设备则是内核自身提供的功能(不依赖于特定的物理硬件,又称为"虚拟设备")。每个设备在 /dev 目录下都有一个对应的文件(节点)。可以通过 cat /proc/devices 命令查看当前已经加载的设备驱动程序的主设备号。内核能够识别的所有设备都记录在原码树下的 Documentation/devices.txt 文件中。在 /dev 目录下除了字符设备和块设备节点之外还通常还会存在:FIFO管道、Socket、软/硬连接、目录。这些东西没有主/次设备号。

    设备文件

    Linux内核所能识别的所有设备都记录在
    http://www.lanana.org/docs/device-list/
    而内核原码树中的 Documentation/devices.txt 可能不是最新版本。

    了解这些设备的最基本要求就是对每个设备文件的含义了如指掌,下面列出常见的设备文件以及相应的含义(比较偏僻的就省略了)。

    ----------------------------------------------------------------------
    主设备号        设备类型
                    次设备号=文件名          简要说明
    ----------------------------------------------------------------------
    
      0		未命名设备(例如:挂载的非设备)
    		  0 = 为空设备号保留
    
    
      1 char	内存设备
    		  1 = /dev/mem		直接存取物理内存
    		  2 = /dev/kmem		存取经过内核虚拟之后的内存
    		  3 = /dev/null		空设备。任何写入都将被直接丢弃,任何读取都将得到EOF。
    		  4 = /dev/port		存取 I/O 端口
    		  5 = /dev/zero		零字节源,只能读取到无限多的零字节。
    		  7 = /dev/full		满设备。任何写入都将失败,并把errno设为ENOSPC以表示没有剩余空间。
    		  8 = /dev/random	随机数发生器。完全由用户的输入来产生随机数。
    					如果用户停止所有动作,则停止产生新的随机数。
    		  9 = /dev/urandom	更快,但是不够安全的随机数发生器。尽可能由用户的输入来产生随机数,
    					如果用户停止所有动作,则把已经产生的随机数做为种子来产生新的随机数。
    		 10 = /dev/aio		异步 I/O 通知接口
    		 11 = /dev/kmsg		任何对该文件的写入都将作为 printk 的输出
    
    
      1 block	RAM disk
    		  0 = /dev/ram0		第1个 RAM disk (initrd只能使用ram0)
    		  1 = /dev/ram1		第2个 RAM disk
    		    ...
    		200 = /dev/ram200	第200个 RAM disk
    
    
      4 char	TTY(终端)设备
    		  0 = /dev/tty0		当前虚拟控制台
    		  1 = /dev/tty1		第1个虚拟控制台
    		    ...
    		 63 = /dev/tty63	第63个虚拟控制台
    
    
      4 block	如果根文件系统以是以只读方式挂载的,那么就不可能创建真正的设备节点,
    		此时就使用该设备作为动态分配的主(major)设备的别名
                      0 = /dev/root
    
    
      5 char	其他 TTY 设备
    		  0 = /dev/tty		当前 TTY 设备
    		  1 = /dev/console	系统控制台(一般是/dev/tty0)
    		  2 = /dev/ptmx		所有 PTY master 的复用器
    
    
      7 char	虚拟控制台捕捉设备(这些设备既允许读也允许写)
    		  0 = /dev/vcs		当前虚拟控制台(vc)的文本内容
    		  1 = /dev/vcs1		tty1 的文本内容
    		    ...
    		 63 = /dev/vcs63	tty63 的文本内容
    		128 = /dev/vcsa		当前虚拟控制台(vc)的文本/属性内容
    		129 = /dev/vcsa1	tty1 的文本/属性内容
    		    ...
    		191 = /dev/vcsa63	tty63 的文本/属性内容
    
    
      7 block	回环设备(用一个普通的磁盘文件来模拟一个块设备)
    		对回环设备的绑定由 mount(8) 或 losetup(8) 处理
    		  0 = /dev/loop0	第1个回环设备
    		  1 = /dev/loop1	第2个回环设备
    		    ...
    
    
      8 block	SCSI 磁盘(0-15)
    		  0 = /dev/sda		第1个 SCSI 磁盘(整个磁盘)
    		 16 = /dev/sdb		第2个 SCSI 磁盘(整个磁盘)
    		 32 = /dev/sdc		第3个 SCSI 磁盘(整个磁盘)
    		    ...
    		240 = /dev/sdp		第16个 SCSI 磁盘(整个磁盘)
    
    		分区表示方法如下(以第3个 SCSI 磁盘为例)
    		 33 = /dev/sdc1		第1个分区
    		 34 = /dev/sdc2		第2个分区
    		    ...
    		 47 = /dev/sdc15	第15个分区
    		对于Linux/i386来说,分区1-4是主分区,5-15是逻辑分区。
    
    
      9 block	Metadisk(RAID)设备
    		  0 = /dev/md0		第1组 metadisk
    		  1 = /dev/md1		第2组 metadisk
    		    ...
    		metadisk 驱动用于将同一个文件系统分割到多个物理磁盘上。
    
    
     10 char	非串口鼠标,各种杂项设备和特性
    		  1 = /dev/psaux	PS/2鼠标
    		131 = /dev/temperature	机器内部温度
    		134 = /dev/apm_bios	APM(高级电源管理) BIOS
    		135 = /dev/rtc		实时时钟(Real Time Clock)
    		144 = /dev/nvram	非易失配置 RAM
    		162 = /dev/smbus	系统管理总线(System Management Bus)
    		164 = /dev/ipmo		Intel的智能平台管理(Intelligent Platform Management)接口
    		173 = /dev/ipmikcs	智能平台管理(Intelligent Platform Management)接口
    		175 = /dev/agpgart	AGP图形地址重映射表(Graphics Address Remapping Table)
    		182 = /dev/perfctr	性能监视计数器
    		183 = /dev/hwrng	通用硬件随机数发生器
    		184 = /dev/cpu/microcode CPU微代码更新接口
    		186 = /dev/atomicps	进程状态数据的原子快照
    		188 = /dev/smbusbios	SMBus(系统管理总线) BIOS
    		200 = /dev/net/tun	TAP/TUN 网络设备(TAP/TUN以软件的方式实现了网络设备)
    					TAP模拟了以太网帧(第二层),TUN模拟了IP包(第三层)。
    		202 = /dev/emd/ctl	增强型 Metadisk RAID (EMD) 控制器
    		220 = /dev/mptctl	Message passing technology (MPT) control
    		223 = /dev/input/uinput	用户层输入设备驱动支持
    		227 = /dev/mcelog	X86_64 Machine Check Exception driver
    		228 = /dev/hpet		HPET driver
    		229 = /dev/fuse		Fuse(用户空间的虚拟文件系统)
    		231 = /dev/snapshot	系统内存快照
    		232 = /dev/kvm		基于内核的虚构机(基于AMD SVM和Intel VT硬件虚拟技术)
    
    
     11 block	SCSI CD-ROM 设备
    		  0 = /dev/scd0		第1个 SCSI CD-ROM
    		  1 = /dev/scd1		第2个 SCSI CD-ROM
    		    ...
    
    
     13 char	核心输入设备
    		 32 = /dev/input/mouse0		第1个鼠标
    		 33 = /dev/input/mouse1		第2个鼠标
    		    ...
    		 62 = /dev/input/mouse30	第31个鼠标
    		 63 = /dev/input/mice		所有鼠标的统一
    		 64 = /dev/input/event0		第1个事件队列
    		 65 = /dev/input/event1		第2个事件队列
    		    ...
    		 95 = /dev/input/event1		第32个事件队列
    
    
     21 char	通用 SCSI 设备(通常是SCSI光驱)
    		  0 = /dev/sg0		第1个通用 SCSI 设备
    		  1 = /dev/sg1		第2个通用 SCSI 设备
    		    ...
    
    
     29 char	通用帧缓冲(frame buffer)设备
    		  0 = /dev/fb0		第1个帧缓冲设备
    		  1 = /dev/fb1		第2个帧缓冲设备
    		    ...
    		 31 = /dev/fb31		第32个帧缓冲设备
    
    
     30 char	iBCS-2 兼容设备
    		  0 = /dev/socksys	套接字访问接口
    		  1 = /dev/spx		SVR3 本地 X 接口
    		 32 = /dev/inet/ip	网络访问接口
    		 33 = /dev/inet/icmp
    		 34 = /dev/inet/ggp
    		 35 = /dev/inet/ipip
    		 36 = /dev/inet/tcp
    		 37 = /dev/inet/egp
    		 38 = /dev/inet/pup
    		 39 = /dev/inet/udp
    		 40 = /dev/inet/idp
    		 41 = /dev/inet/rawip
    
    		此外,iBCS-2 还需要下面的连接必须存在
    		/dev/ip -> /dev/inet/ip
    		/dev/icmp -> /dev/inet/icmp
    		/dev/ggp -> /dev/inet/ggp
    		/dev/ipip -> /dev/inet/ipip
    		/dev/tcp -> /dev/inet/tcp
    		/dev/egp -> /dev/inet/egp
    		/dev/pup -> /dev/inet/pup
    		/dev/udp -> /dev/inet/udp
    		/dev/idp -> /dev/inet/idp
    		/dev/rawip -> /dev/inet/rawip
    		/dev/inet/arp -> /dev/inet/udp
    		/dev/inet/rip -> /dev/inet/udp
    		/dev/nfsd -> /dev/socksys
    		/dev/X0R -> /dev/null
    
    
     36 char	Netlink 支持
    		  0 = /dev/route	路由, 设备更新, kernel to user
    		  3 = /dev/fwmonitor	Firewall packet 复制
    
    
     59 char	sf 防火墙模块
    		  0 = /dev/firewall	与 sf 内核模块通信
    
    
     65 block	SCSI 磁盘(16-31)
    		  0 = /dev/sdq		第17个 SCSI 磁盘(整个磁盘)
    		 16 = /dev/sdr		第18个 SCSI 磁盘(整个磁盘)
    		 32 = /dev/sds		第19个 SCSI 磁盘(整个磁盘)
    		    ...
    		240 = /dev/sdaf		第32个 SCSI 磁盘(整个磁盘)
    
    
     66 block	SCSI 磁盘(32-47)
    		  0 = /dev/sdag		第33个 SCSI 磁盘(整个磁盘)
    		 16 = /dev/sdah		第34个 SCSI 磁盘(整个磁盘)
    		 32 = /dev/sdai		第35个 SCSI 磁盘(整个磁盘)
    		    ...
    		240 = /dev/sdav		第48个 SCSI 磁盘(整个磁盘)
    
    
     89 char	I2C 总线接口
    		  0 = /dev/i2c-0	第1个 I2C 适配器
    		  1 = /dev/i2c-1	第2个 I2C 适配器
    		    ...
    
    
    
     98 block	用户模式下的虚拟块设备(分区处理方式与 SCSI 磁盘相同)
    		  0 = /dev/ubda		第1个用户模式块设备
    		 16 = /dev/udbb		第2个用户模式块设备
    		    ...
    
    
    103 block	审计(Audit)设备
    		  0 = /dev/audit	审计(Audit)设备
    
    
    128-135 char	Unix98 PTY master
    
    		这些设备不应当存在设备节点,而应当通过 /dev/ptmx 接口访问。
    
    
    136-143 char	Unix98 PTY slave
    		这些设备节点是自动生成的(伴有适当的权限和模式),不能手动创建。
    		方法是通过使用适当的 mount 选项(通常是:mode=0620,gid=<"tty"组的gid>)
    		将 devpts 文件系统挂载到 /dev/pts 目录即可。
    		  0 = /dev/pts/0	第1个 Unix98 PTY slave
    		  1 = /dev/pts/1	第2个 Unix98 PTY slave
    		    ...
    
    
    153 block	Enhanced Metadisk RAID (EMD) 存储单元(分区处理方式与 SCSI 磁盘相同)
    		  0 = /dev/emd/0	第1个存储单元
    		  1 = /dev/emd/0p1	第1个存储单元的第1个分区
    		  2 = /dev/emd/0p2	第1个存储单元的第2个分区
    		    ...
    		 15 = /dev/emd/0p15	第1个存储单元的第15个分区
    
    		 16 = /dev/emd/1	第2个存储单元
    		 32 = /dev/emd/2	第3个存储单元
    		    ...
    		240 = /dev/emd/15	第16个存储单元
    
    
    180 char	USB 字符设备
    		 96 = /dev/usb/hiddev0	第1个USB人机界面设备(鼠标/键盘/游戏杆/手写版等人操作计算机的设备)
    		    ...
    		111 = /dev/usb/hiddev15	第16个USB人机界面设备
    
    
    180 block	USB 块设备(U盘之类)
    		  0 = /dev/uba		第1个USB 块设备
    		  8 = /dev/ubb		第2个USB 块设备
    		 16 = /dev/ubc		第3个USB 块设备
     		    ...
    
    
    192 char	内核 profiling 接口
    		  0 = /dev/profile	Profiling 控制设备
    		  1 = /dev/profile0	CPU 0 的 Profiling 设备
    		  2 = /dev/profile1	CPU 1 的 Profiling 设备
    		    ...
    
    
    193 char	内核事件跟踪接口
    		  0 = /dev/trace	跟踪控制设备
    		  1 = /dev/trace0	CPU 0 的跟踪设备
    		  2 = /dev/trace1	CPU 1 的跟踪设备
    		    ...
    
    
    195 char	Nvidia 图形设备(比如显卡)
    		  0 = /dev/nvidia0		第1个 Nvidia 卡
    		  1 = /dev/nvidia1		第2个 Nvidia 卡
    		    ...
    		255 = /dev/nvidiactl		Nvidia 卡控制设备
    
    
    202 char	特定于CPU模式的寄存器(model-specific register,MSR)
    		  0 = /dev/cpu/0/msr		CPU 0 的 MSRs
    		  1 = /dev/cpu/1/msr		CPU 1 的 MSRs
    		    ...
    
    203 char	CPU CPUID 信息
    		  0 = /dev/cpu/0/cpuid		CPU 0 的 CPUID
    		  1 = /dev/cpu/1/cpuid		CPU 1 的 CPUID
    		    ...

    有没有感到很奇怪?为什么没有 /dev/hda 这样的设备,难道不常用么?原因在于从 2.6.19 版本开始,内核引入了新的ATA驱动,将SATA/PATA硬盘统一使用 /dev/sd? 来表示了,所以 /dev/hd? 就没有存在的必要了。具体说来也就是你在编译内核的时候不要再使用"ATA/ATAPI/MFM/RLL support"下面的驱动,而是使用更新的"Serial ATA and Parallel ATA drivers"驱动。

    链接、套接字、管道、挂载点

    这部分详细说明一些应该或可能存在于 /dev 目录之外的文件。链接最好使用与这里完全相同的格式(绝对路径或相对路径)。究竟是使用硬链接(hard)还是软连接(symbolic)取决于不同的设备。

    必须的链接

    必须在所有的系统上都存在这些连接:

    链接		目标		链接类型	简要说明
    /dev/fd		/proc/self/fd	symbolic	文件描述府
    /dev/stdin	fd/0		symbolic	标准输入文件描述府
    /dev/stdout	fd/1		symbolic	标准输出文件描述符
    /dev/stderr	fd/2		symbolic	标准错误文件描述符
    /dev/nfsd	socksys		symbolic	仅为 iBCS-2 所必须
    /dev/X0R	null		symbolic	仅为 iBCS-2 所必须
    [注意] /dev/X0R 是 <字母 X>-<数字 0>-<字母 R>

    推荐的链接

    推荐在所有的系统上都存在这些连接:

    链接		目标		链接类型	简要说明
    /dev/core	/proc/kcore	symbolic	为了向后兼容
    /dev/ramdisk	ram0		symbolic	为了向后兼容
    /dev/ftape	qft0		symbolic	为了向后兼容
    /dev/bttv0	video0		symbolic	为了向后兼容
    /dev/radio	radio0		symbolic	为了向后兼容
    /dev/i2o*	/dev/i2o/*	symbolic	为了向后兼容
    /dev/scd?	sr?		hard		代替 SCSI CD-ROM 的名字

    本地定义的链接

    下面的链接很可能需要根据机器的实际硬件配置创建其中的一部分甚至全部。这些链接仅仅是为了迎合习惯用法,它们既非必须也非推荐。

    链接		目标		链接类型	简要说明
    /dev/mouse	mouse port	symbolic	当前鼠标
    /dev/tape	tape device	symbolic	当前磁带
    /dev/cdrom	CD-ROM device	symbolic	当前CD-ROM
    /dev/cdwriter	CD-writer	symbolic	当前CD-writer
    /dev/scanner	scanner		symbolic	当前扫描仪
    /dev/modem	modem port	symbolic	当前调制解调器
    /dev/root	root device	symbolic	当前根文件系统所在设备
    /dev/swap	swap device	symbolic	当前swap所在设备

    /dev/modem 不应当用于能够同时支持呼入和呼出的modem,因为往往会导致锁文件问题。如果存在 /dev/modem ,那么它应当指向一个恰当的主 TTY 设备。

    对于SCSI设备,/dev/tape 和 /dev/cdrom 应该分别指向"cooked"设备 /dev/st* 和 /dev/sr* ;而 /dev/cdwriter 和 /dev/scanner 应当分别指向恰当的 /dev/sg* 。

    /dev/mouse 可以指向一个主串行 TTY 设备、一个硬件鼠标、或者一个对应鼠标驱动程序的套接字(例如 /dev/gpmdata)。

    套接字和管道

    持久套接字和命名管道可以存在于 /dev 中。常见的有:

    /dev/printer	socket		lpd 本地套接字
    /dev/log	socket		syslog 本地套接字
    /dev/gpmdata	socket		gpm 鼠标多路复用器(multiplexer)
    /dev/gpmctl	socket		(LFS-LiveCD中出现)
    /dev/initctl	fifo pipe	init 监听它并从中获取信息(用户与 init 进程交互的通道)

    挂载点

    以下名称被保留用于挂载特殊的文件系统。这些特殊的文件系统只提供内核界面而不提供标准的设备节点。

    /dev/pts	devpts		PTY slave 文件系统
    /dev/shm	tmpfs		提供对 POSIX 共享内存的直接访问

    终端设备

    终端(或TTY)设备是一种特殊的字符设备。终端设备是可以在会话中扮演控制终端角色的任何设备,包括:虚拟控制台、串行接口(已废弃)、伪终端(PTY)。

    所有的终端设备共享一个通用的功能集合:line discipline,它既包含通用的终端 line discipline 也包含SLIP和PPP模式。所有的终端设备的命名都很相似。这部分内容将解释命名规则和各种类型的TTY(终端)的使用。需要注意的是这些命名习惯包含了几个历史遗留包袱。其中的一些是Linux所特有的,另一些则是继承自其他系统,还有一些反映了Linux在成长过程中抛弃了原来借用自其它系统的一些习惯。井号(#)在设备名里表示一个无前导零的十进制数。

    虚拟控制台(Virtual console)和控制台设备(console device)

    虚拟控制台是在系统视频监视器上全屏显示的终端。虚拟控制台被命名为编号从 /dev/tty1 开始的 /dev/tty# 。/dev/tty0 是当前虚拟控制台。/dev/tty0 用于在不能使用帧缓冲设备(/dev/fb*)的机器上存取系统视频卡,注意,不要将 /dev/console 用于此目的。/dev/console 由内核管理,系统消息将被发送到这里。单用户模式下必须允许 login 使用 /dev/console 。

    串行接口

    这里所说的"串行接口"是指 RS-232 串行接口和任何模拟这种接口的设备,不管是在硬件(例如调制解调器)还是在软件(例如ISDN驱动)中模拟。在linux中的每一个串行接口都有两个设备名:主设备或呼入(callin)设备、交替设备或呼出(callout)设备。设备类型之间使用字母的大小写进行区分。比如,对于任意字母X,"tty"设备名为 /dev/ttyX# ,而"cu"设备名则为 /dev/cux# 。由于历史原因,/dev/ttyS# 和 /dev/ttyC# 分别等价于 /dev/cua# 和 /dev/cub# 。名称 /dev/ttyQ# 和 /dev/cuq# 被保留为本地使用。

    伪终端(PTY)

    伪终端用于创建登陆会话或提供其它功能,比如通过 TTY line discipline (包括SLIP或者PPP功能)来处理任意的数据生成。每一个 PTY 都有一个master端和一个slave端。按照 System V/Unix98 的 PTY 命名方案,所有master端共享同一个 /dev/ptmx 设备节点(打开它内核将自动给出一个未分配的PTY),所有slave端都位于 /dev/pts 目录下,名为 /dev/pts/# (内核会根据需要自动生成和删除它们)。

    一旦master端被打开,相应的slave设备就可以按照与 TTY 设备完全相同的方式使用。master设备与slave设备之间通过内核进行连接,等价于拥有 TTY 功能的双向管道(pipe)。


    展开全文
  • 硬件热插拔) private: QextSerialPort *com; //串口通信对象 QTimer *timerRead; //定时读取串口数据 void readData(); void getSerialCommNames(QStringList &list); private slots: void on_...
  • 相关题目与解析个人计算机上的USB接口通常并用于连接()。在计算机上U盘的接口通常是()标准接口。A.UPSB.USPC.UBSD.USB微型计算机的USB接口只能用连接U盘。()计算机的数据传输接口包括()和USB接口等。A.有线电视...

    相关题目与解析

    个人计算机上的USB接口通常并不用于连接()。

    在计算机上插U盘的接口通常是()标准接口。A.UPSB.USPC.UBSD.USB

    微型计算机的USB接口只能用连接U盘。()

    计算机的数据传输接口包括()和USB接口等。A.有线电视接口B.无线广播接口C.电源接口D.串口

    微型计算机的主板上一般都没有集成USB接口。()

    数码相机摄取的图像一般保存在CF或()卡上,可以与计算机的USB通信接口连接。A.RAMB.SMC.VCDD.C

    计算机及相关设备上若出现如题34图所示的标识,则说明其接口类型是A.USB1.0B.USB1.1C.USB2.0D.US

    USB接口是一种计算机通用并行接口。()

    除显示器接口和键盘、鼠标器接口之外,以下()不属于计算机系统上常用的接口。A、USB接口B、RS232

    通过USB接口插入染毒的U盘设备,即使不打开U盘浏览文件也会导致计算机中毒。

    USB是通用串行总线,采用此接口技术的外部设备不支持热插拔。

    下列计算机接口中,可以直接进行“插拔”操作的是()。A.COMB.LPTC.PCID.USB

    U盘可以通过计算机上的()接口与计算机进行通信。

    移动硬盘工作时硬盘和数据接口的()是由计算机的USB接口提供的。

    计算机参数“4×USB2.0”的含义是4个USB2.0接口。()

    通过局域网连接到Internet时,计算机上必须有()。A.MODEMB.网络适配器C.电话D.USB接口

    在计算机系统中,USB的含义是()。

    在计算机的其他接口中,TypeA一般用于计算机端,而TypeB-般用于USB设备端()

    HI-PRO与计算机连接的数据线两端都是()。A.九针的接口B.3.0USB接口C.USB接口D.RJ45接口E.2.0USB接

    展开全文
  • VC++ 动态检测串口热插拔

    千次阅读 2015-11-17 14:56:48
    串口编程中经常需要知道串口号,用来配置串口,可是没有好的办法,只能进到设备管理器中去看,那么如何能够实现软件的自动检测串口号,并且可支持热插拔检测那? 下面将讲述两种方法来实现这种效果:一种是遍历...

    VC++ 动态检测串口的热插拔

    VC++ 动态检测串口的热插拔(一)通过遍历实现

    在串口编程中经常需要知道串口号,用来配置串口,可是没有好的办法,只能进到设备管理器中去看,那么如何能够实现软件的自动检测串口号,并且可支持热插拔检测那?

    下面将讲述两种方法来实现这种效果:一种是遍历设备列表中的所有串口0-255,二是通过读去注册表来实现检测

    在这篇文章中将只讲述循环遍历方法的实现,在下一篇文章中将讲述利用注册表方法的实现

    ---------------------------------------------------

    第一种方法是一种比较简单也比较笨的方法,对于每一个串口一个一个的去试,试完了也就知道了,计算机一般支持0-255即256个串口,可是利用CreateFile创建串口,只能成功创建COM0-COM9串口设备,而COM10及以上的串口创建CreateFile就会返回-1,因为10及以上已经超出的设备的命名规范,需要使用\$device\COM10方式,作为参数传递给CreateFile。

    You   can   use   paths   longer   than   MAX_PATH   characters   by   calling   the   wide   (W)   version   of  CreateFile   and   prepending   "\\?\"   to   the   path.   The   "\\?\"   tells   the   function   to   turn   off   path  parsing.   This   lets   you   use   paths   that   are   nearly   32,000   Unicode   characters   long.   However,  each   component   in   the   path   cannot   be   more   than   MAX_PATH   characters   long.   You   must  use   fully-qualified   paths   with   this   technique.   This   also   works   with   UNC   names.   The   "\\?\"   is  ignored   as   part   of   the   path.   For   example,   "\\?\C:\myworld\private"   is   seen   as  "C:\myworld\private",   and   "\\?\UNC\tom_1\hotstuff\coolapps"   is   seen   as   "\\tom_1\hotstuff\coolapps".

    1.遍历所有串口源码:

    OnInitDialog初始化窗口

     

    1. BOOL CDetectComDlg::OnInitDialog()  
    2.  
    3.     CDialog::OnInitDialog();  
    4.   
    5.     ASSERT((IDM_ABOUTBOX 0xFFF0) == IDM_ABOUTBOX);  
    6.     ASSERT(IDM_ABOUTBOX 0xF000);  
    7.   
    8.     CMenu* pSysMenu GetSystemMenu(FALSE);  
    9.     if (pSysMenu != NULL)  
    10.      
    11.         CString strAboutMenu;  
    12.         strAboutMenu.LoadString(IDS_ABOUTBOX);  
    13.         if (!strAboutMenu.IsEmpty())  
    14.          
    15.             pSysMenu->AppendMenu(MF_SEPARATOR);  
    16.             pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);  
    17.          
    18.      
    19.     SetIcon(m_hIcon, TRUE);         // 设置大图标  
    20.     SetIcon(m_hIcon, FALSE);        // 设置小图标  
    21.   
    22.     DWORD sStyle m_ListShow.GetExtendedStyle();  
    23.     sStyle |= LVS_EX_GRIDLINES;  
    24.     sStyle |= LVS_EX_FULLROWSELECT;  
    25.     m_ListShow.SetExtendedStyle(sStyle);  
    26.     m_ListShow.InsertColumn(0,_T("索引"),LVCFMT_LEFT,100);  
    27.     m_ListShow.InsertColumn(1,_T("串口号"),LVCFMT_LEFT,100);  
    28.   
    29.     TraversalCom(); //遍历Com口  
    30.     return TRUE;   
    31.  
    TraversalCom函数

     

     

    1. void CDetectComDlg::TraversalCom(void 
    2.  
    3.     EnumerateSerialPorts(ports,portse,portsu);  
    4.     unsigned short Counter;  
    5.     unsigned short Setcom;  
    6.     CString str;  
    7.   
    8.     //获取可用串口个数  
    9.     Counter portse.GetSize();   
    10.     //如果个数大于0  
    11.     if(Counter 0)  
    12.      
    13.         //初始化串口列表框  
    14.         for(int i=0; i
    15.          
    16.             Setcom portse.ElementAt(i);  
    17.             str.Format("%d",i);  
    18.             m_ListShow.InsertItem(i,str);  
    19.             str.Format(_T("COM%d "),Setcom);  
    20.             m_ListShow.SetItemText(i,1,str);  
    21.          
    22.      
    23.  
    EnumerateSerialPorts函数

     

     

    1. void CDetectComDlg::EnumerateSerialPorts(CUIntArray& ports, CUIntArray& portse, CUIntArray& portsu)  
    2.  
    3.     //清除串口数组内容  
    4.     ports.RemoveAll();  
    5.     portse.RemoveAll();  
    6.     portsu.RemoveAll();  
    7.     //因为至多有255个串口,所以依次检查各串口是否存在  
    8.     //如果能打开某一串口,或打开串口不成功,但返回的是 ERROR_ACCESS_DENIED错误信息,  
    9.     //都认为串口存在,只不过后者表明串口已经被占用,否则串口不存在  
    10.     for (int i=1; i<256; i++)  
    11.      
    12.         //Form the Raw device name  
    13.         CString sPort;  
    14.         sPort.Format(_T("\\\\.\\COM%d"), i);  
    15.   
    16.         //Try to open the port  
    17.         BOOL bSuccess FALSE;  
    18.         HANDLE hPort ::CreateFile(sPort, GENERIC_READ GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);  
    19.         if (hPort == INVALID_HANDLE_VALUE)  
    20.          
    21.             DWORD dwError GetLastError();  
    22.   
    23.             if (dwError == ERROR_ACCESS_DENIED)  
    24.              
    25.                 bSuccess TRUE;  
    26.                 portsu.Add(i);       //已占用的串口  
    27.              
    28.          
    29.         else  
    30.          
    31.             //The port was opened successfully  
    32.             bSuccess TRUE;  
    33.             portse.Add(i);      可用的串口  
    34.             //Don't forget to close the port, since we are going to do nothing with it anyway  
    35.             CloseHandle(hPort);  
    36.          
    37.   
    38.         //Add the port number to the array which will be returned  
    39.         if (bSuccess)  
    40.             ports.Add(i);   //所有存在的串口  
    41.      
    42.  

    这时再刚登陆窗口时便可罗列出可用串口。

     

    2.检测串口的热插拔

    这里主要利用Cwnd的ON_WM_DEVICECHANGE消息来处理。
    ON_WM_DEVICECHANGE消息在VS是通过手动添加的

    注意:此消息只有顶层窗口可以捕获到
    因此,首先得手动添加ON_WM_DEVICECHANGE消息:
    第一步:在消息映射BEGIN_MESSAGE_MAP(Ctbox_debug_viewDlg, CDialogEx)中添加:

     

    1. afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD dwData);  

    第二步:在cpp文件中添加函数声明

     

     

    1. afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD dwData);  

    第三步:实现
    1. BOOL CDetectComDlg::OnDeviceChange(UINT nEventType,DWORD dwData)  
    2.  
    3.     //DEV_BROADCAST_DEVICEINTERFACE* dbd (DEV_BROADCAST_DEVICEINTERFACE*) dwData;  
    4.     switch (nEventType)  
    5.      
    6.     case DBT_DEVICEREMOVECOMPLETE://移除设备  
    7.     case DBT_DEVICEARRIVAL://添加设备  
    8.         ReDetectCom();//刷新列表框的内容  
    9.         break 
    10.   
    11.     default 
    12.         break 
    13.      
    14.     return TRUE;  
    15.  
    ReDetectCom的内容

     

     

    1. void CDetectComDlg::ReDetectCom(void 
    2.  
    3.     m_ListShow.DeleteAllItems();  
    4.     TraversalCom();  
    5.  

    第四步包含头文件

     

    由于DEV_BROADCAST_DEVICEINTERFACE,DBT_DEVICEREMOVECOMPLETE,DBT_DEVICEARRIVAL这几个东东在头文件Dbt.h中定义的,所以包含Dbt.h头文件

     

    1. #include   

    至此遍历方法实现检测串口的方法已经实现,在下一篇中将介绍如何读取注册表实现串口的自动检测

     

    源码:遍历方法的实现:遍历方法的实现



    VC++ 动态检测串口的热插拔(二)通过注册表实现


    在上一篇文章中讲述了如何通过循环遍历的方法获取可用串口,可是这样的方法过于暴力,难免会想有没有其他的办法那,嘿嘿,那是肯定会有的,不管什么问题,解决问题的方法永远都不止一种。下面讲述如何通过注册表来获取可用串口。

    大家都知道,通过设备管理器我们可以看到可用串口号的列表,windows肯定有自己管理各种设备的方法,那就是大家所熟悉的注册表,注册表中记录各种设备信息以及其他重要信息。在HKEY_LOCAL_MACHINE下逐级展开到Hardware\\DeviceMap\\SerialComm,这里记录的就是串口信息。只要通过简单的注册表读取操作我们就可以得到串口列表。

    这里将展示给大家,通过注册表读取,并将结果展示到列表框中的例子。

    1遍历串口源码如下:

    OnInitDialog中如下:

     

    1. BOOL CDetectComDlg::OnInitDialog()  
    2.  
    3.     CDialog::OnInitDialog();  
    4.   
    5.     ASSERT((IDM_ABOUTBOX 0xFFF0) == IDM_ABOUTBOX);  
    6.     ASSERT(IDM_ABOUTBOX 0xF000);  
    7.   
    8.     CMenu* pSysMenu GetSystemMenu(FALSE);  
    9.     if (pSysMenu != NULL)  
    10.      
    11.         CString strAboutMenu;  
    12.         strAboutMenu.LoadString(IDS_ABOUTBOX);  
    13.         if (!strAboutMenu.IsEmpty())  
    14.          
    15.             pSysMenu->AppendMenu(MF_SEPARATOR);  
    16.             pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);  
    17.          
    18.      
    19.     SetIcon(m_hIcon, TRUE);         // 设置大图标  
    20.     SetIcon(m_hIcon, FALSE);        // 设置小图标  
    21.   
    22.     DWORD sStyle m_ListShow.GetExtendedStyle();  
    23.     sStyle |= LVS_EX_GRIDLINES;  
    24.     sStyle |= LVS_EX_FULLROWSELECT;  
    25.     m_ListShow.SetExtendedStyle(sStyle);  
    26.     m_ListShow.InsertColumn(0,_T("索引"),LVCFMT_LEFT,100);  
    27.     m_ListShow.InsertColumn(1,_T("串口号"),LVCFMT_LEFT,100);  
    28.     TraversalCom();  
    29.     return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE  
    30.  

    TraversalCom()函数如下:

     

     

    [html] view plaincopy
    1. void CDetectComDlg::TraversalCom()  
    2.  
    3.     HKEY   hKey;  
    4.   
    5.     if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Hardware\\DeviceMap\\SerialComm"), NULL, KEY_READ, &hKey)==ERROR_SUCCESS)  
    6.      
    7.         TCHAR       szPortName[256], szComName[256];  
    8.         DWORD       dwLong, dwSize;  
    9.         int         nCount  0 
    10.         while(true)  
    11.          
    12.             dwLong  dwSize    256;  
    13.             if(RegEnumValue(hKey, nCount, szPortName, &dwLong, NULL, NULL, (PUCHAR)szComName, &dwSize)==ERROR_NO_MORE_ITEMS)  
    14.                 break;  
    15.             CString str;  
    16.             str.Format("%d",nCount);  
    17.             m_ListShow.InsertItem(nCount,str);  
    18.             str.Format(_T("%s "),szComName);  
    19.             m_ListShow.SetItemText(nCount,1,str);  
    20.             nCount++;  
    21.          
    22.         RegCloseKey(hKey);  
    23.           
    24.      
    25.  

    这时再刚登陆窗口时便可罗列出可用串口。

     

     

    2.检测串口的热插拔

    这里主要利用Cwnd的ON_WM_DEVICECHANGE消息来处理。
    ON_WM_DEVICECHANGE消息在VS是通过手动添加的

    注意:此消息只有顶层窗口可以捕获到
    因此,首先得手动添加ON_WM_DEVICECHANGE消息:
    第一步:在消息映射BEGIN_MESSAGE_MAP(Ctbox_debug_viewDlg, CDialogEx)中添加:

    1. afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD dwData);  

    第二步:在cpp文件中添加函数声明
    1. afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD dwData);  
    第三步:实现

     

    [html] view plaincopy
    1. BOOL CDetectComDlg::OnDeviceChange(UINT nEventType,DWORD dwData)  
    2.  
    3.     //DEV_BROADCAST_DEVICEINTERFACE* dbd (DEV_BROADCAST_DEVICEINTERFACE*) dwData;  
    4.     switch (nEventType)  
    5.      
    6.     case DBT_DEVICEREMOVECOMPLETE://移除设备  
    7.     case DBT_DEVICEARRIVAL://添加设备  
    8.         ReDetectCom();//刷新列表框的内容  
    9.         break;  
    10.   
    11.     default:  
    12.         break;  
    13.      
    14.     return TRUE;  
    15.  

    RefreshCom的内容

     

     

    1. void CDetectComDlg::RefreshCom(void 
    2.  
    3.     m_ListShow.DeleteAllItems();  
    4.     TraversalCom();  
    5.  
    至此,通过注册表的方法便已实现。

     

    源码:通过注册表实现

    展开全文
  • 硬盘支持热插拔

    2010-12-27 10:19:59
    热插拔是指在带电的情况下插拔计算机的硬件。因为热插拔可以节省时间,减少操作步骤,还可以降低开关机时启动电流过大对计算机硬件的冲击(还有一个主要原因是符合人的惰性),所以被一些电脑玩家频繁使用     ...
  • USB热插拔

    千次阅读 2018-10-12 11:13:21
    学习USB热插拔之前,先学习一些USB的硬件知识: 一、USB基础概念 1、硬件知识(USB插座和插头) &nbsp; &nbsp; &nbsp; &nbsp;在最初的标准里,USB接头有4条线:电源,D-,D+,地线。我们暂且把这样的...
  • 硬件上来说,可热插拔的设备一般都会对电源部分格外重视,...而且在接口电路中没有任何保护措施,这样的话在热插拔之后,可能会对系统造成不良影响甚至损坏系统。 软件方面,以USB为例。操作系统对于USB设备有着非...
  • OpenWrt热插拔HotPlug

    千次阅读 2019-11-12 18:02:22
    热插拔官方文档 当某些 events事件发生时,Procd(init系统和进程管理守护进程)会执行位于/etc/hotplug.d/中的脚本,例如当接口启动或关闭时,检测到新的存储驱动器时,或者按下按钮时. 当使用PPPoE连接或者在...
  • 项目中一直在用串口通讯,但没有实现可用串口的自动检测和热插拔检测。今天通过查找资料实现了这些功能,所以在这里坐下记录。 参考资料:http://blog.csdn.net/flydream0/article/details/8086976 实现环境:...
  • 热插拔

    2009-06-30 09:04:00
     即带电插拔,热插拔功能就是允许用户在关闭系统,切断电源的情况下取出和更换损坏的硬盘、电源或板卡等部件,从而提高了系统对灾难的及时恢复能力、扩展性和灵活性等,例如一些面向高端应用的磁盘镜像系统都...
  • 因为项目需要支持usb 串口的设备,因为linux... 但是热插拔或者同时插入几个usb 串口设备。生成ttyUSB* 就是确定序列号。 所以我们通过android ueventd 守护进程根据固定的设备路径做软连接。apk 就可以打开这个软
  • 串口编程中经常需要知道串口号,用来配置串口,可是没有好的办法,只能进到设备管理器中去看,那么如何能够实现软件的自动检测串口号,并且可支持热插拔检测那? 下面将讲述两种方法来实现这种效果:一种是遍历...
  • openwrt USB外挂U盘的时候很需要热插拔功能 openwrt官网传送门 当某些事件发生时,Procd(init系统和进程管理守护进程)执行位于/etc/hotplug.d/中的脚本,例如当接口启动或关闭时,检测到新的存储驱动器时,或者...
  • 镜像 断言 磁盘阵列 Raduis flash 以太网 热插拔 串口通信1. 镜像2. 断言3. 磁盘阵列磁盘阵列 raid4. Raduis5. flash6. 以太网7. 热插拔8. 串口通信 1. 镜像 一个磁盘上的数据在另一个磁盘上存在一个完全相同的副本...
  • qt usb热插拔

    千次阅读 2015-11-16 15:12:58
    LINUX2.6.13内核下是没有USB插拔机制的,即便是2.6.24内核依旧没有解决好USB插拔通知问题,而QT在版本4之前的版本都没有USB类的,没有USB插拔通知的方法,在QT4之后有了QDBUS,可通过QDBUS,进行USB热插拔 ...
  • Qt MFC支持USB设备热插拔

    千次阅读 2015-09-07 19:11:00
    关于串口热拔插监听,请更多地参考 《Qt中捕获Windows消息》 《USB转串口突然出检测解决方案》 《USB设备监控深入分析》 代码 #include  < dbt . h > bool ...
  • 本文采用netlink套接字,它能及时监听内核消息,完成设备的热插拔检测. 头文件 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<fcntl.h> #...
  • Linux热插拔

    2010-05-19 16:57:00
    Linux热插拔From: http://blog.chinaunix.net/u1/34190/showart_287894.html将可移动设备连入系统时,系统的后台中会依次发生如下事件:l 内核检测到新硬件插入,然
  • 本次分享一中检测设备热插拔的方法,比如,在系统中插入一个usb设备,无线网卡等,都可以检测到,并决定后续的工作;研究检测计算机硬件的拔插,包括某类设备接口、文件系统、OEM或IHV厂商自定义设定的设备、端El...
  • 使用定时器的方式,实时更新串口信息 timer = new QTimer; //定时扫描和更新串口 connect(timer,&QTimer::timeout,this,&MainWindow::showValidPort);//实时更新端口号 timer->start(1000); //每1000...
  • Qt之USB热插拔

    2017-12-29 17:47:03
    基于Qt5.5.1的应用程序,支持监控系统设备变化,当插入可移动设备、右键弹出和移除可移动设备时可以实时的通知应用程序
  • JTAG口不要热插拔

    千次阅读 2016-10-29 13:57:47
    任何一家PLD器件,包括Lattice和其对手器件,甚至包括其它使用Jtag加载的器件(如CPU等),都不支持加电情况下热插拔Jtag编程电缆,这样做很容易对器件造成损坏,原因如下: 1. 在插拔Jtag电缆接口时,不论单排或...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,258
精华内容 2,503
关键字:

串口不支持热插拔