首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用jssc获取SerialPort的设备描述符

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

Stack Overflow用户
提问于 2015-11-17 10:58:55
回答 3查看 3.6K关注 0票数 8

如何使用jssc SerialPort获取( java-simple-serial-connector)的设备描述符

getPortName()方法给出了端口名(e.g. COM2),但是描述符会更有帮助。

如果有必要对这个开源API进行修补以获得设备描述符,那么如何实现呢?

EN

回答 3

Stack Overflow用户

发布于 2016-04-06 15:32:31

看看gohai/java-简单串行连接器SerialPortList类有一个getPortProperties(字符串portName)方法来获取端口属性,不幸的是,windows还没有实现它,但是很容易完成一个实现并重新编译以使其工作。

我希望这能帮到你。

票数 1
EN

Stack Overflow用户

发布于 2016-04-06 15:47:14

在萨马尼洛的帮助下,我现在可以自己回答这个问题。使用jssc 2.8.0是不可能的。

有正在进行的行动来扩展jssc,但是我不知道发布时间表,也不知道如何解决这个问题。扩展是用于linux和mac的jssc2.8.0修改版本中可用的SerialPortList->getPortProperties(String portName)实现的方法。Windows实现更难(找到)。

下面是从基/jssc.cpp获取的linux和mac代码

代码语言:javascript
复制
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;
}

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

票数 1
EN

Stack Overflow用户

发布于 2016-04-05 18:51:21

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

idVendor是分配给每家生产基于USB的设备的公司的号码。USB执行者论坛负责管理供应商ID的分配。

idProduct是另一个16位字段,包含制造商指定的标识特定产品的数字。

从jantje的问题

我需要的是windows 10在连接的设备中显示的名称吗?

Ans:打开"Settings app"并单击设备。单击“设备”将打开一个选项卡,您可以在该选项卡中调整所有打印机、连接设备、蓝牙设备、鼠标和触摸屏、键入设置和自动播放设置的设置。此连接设备选项卡显示连接到您的PC的硬件。点击添加一个设备,你的电脑将自动扫描连接的设备。蓝牙选项卡非常简单,可以通过蓝牙将设备连接到PC上。单击蓝牙按钮,设备将自动开始扫描范围内的任何蓝牙设备。

如果有任何问题,显示设备或提供不可用,那么我们需要以下的工作。

  1. 扫描硬件和设备,找出驱动程序的问题。
  2. 修复损坏、损坏或不兼容的蓝牙驱动程序。
  3. 更新到Windows 10的最新蓝牙驱动程序。
  4. 下载并安装Windows 10中最匹配的驱动程序.

删除并添加蓝牙设备

允许蓝牙设备连接到这台计算机

无法从启用蓝牙的设备连接到计算机?确保已允许蓝牙设备连接到计算机。尝试以下步骤: 1.转到控制面板。点击“硬件和声音”和“蓝牙设备”。2.单击Options选项卡。3.确保选中“允许蓝牙设备连接到此计算机”复选框。

如何将蓝牙设备连接到Windows 10计算机?

要连接启用蓝牙的移动电话:

  1. 转到“开始”按钮,选择“设置”、“设备”和“蓝牙”。点击“添加”。
  2. 或者,转到控制面板,点击“硬件和声音”和“蓝牙设备”。点击“添加”。

资源链接:

  1. Windows 10更新后无法使用的3种修复蓝牙的方法
  2. http://windows.microsoft.com/en-gb/windows-10/getstarted-connect-to-bluetooth-devices

修复网络连接问题

有7种解决网络连接问题的方法:

  1. 更新网络适配器驱动程序
  2. 回滚网络适配器驱动程序
  3. 运行网络疑难解答,然后是网络命令
  4. 暂时关闭防火墙
  5. 暂时关闭任何防病毒软件或恶意软件。
  6. 卸载网络适配器驱动程序并重新启动
  7. 使用netcfg -d命令重新安装网络设备

更新:

你的答案是如何与jssc联系的?

我正在检查你的问题。我发现在windows 7中,它工作得很好,而在windows 10中,有一些与硬件相关的问题导致了问题。

开发人员正在这一领域工作。但它还没有修好。issue#63issue#85会澄清你的意思。

代码语言:javascript
复制
/**
 * 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()]);
}

我知道了,他们在各种操作系统上都使用了一些模式。

代码语言:javascript
复制
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("");

Suggestions:只使用官方和最新的驱动程序。

jSSC-2.8.0发行版(24.01.2014)

修正:重要!修正了端口处理潜在泄漏的错误。 此版本包含本机libs for Windows(x86,x86-64)、Linux(x86,x86-64、ARM软和硬浮点数)、Solaris(x86,x86-64)、Mac (x86,x86-64、PPC、PPC64)。所有本机库都包含在jssc.jar文件中,您不需要手动管理本机库。

资源链接:

  1. https://github.com/tcr/node-jssc/blob/master/jSSC-2.6.0-Release/src/src/jssc/SerialPortList.java
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33755211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档