0

我在运行程序时调用库本机函数 OpenSSPComPortUSB() 弹出无法打开端口 \.\COM208。为什么它返回 \.\COM208 因为我已经通过 PortNumber =7; 下面是 Java 代码,我的目标是打开端口 COM7 以启动与 smart hoper 的串行通信。

    //  AccessITLLib.java


   public class AccessITLLib
    {


       public static class SSP_COMMAND extends Structure
       {
           SSP_FULL_KEY Key;
            public NativeLong BaudRate;
            public byte PortNumber;
                    public NativeLong Timeout;
                    public byte SSPAddress;
                    public byte RetryLevel;
                    public byte EncryptionStatus;
                    public byte CommandDataLength;
                    public byte[] CommandData = new byte[255];
                    public byte ResponseStatus;
                    public byte ResponseDataLength;
                    public byte[] ResponseData = new byte[255];
                    public byte IgnoreError;


       }



       public interface ITLLib extends Library
       {
           ITLLib INSTANCE = (ITLLib) Native.loadLibrary("ITLSSPproc",
                   ITLLib.class);

           public int OpenSSPComPort(SSP_COMMAND p);
           public int OpenSSPComPortUSB(SSP_COMMAND p);
           public int CloseSSPComPort();
           public int CloseSSPComPortUSB();
       }

       public static void main(String[] args)
       {
          SSP_COMMAND commandStruct = new SSP_COMMAND();
          commandStruct.BaudRate = new NativeLong(9600);
          commandStruct.PortNumber =7;
          commandStruct.Timeout = 500;
          commandStruct.RetryLevel = 3;
          commandStruct.IgnoreError = 1;
          commandStruct.SSPAddress =16;



          ITLLib.INSTANCE.CloseSSPComPort();
          ITLLib.INSTANCE.CloseSSPComPortUSB();
          ITLLib.INSTANCE.OpenSSPComPort(commandStruct);
          ITLLib.INSTANCE.OpenSSPComPortUSB(commandStruct);



       }
    }


 here are the c structures
    typedef struct{
        SSP_FULL_KEY Key;
        unsigned long BaudRate;
        unsigned long Timeout;
        unsigned char PortNumber;
        unsigned char SSPAddress;
        unsigned char RetryLevel;
        unsigned char EncryptionStatus;
        unsigned char CommandDataLength;
        unsigned char CommandData[255];
        unsigned char ResponseStatus;
        unsigned char ResponseDataLength;
        unsigned char ResponseData[255];
        unsigned char IgnoreError;
    }SSP_COMMAND;



    typedef struct{
        unsigned long long FixedKey;
        unsigned long long EncryptKey;
    }SSP_FULL_KEY;
4

2 回答 2

1

这可能不是答案;但仍然给你一些建议。

当您尝试通过客户端连接到 PORT 时;该端口应首先由服务器程序连接,并应侦听客户端。

因此,使用以下命令检查端口是否已启动。

网络统计-lpn | grep 8080

netstat -f 是windows的命令

你会得到这样的输出

tcp 0 0 0.0.0.0:8080 0.0.0.0:* 听 13098/java

这里我的进程 ID 是 13098,它是使用端口 8080 的进程

有可能端口已启动,但防火墙阻止客户端连接,因此您可以停止 iptable 服务以停止防火墙。

服务 iptables 停止

如果客户端仍然无法使用该端口,则该端口在网络级别(例如路由器)被阻止

如何知道端口是否被阻塞?

使用客户端计算机上的 telnet 命令来了解端口是否正在侦听。

telnet ip 端口(windows cmd)

我们可以找出一个特定的进程正在使用哪些端口 root root 14223 14206 processName

lsof -p 14223(进程PID)

输出:
processName 14223 root 5u IPv4 349373 0t0 UDP hostName.com:7575

IPv4 表示它正在使用端口并且端口号是 7575

使端口不受服务器进程的影响;使用以下命令终止进程:

须藤杀死 13098

现在 8080 端口是免费的。

于 2013-02-06T07:12:23.730 回答
1

您的 JNA 结构定义与本机定义的布局不匹配。

JNA 中的字段顺序必须与本机定义的顺序完全匹配(最新版本的 JNA 实际上要求您实现一个明确声明字段顺序的方法)。

您无意中交换了PortNumberandTimeout字段。

于 2013-02-06T14:36:36.300 回答