gpt4 book ai didi

java - 如何解决错误 java.io.IOException : Input/output error in nativeavailable for Serial Communication?

转载 作者:搜寻专家 更新时间:2023-11-01 02:28:26 24 4
gpt4 key购买 nike

我有 Arm 处理器,它是 AllWinner A13、RAM-512mb 和 OS-Linaro 13.01 Ubuntu(指 debian)。现在我正在为/dev/ttyS0 制作串行通信程序。我用netbeans在java中制作了简单的双向串行通信程序。在我的处理器中,我缩短了 ttyS0 的 rx-tx 用于环回连接检查。意味着我通过串行端口发送的返回值。但我得到错误。我在处理器上安装了 openjdk-7、librxtx-java。我的代码和错误如下。如果有任何想法或解决方案,请向我提出建议。

package serialcomm_linaro;


import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;

import java.io.FileDescriptor;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class TwoWaySerialComm
{
public TwoWaySerialComm()
{
super();
}

void connect ( String portName ) throws Exception
{
CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
if ( portIdentifier.isCurrentlyOwned() )
{
System.out.println("Error: Port is currently in use");
}
else
{
CommPort commPort = portIdentifier.open(this.getClass().getName(),2000);

if ( commPort instanceof SerialPort )
{
SerialPort serialPort = (SerialPort) commPort;
serialPort.setSerialPortParams(115200,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);

InputStream in = serialPort.getInputStream();
OutputStream out = serialPort.getOutputStream();

(new Thread(new SerialReader(in))).start();
(new Thread(new SerialWriter(out))).start();

}
else
{
System.out.println("Error: Only serial ports are handled by this example.");
}
}
}

/** */
public static class SerialReader implements Runnable
{
InputStream in;

public SerialReader ( InputStream in )
{
this.in = in;
}

public void run ()
{
byte[] buffer = new byte[1024];
int len = -1;
try
{
while ( ( len = this.in.read(buffer)) > -1 )
{
System.out.print(new String(buffer,0,len));
}
}
catch ( IOException e )
{
e.printStackTrace();
}
}
}

/** */
public static class SerialWriter implements Runnable
{
OutputStream out;

public SerialWriter ( OutputStream out )
{
this.out = out;
}

public void run ()
{
try
{
int c = 0;
while ( ( c = System.in.read()) > -1 )
{
this.out.write(c);
}
}
catch ( IOException e )
{
e.printStackTrace();
}
}
}

public static void main ( String[] args )
{
try
{
(new TwoWaySerialComm()).connect("/dev/ttyS0");
}
catch ( Exception e )
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

我的输出在下面。在这个输出中,我只发送 123,然后我先返回 23,然后返回 1111...更多时间,然后出错。而不是 111111 .... 我只想返回 123。
enter code here
RXTX Warning: Removing stale lock file. /var/lock/LCK..ttyS0
123
23
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111



java.io.IOExcepti on: Input/output error in nativeavailable
at gnu.io.RXTXPort.nativeavailable(Native Method)
at gnu.io.RXTXPort$SerialInputStream.read(RXTXPort.java:1429)
at gnu.io.RXTXPort$SerialInputStream.read(RXTXPort.java:1341)
at serialcomm_linaro.TwoWaySerialComm$SerialReader.run(TwoWaySerialComm.java:66)
at java.lang.Thread.run(Thread.java:722)

最佳答案

我没有在环回场景中尝试通过 RXTX 进行串行通信,但这应该无关紧要。唯一看起来有点可疑的是您将输入流的实例提供给 SerialReader 的部分。 .我建议你通过SerialPort实例到两个构造函数,并且每次需要从端口的流读取/写入时,请使用流 getter ,例如阅读:

 public static class SerialReader implements Runnable 
{
SerialPort serialPort;

public SerialReader ( SerialPort serialPort )
{
this.serialPort = serialPort;
}

public void run ()
{
byte[] buffer = new byte[1024];
int len = -1;
try
{
while ( ( len = serialPort.getInputStream().read(buffer)) > -1 )
{
System.out.print(new String(buffer,0,len));
}
}
catch ( IOException e )
{
e.printStackTrace();
}
}
}

请反馈。

更新:

来自我个人 experience RXTX 是一个有问题的解决方案。然而,这并不意味着这种情况是由潜在的 RXTX 错误引起的。这可能是因为串行端口设置不正确,但在您的情况下,它是具有标准连接参数的标准端口名称。作为一个 loooong 镜头,尝试用 9600 替换波特率 115200,但这可能无济于事。我可以从这里提供三种途径:
  • 尝试调试 RXTX 代码 - 您可能会更深入地了解正在发生的事情
  • 阅读 serial line troubleshooting
  • 考虑其他用于串行通信的 Java 解决方案,例如 JSSC而不是RXTX。

  • 更新:

    恐怕是我一不留神,就往前跳了。 JSSC native 库(.so、.dll)位于 jssc.jar 中,因此它们是“自动”加载的。使用 RXTX,它们位于 jar 文件之外,因此您需要设置 java.library.path系统属性,以便 JVM 找到并加载它们,否则您将收到 UnsatisfiedLinkError。

    您可以双击打开JSSC jar 文件,它会在存档器中打开,因为它是 actually a zip file .与 RXTX 一样,您会注意到 native libs 文件组织在类似操作系统(windows、linux、RXTX 也有 Mac_OS_X 和 Solaris)的目录中。

    在这些目录中有本地 libs 文件、.so、dll. 和 .jnilib 类型的文件,它们以 computer architectures 命名。 .这是这个词的更广泛含义,这些是 instruction set architectures (ISA) 的短代码。 .指令集定义了 CPU 的指令集(命令)。换句话说,有许多不同的 CPU 型号(例如您的 AllWinner A13)符合相同的指令集。编译 native libs 源代码以生成可执行文件 (.so,...),这是来自同一指令集的一堆指令。

    您在 JSSC 中遇到 UnsatisfiedLinkError 的原因可能是因为您处于不受支持的架构上,并且正在不存在的目录中搜索相应的 native 库。 ISA 短代码,也是这些 JSSC 目录的名称是 x86PPC体系结构,32 位和 64 位变体。 RXTX 有很多其他的,但我认为它们中没有一个等同于 ARMv7这是您 AllWinner A13 的 ISA中央处理器。

    您可以确定您的 architecture通过在终端中执行此命令:
    uname -m

    在我的 linux 上它输出:
    x86_64

    这意味着它是 64bit Intel 8086 architecture . JSSC 和 RXTX 都实现了这种架构。如果您的架构未实现(支持),则您无法使用这些库连接到该计算机上的串行端口。在这种情况下,您必须自己编写或获得合适的实现。

    如果架构匹配并且仍然存在 native 错误,您可以尝试 recompiling native 库源。为 RXTX 提供了来源和 JSSC .

    更新:

    如果您的架构是 armv7l这意味着 JSSC、RXTX 和 JavaComm (大约说,RXTX“祖先”)在他们当前的状态下在你的场景中是无用的。

    我没有找到任何其他用于串行通信的开源 Java 库。如果这是真的,您需要编写自己的符合上述库之一的接口(interface)的 native 库,以使它们有用。换句话说,你需要写一个 C程序(类似这样: 1 , 2 )具有 serial communication 的功能和 JNI Java 库的接口(interface)。

    在回答完整性的意义上,我会提到一个商业产品 SerialIO它确实支持一些 ARM 架构(不知道您是否是其中之一)。但是,如果您决定采用该解决方案,您可以随时向他们的支持人员发送查询。

    关于java - 如何解决错误 java.io.IOException : Input/output error in nativeavailable for Serial Communication?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15567869/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com