2013-02-06 189 views
0

我在运行时调用库本机函数OpenSSPComPortUSB() 程序弹出不可打开的端口\。\ COM208。为什么它返回 \。\ COM208,因为我已经通过PortNumber = 7;下面是Java代码和我的 的目标是打开端口COM7以启动与智能 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; 
+0

您的波特率绝对不是64位数字;改用'int'或'NativeLong'。 Web上的其他参考似乎表明'PortNumber'是一个'char',它需要JNA中的'byte'字段。你是否有一个来自C头文件的函数/结构声明进行比较? – technomage

+0

在c结构文件中波特率很长,而PortNumber在JNA中是char,我把habit的BaudRate更改为NativeLong和PortNumber作为字节,但没有变化 –

+0

这可能是一个愚蠢的问题,但是您是否尝试过使用端口号6而不是7?我对这个特定的API一无所知,但也许端口的数字标识符从0而不是1计数? –

回答

1

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

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

您已经无意中交换了PortNumberTimeout字段。

+0

感谢您的回复,这是行不通的 –

+1

你会比较'Structure.size()'与'sizeof(SSP_COMMAND)';如果它们不同,则需要对JNA结构定义进行一些调整,以确保它们匹配,并确保所有字段正确排列。 – technomage

+0

如何调用这些方法sizeof(SSP_COMMAND cmd)给我错误 –

1

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

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

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

netstat -lpn | grep的8080

的netstat -f是Windows

命令

你会得到输出这样的事情

TCP 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 13098/JAVA

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

有端口已启动,但防火墙阻止客户端连接和这样你就可以停止IPTA的可能性的过程停止防火墙的服务。

服务iptables的停止

如果仍然无法使用到客户端那么该端口被封锁在网络层面(如路由器)

如何知道端口被阻塞或不?

在客户端机器上使用telnet命令知道端口是否正在侦听。

的telnet IP端口(窗口CMD)

我们可以找出一个特定进程正在使用什么是所有端口 根根14223 14206 processName

lsof的-p 14223(过程PID)

输出:
processName 142 23根5u IPv4 349373 0t0 UDP主机名。COM:7575

IPv4到说,这是使用的端口,端口不就是7575

为了从服务器进程自由的端口;使用下面的命令杀掉该进程:

须藤杀死13098

现在端口8080是免费的。

+0

感谢您的回复,但如何在cmd中执行thiese命令,因为我正在使用windows 32位系统 –

+0

@AJAYMAHALLE这些命令大部分都是基于Linux的。只有telnet命令我给了windows。 –

+0

@AJAYMAHALLE是你的服务器进程在windows下运行吗?和客户端也Windows? –

相关问题