我有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……更多时间,然后是errore。而不是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
实例传递给两个构造函数,并且每当您需要对端口的流进行读/写操作时,请使用流获取器,例如阅读:
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错误引起的。可能是因为串行端口设置不正确,但是在您的情况下,它是带有标准连接参数的标准端口名称。放宽镜头,尝试将波特率115200替换为9600,但这可能无济于事。我可以从这里提供三种路径:
更新:
恐怕我一直不专心,跳到了前面。 JSSC本机库(.so,.dll)位于jssc.jar中,因此可以“自动”加载。使用RXTX时,它们不在jar文件之外,因此您需要设置java.library.path
系统属性,以便JVM查找并加载它们,否则您将收到UnsatisfiedLinkError。
您可以双击打开JSSC jar文件,因为它是actually a zip file,所以它将在存档器中打开。与RXTX一样,您会注意到本机libs文件组织在名为操作系统的目录中(Windows,Linux,RXTX也具有Mac_OS_X和Solaris)。
在这些目录中有本机libs文件,.so,dll和.jnilib类型的文件,它们以computer architectures命名。这是该词的广义含义,它们是instruction set architectures (ISA)的短代码。指令集定义了CPU的指令集(命令)。换句话说,有许多不同的CPU型号(例如AllWinner A13)符合相同的指令集。编译本地libs源代码以生成可执行文件(.so,...),该可执行文件是来自同一指令集的一堆指令。
使用JSSC出现UnsatisfiedLinkError的原因可能是因为您使用的是不受支持的体系结构,并且正在不存在的目录中搜索相应的本机lib。 ISA短代码(也是JSSC的这些目录的名称)是x86和PPC体系结构,都是32位和64位变体。 RXTX还有许多其他功能,但我认为它们都不等同于ARMv7,这是AllWinner A13 CPU的ISA。
您可以通过在终端中执行此命令来确定您的architecture:
uname -m
在我的Linux上,它输出:
x86_64
这意味着它是一个64bit Intel 8086 architecture。 JSSC和RXTX都实现了此体系结构。如果未实现(支持)您的体系结构,则不能使用这些库连接到该计算机上的串行端口。在这种情况下,您必须编写自己的代码或获取合适的实现。
如果体系结构匹配并且仍然存在本机错误,则可以尝试recompiling本机libs源。为RXTX和JSSC提供了信号源。
更新:
[如果您的体系结构为armv7l
,则表示它们的当前状态下的JSSC,RXTX和JavaComm(近似地说,RXTX“祖先”)在您的方案中是无用的。
我没有找到其他用于串行通信的开源Java库。如果确实如此,则需要编写自己的本机库以符合上述库之一的接口,以使它们有用。换句话说,您需要编写一个具有C和1接口到Java库的功能的2程序(类似:serial communication,JNI)。
就答案的完整性而言,我会提到一种商业产品SerialIO,它确实支持某些ARM体系结构(不知道您是否是其中之一)。但是,如果您决定采用该解决方案,则可以随时向其支持小组发送查询。
我在TX2 Jetson(3月64日)上遇到了相同的问题,@jay你伤心:有rxtx效果很好。主要问题是我的Arm处理器的串行端口处于调试模式。