Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用jssc获取SerialPort的设备描述符_Java_Serial Port_Jssc - Fatal编程技术网

Java 使用jssc获取SerialPort的设备描述符

Java 使用jssc获取SerialPort的设备描述符,java,serial-port,jssc,Java,Serial Port,Jssc,如何使用jssc(java简单串行连接器)获取串行端口的设备描述符 getPortName()方法提供端口名(例如COM2),但描述符更有用 如果有必要修补此开源API以获取设备描述符如何操作?设备描述符是描述符树的根,包含基本设备信息。唯一编号idVendor和idProduct用于标识连接的设备。Windows操作系统使用这些数字来确定要加载的设备驱动程序 idVendor是分配给每个生产基于USB设备的公司的编号。USB实施者论坛负责管理供应商ID的分配 idProduct是另一个16位字

如何使用jssc
(java简单串行连接器)
获取串行端口的设备描述符

getPortName()
方法提供端口名(
例如COM2
),但描述符更有用


如果有必要修补此开源API以获取设备描述符如何操作?

设备描述符是描述符树的根,包含基本设备信息。唯一编号idVendor和idProduct用于标识连接的设备。Windows操作系统使用这些数字来确定要加载的设备驱动程序

idVendor
是分配给每个生产基于USB设备的公司的编号。USB实施者论坛负责管理供应商ID的分配

idProduct
是另一个16位字段,其中包含制造商分配的用于识别特定产品的编号


从jantje的问题来看


我需要的是windows 10在连接的应用程序中显示的名称 设备

回答:打开
“设置应用程序”
,然后单击设备。单击设备将打开一个选项卡,您可以在其中调整所有打印机、已连接设备、蓝牙设备、鼠标和触摸板、键入设置和自动播放设置的设置。此连接的设备选项卡显示连接到电脑的硬件。单击添加设备,电脑将自动扫描连接的设备。Bluetooth选项卡非常简单,具有通过Bluetooth将设备连接到PC的简单设置。单击蓝牙按钮,设备将自动开始扫描范围内的任何蓝牙设备

如果有任何类型的问题,显示设备或给予不可用,那么我们需要以下工作

  • 扫描硬件和设备以找出驱动程序问题
  • 修复损坏、损坏或不兼容的蓝牙驱动程序
  • 更新至适用于Windows 10的最新蓝牙驱动程序
  • 下载并安装Windows 10中最匹配的驱动程序
  • 前2名。删除和添加蓝牙设备 前三名。允许蓝牙设备连接到此计算机 无法从支持蓝牙的设备连接到计算机?确保已允许蓝牙设备连接到计算机。请尝试以下步骤: 1.转到控制面板。单击“硬件和声音”和“蓝牙设备”。 2.单击“选项”选项卡。 3.确保选中“允许蓝牙设备连接到此计算机”复选框


    如何将蓝牙设备连接到Windows 10计算机? 要连接支持蓝牙功能的移动电话,请执行以下操作:

  • 转到开始按钮并选择“设置”、“设备”和 “蓝牙”。单击“添加”
  • 或者,转到控制面板,单击“硬件和声音”,然后 “蓝牙设备”。单击“添加”
  • 资源链接:


  • 有7种方法可以解决网络连接问题:

  • 更新网络适配器驱动程序
  • 回滚网络适配器驱动程序
  • 运行网络疑难解答,然后运行网络命令
  • 暂时关闭防火墙
  • 暂时关闭任何防病毒或恶意软件预防软件
  • 卸载网络适配器驱动程序并重新启动
  • 使用netcfg–d命令重新安装网络设备
  • 更新: 你的答案如何链接到jssc

    我正在检查你的问题。我了解到,在Windows7中,它可以正常工作,而在Windows10中,存在一些硬件相关的问题,这会导致问题

    开发人员正在这个领域工作。但它还没有固定下来。这个问题会让你明白的

    /**
     * Get serial port names in Windows
     *
     * @since 2.3.0
     */
    private static String[] getWindowsPortNames(Pattern pattern, Comparator<String> comparator) {
        String[] portNames = serialInterface.getSerialPortNames();
        if(portNames == null){
            return new String[]{};
        }
        TreeSet<String> ports = new TreeSet<String>(comparator);
        for(String portName : portNames){
            if(pattern.matcher(portName).find()){
                ports.add(portName);
            }
        }
        return ports.toArray(new String[ports.size()]);
    }
    
    建议: 仅使用官方和最新的驱动程序

    jSSC-2.8.0发布版本(2014年1月24日)

    修正:重要!修复了端口处理潜在泄漏的错误

    此版本包含适用于Windows(x86、x86-64)、Linux(x86、, x86-64、ARM软硬浮动)、Solaris(x86、x86-64)、Mac OS X(x86、, x86-64,PPC,PPC64)。jssc.jar文件和 您不需要手动管理本机lib

    资源链接:

  • 请看,该类有一个获取端口属性的方法,不幸的是,它还没有在windows中实现,但是很容易实现并重新编译以使其工作


    我希望这有帮助。

    在扎曼尼罗的帮助下,我现在可以自己回答这个问题了。 使用jssc 2.8.0不可能做到这一点

    目前正在采取行动来扩展jssc,但我不知道发布时间表,也不知道如何解决这个问题。 扩展就是方法
    
    SerialPortList->getPortProperties(字符串portName)
    
    在linux和mac的jssc 2.8.0修改版本中提供了实现。Windows实现更难(找到)

    下面是linux和mac的代码取自


    对于windows,我只在使用自定义dll的处理中找到了一个解决方案。

    这个问题不是要求找到工具或任何建议。API已经被标识为java简单串行连接器。问题是找到/tweek/patch这个开源API来获取设备描述符。请删除“暂停”我想知道这个问题的答案,以便我的arduino eclipse IDE识别连接到com端口的“设备”。我需要的是windows 10在连接的设备中显示的名称。请看,SerialPortList->getPortProperties(String portName)@vzamanillo感谢您的回答。但是,当我在eclipse中时,我只有SerialPortList.getPortNames。在您提供的链接中,我找不到GetPortProperties感谢您的回复。然而,我无法在这个问题和你的答案之间找到联系。你的答案如何链接到jssc?@jantje我已经更新了一些信息。希望它能帮助你做出正确的决定
    OS_LINUX: Pattern.compile("(ttyS|ttyUSB|ttyACM|ttyAMA|rfcomm|ttyO)[0-9]{1,3}"); 
    
    OS_SOLARIS: Pattern.compile("[0-9]*|[a-z]*");
    
    OS_MAC_OS_X: Pattern.compile("tty.(serial|usbserial|usbmodem).*"); 
    
    OS_WINDOWS: Pattern.compile("");
    
    JNIEXPORT jobjectArray JNICALL Java_jssc_SerialNativeInterface_getPortProperties
      (JNIEnv *env, jclass cls, jstring portName) {
        const char* portNameChar = (const char*)env->GetStringUTFChars(portName, NULL);
        jclass stringClass = env->FindClass("Ljava/lang/String;");
        jobjectArray ret = env->NewObjectArray(5, stringClass, NULL);
    
    #ifdef __APPLE__
    
        // this code is based on QtSerialPort
        CFMutableDictionaryRef matching = IOServiceMatching(kIOSerialBSDServiceValue);
        io_iterator_t iter = 0;
        kern_return_t kr = IOServiceGetMatchingServices(kIOMasterPortDefault, matching, &iter);
        if (kr != kIOReturnSuccess) {
            env->ReleaseStringUTFChars(portName, portNameChar);
            return ret;
        }
    
        io_registry_entry_t service;
        while ((service = IOIteratorNext(iter))) {
    
            // compare portName against cu and tty devices
            bool found = false;
    
            CFTypeRef cu = 0;
            cu = IORegistryEntrySearchCFProperty(service, kIOServicePlane, CFSTR(kIOCalloutDeviceKey), kCFAllocatorDefault, 0);
            if (cu) {
                char buffer[MAXPATHLEN];
                CFStringGetCString(CFStringRef(cu), buffer, sizeof(buffer), kCFStringEncodingUTF8);
                //fprintf(stdout, "getPortProperties: %s\n", buffer);
                //fflush(stdout);
                if (strcmp(portNameChar, buffer) == 0) {
                    found = true;
                }
                CFRelease(cu);
            }
    
            CFTypeRef tty = 0;
            tty = IORegistryEntrySearchCFProperty(service, kIOServicePlane, CFSTR(kIODialinDeviceKey), kCFAllocatorDefault, 0);
            if (tty) {
                char buffer[MAXPATHLEN];
                CFStringGetCString(CFStringRef(tty), buffer, sizeof(buffer), kCFStringEncodingUTF8);
                //fprintf(stdout, "getPortProperties: %s\n", buffer);
                //fflush(stdout);
                if (strcmp(portNameChar, buffer) == 0) {
                    found = true;
                }
                CFRelease(tty);
            }
    
            if (!found) {
                // not port we're looking for
                //fprintf(stderr, "getPortProperties: %s not found", portNameChar);
                //fflush(stderr);
                IOObjectRelease(service);
                continue;
            }
    
            io_registry_entry_t entry = service;
            do {
                int val = 0;
                char buffer[255];
    
                CFTypeRef idProduct = 0;
                idProduct = IORegistryEntrySearchCFProperty(entry, kIOServicePlane, CFSTR(kUSBProductID), kCFAllocatorDefault, 0);
                if (idProduct && !env->GetObjectArrayElement(ret, 0)) {
                    CFNumberGetValue(CFNumberRef(idProduct), kCFNumberIntType, &val);
                    sprintf(buffer, "%04x", val);
                    jstring tmp = env->NewStringUTF(buffer);
                    env->SetObjectArrayElement(ret, 0, tmp);
                    env->DeleteLocalRef(tmp);
                    CFRelease(idProduct);
                }
    
                CFTypeRef idVendor = 0;
                idVendor = IORegistryEntrySearchCFProperty(entry, kIOServicePlane, CFSTR(kUSBVendorID), kCFAllocatorDefault, 0);
                if (idVendor && !env->GetObjectArrayElement(ret, 1)) {
                    CFNumberGetValue(CFNumberRef(idVendor), kCFNumberIntType, &val);
                    sprintf(buffer, "%04x", val);
                    jstring tmp = env->NewStringUTF(buffer);
                    env->SetObjectArrayElement(ret, 1, tmp);
                    env->DeleteLocalRef(tmp);
                    CFRelease(idVendor);
                }
    
                CFTypeRef manufacturer = 0;
                manufacturer = IORegistryEntrySearchCFProperty(entry, kIOServicePlane, CFSTR(kUSBVendorString), kCFAllocatorDefault, 0);
                if (manufacturer && !env->GetObjectArrayElement(ret, 2)) {
                    CFStringGetCString(CFStringRef(manufacturer), buffer, sizeof(buffer), kCFStringEncodingUTF8);
                    jstring tmp = env->NewStringUTF(buffer);
                    env->SetObjectArrayElement(ret, 2, tmp);
                    env->DeleteLocalRef(tmp);
                    CFRelease(manufacturer);
                }
    
                CFTypeRef product = 0;
                product = IORegistryEntrySearchCFProperty(entry, kIOServicePlane, CFSTR(kUSBProductString), kCFAllocatorDefault, 0);
                if (product && !env->GetObjectArrayElement(ret, 3)) {
                    CFStringGetCString(CFStringRef(product), buffer, sizeof(buffer), kCFStringEncodingUTF8);
                    jstring tmp = env->NewStringUTF(buffer);
                    env->SetObjectArrayElement(ret, 3, tmp);
                    env->DeleteLocalRef(tmp);
                    CFRelease(product);
                }
    
                CFTypeRef serial = 0;
                serial = IORegistryEntrySearchCFProperty(entry, kIOServicePlane, CFSTR(kUSBSerialNumberString), kCFAllocatorDefault, 0);
                if (serial && !env->GetObjectArrayElement(ret, 4)) {
                    CFStringGetCString(CFStringRef(serial), buffer, sizeof(buffer), kCFStringEncodingUTF8);
                    jstring tmp = env->NewStringUTF(buffer);
                    env->SetObjectArrayElement(ret, 4, tmp);
                    env->DeleteLocalRef(tmp);
                    CFRelease(serial);
                }
    
                kr = IORegistryEntryGetParentEntry(entry, kIOServicePlane, &entry);
            } while (kr == kIOReturnSuccess);
    
            IOObjectRelease(entry);
    
            IOObjectRelease(service);
        }
    
        IOObjectRelease(iter);
    
    #endif  // __APPLE__
    
        env->ReleaseStringUTFChars(portName, portNameChar);
        return ret;
    }