当前位置:  技术问答>java相关

如何用java读、写串口?

    来源: 互联网  发布时间:2015-02-23

    本文导语:  我装了javax.comm后运行samples,都说找不到串口,可我都是按照它的指示做的。 不解。 是不是非要在串口上插线才行? | 转自BBS水木清华站Java讨论区  利用Java实现串口全双工通讯  qyjohn , 3...

我装了javax.comm后运行samples,都说找不到串口,可我都是按照它的指示做的。
不解。
是不是非要在串口上插线才行?

|
转自BBS水木清华站Java讨论区 

利用Java实现串口全双工通讯 

qyjohn , 3月30日,2001年 

关键字: Java Comm API,串口,全双工通讯 

摘要: 
本文介绍一个利用Java Comm API (javax.comm)实现串口全双工通讯的简单程序 

本文介绍一个利用Java Comm API (javax.comm)实现串口全双工通讯的简单程序。这个程序首先打开并初始化一个串口,然后启动如下三个进程:ReadSerial进程从该串口读取数据并放入缓冲区,ReadBuffer进程从缓冲区读取数据并打印到屏幕, WriteSerial进程每5秒钟向该串口发送一个星号(*)。  

在这个示例程序中使用了一个简单的协议,既不同的消息之间用星号'*'作为分隔。缓冲区程序根据是否收到星号作为存在等待处理的消息的判断依据。  

Java Comm API不是标准的Java API,因此的标准的运行环境中并不提供这个包。如果你的系统上还没有安装这个包,你可以从SUN公司的网站下载。在这个包里面有一个安装指南,如果你没有正确安装这个包,可能你不能够正确运行这个例程。  

这个简单的例程包括以下文件:  

IMU.java (主程序)  
ReadBuffer.java (从缓冲区读取一个消息)  
ReadSerial.java (读取串口数据并放入缓冲区)  
SerialBuffer.java (缓冲区)  
WriteSerial.java (每5秒钟往串口送一个星号'*')  

测试程序:  

SendCom.java (将一个数据文件往串口发送)  
SEND.TXT (供测试用的数据文件)  

测试方法:  

1 正确安装Java Comm API后编译本例程  
2 将计算机的COM1和COM2用一条串口线连接起来  
3 运行IMU。如果你这时候打开Windows自带的超级终端并连接到COM2的话,你应该能够看见有星号出现在超级终端的屏幕上。超级终端的参数设置为9600, N, 8, 1, none。  
4 关闭超级终端,运行SendCom。这时候你应该能够从IMU的屏幕上看到数据文件里面的内容。  

/*  
*  
* IMU.java 1.0  
* Main Program for Serial Communication  
*  
* Created: March 27, 2001  
*  
* Author : Qingye Jiang (John)  
* American GNC Corporation  
* 888 Easy St, Simi Valley CA 93065-1812  
*  
* Contact: (805) 582-0582 (Tel), (805) 582-0098 (Fax)  
* qjiang@tsinghua.edu  
*  
*/  

import java.io.*;  
import java.util.*;  
import javax.comm.*;  

class IMU  
{  

static CommPortIdentifier portId;  
static SerialPort serialPort;  
static OutputStream out;  
static InputStream in;  

public static void main(String[] args)  
{  

try  
{  

//Declare the serial port, and open it.  

portId = CommPortIdentifier.getPortIdentifier("COM1");  
try  
{  

serialPort = (SerialPort) portId.open("IMU_App", 2000);  

} catch (PortInUseException e)  
{  

System.out.println(e.getMessage());  

}  

//Use InputStream in to read from the serial port, and OutputStream  
//out to write to the serial port.  

try  
{  

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

} catch (IOException e)  
{  

System.out.println(e.getMessage());  

}  

//Initialize the communication parameters to 9600, 8, 1, none.  

try  
{  


serialPort.setSerialPortParams(9600,  
              SerialPort.DATABITS_8,  
              SerialPort.STOPBITS_1,  
              SerialPort.PARITY_NONE);  

} catch (UnsupportedCommOperationException e) 
{  

System.out.println(e.getMessage());  

}  

} catch (NoSuchPortException e)  
{  

System.out.println(e.getMessage());  

}  

//Declare the serial buffer area, a thread to read from the seriial port,  
//a thread to read from the serial buffer for processing, and a thread  
//to write to the serial port.  

SerialBuffer SB = new SerialBuffer();  
ReadSerial r1 = new ReadSerial(SB, in);  
ReadBuffer r2 = new ReadBuffer(SB);  
WriteSerial r3 = new WriteSerial(out);  


//Start all three threads.  

r1.start();  
r2.start();  
r3.start();  

}  

}  

/*  
*  
* SerialBuffer.java 1.0  
* Class that implements the serial buffer  
*  
* Created: March 27, 2001  
*  
* Author : Qingye Jiang (John)  
* American GNC Corporation  
* 888 Easy St, Simi Valley CA 93065-1812  
*  
* Contact: (805) 582-0582 (Tel), (805) 582-0098 (Fax)  
* qjiang@tsinghua.edu  
*  
*/  

public class SerialBuffer  
{  

private String Content = "";  
private String CurrentMsg, TempContent;  
private boolean available = false;  


//read a message from the serial buffer. The star character '*' is used  
//as the seperation mark between different messages.  

public synchronized String GetMsg()  
{  

int SepMark;  

if ((SepMark = Content.indexOf('*')) == -1)  
{  

available = false;  
while (available == false)  
{  

try  
{  
        wait();  
} catch (InterruptedException e) { }  

}  
SepMark = Content.indexOf('*');  

}  

CurrentMsg = Content.substring(0, SepMark);  
TempContent = Content.substring(SepMark+1);  
Content = TempContent;  
notifyAll();  
return CurrentMsg;  

}  

//Put a character to the serial buffer  

public synchronized void PutChar(int c)  
{  

Character d = new Character((char) c);  
Content = Content.concat(d.toString());  
if (c == '*')  
{  
        available = true;  
}  
notifyAll();  

}  

}  

/*  
*  
* ReadSerial.java 1.0  
* Program to read characters from the serial port and put it  
* to the buffer  
*  
* Created: March 27, 2001  
*  
* Author : Qingye Jiang (John)  
* American GNC Corporation  
* 888 Easy St, Simi Valley CA 93065-1812  
*  
* Contact: (805) 582-0582 (Tel), (805) 582-0098 (Fax)  
* qjiang@tsinghua.edu  
*  
*/  

import java.io.*;  

public class ReadSerial extends Thread  
{  

private SerialBuffer ComBuffer;  
private InputStream ComPort;  

public ReadSerial(SerialBuffer SB, InputStream Port)  
{  
        ComBuffer = SB;  
        ComPort = Port;  
}  

public void run()  
{  

int c;  
try  
{  

while (true)  
{  
        c = ComPort.read();  
        ComBuffer.PutChar(c);  


} catch (IOException e) {}  

}  

}  


/*  
*  
* ReadBuffer.java 1.0  
* Program to Read the Serial Buffer  
*  
* Created: March 27, 2001  
*  
* Author : Qingye Jiang (John)  
* American GNC Corporation  
* 888 Easy St, Simi Valley CA 93065-1812  
*  
* Contact: (805) 582-0582 (Tel), (805) 582-0098 (Fax)  
* qjiang@tsinghua.edu  
*  
*/  

import java.io.*;  

public class ReadBuffer extends Thread  
{  

private SerialBuffer ComBuffer;  

public ReadBuffer(SerialBuffer SB)  
{  
        ComBuffer = SB;  
}  

public void run()  
{  

String Msg;  
while (true)  
{  
        Msg = ComBuffer.GetMsg();  
        System.out.println(Msg);  
}  

}  

}  

/*  
*  
* WriteSerial.java 1.0  
* Program to send a star to the serial port every 5 seconds.  
*  
* Created: March 27, 2001  
*  
* Author : Qingye Jiang (John)  
* American GNC Corporation  
* 888 Easy St, Simi Valley CA 93065-1812  
*  
* Contact: (805) 582-0582 (Tel), (805) 582-0098 (Fax)  
* qjiang@tsinghua.edu  
*  
*/  

import java.io.*;  

public class WriteSerial extends Thread  
{  

private SerialBuffer ComBuffer;  
private OutputStream ComPort;  

public WriteSerial(OutputStream Port)  
{  
        ComPort = Port;  
}  

public void run()  
{  

int c;  
try  
{  

while (true)  


ComPort.write('*');  
try  
{  
        wait(5000);  
} catch (InterruptedException e) { }  

}  

} catch (IOException e)  
{  
        System.out.println(e.getMessage());  
}  

}  

}  

/*  
*  
* SendCom.java 1.0  
*  
* Project: Java Based Information Exchange Support System  
* Onboard Plug-in System  
* Sending data through serial port  
*  
* Created: March 15, 2001  
*  
* Author : Qingye Jiang (John)  
* American GNC Corporation  
* 888 Easy St, Simi Valley CA 93065-1812  
*  
* Contact: (805) 582-0582 (Tel), (805) 582-0098 (Fax)  
*  
*/  

import java.io.*;  

public class SendCom  
{  

public static void main(String[] args)  
{  

File OutFile = new File("SEND.TXT");  
File ComPort = new File("COM2");  

int c;  

try  
{  

FileReader in = new FileReader(OutFile);  
FileWriter out = new FileWriter(ComPort);  
while ((c = in.read()) != -1)  
        out.write(c);  
in.close();  
out.close();  

} catch (IOException e) {}  

}  

}  

SEND.TXT*  

This is a sample of the data file for program testing. *  

It should be in the same directory as the SendCom.class file.*  

When you run this sample program, connect your COM1 and COM2 with a  
serial cable so that you can test this program on one machine. If  
you have two machines, you can connect the two machine via a serial  
cable and test it. Modified the definition of ComPort in the program  
if necessary. *  

Thank you for testing this program. If you have any suggestions please  
kindly let me know. *  

小结:  

在上面的例程中,大多数的程序仅对我前天发的《一个使用Java读取串口的程序》 
一文做了小篇幅的改动,有几个程序和数据文件都没有改动。但是为了本文的完整 
性,仍然将雷同的内容也贴了一遍,还望斑竹多多见谅。 

这个例程和前面一个例程的区别在于前面一个例程使用了文件IO,而本例程使用了 
Comm API。在C语言里面用fopen()函数来打开串口是可读也可写的,但是在Java里 
面声明了File以后并不立即打开文件,文件是在声明FileReader或者FileWriter时 
才打开的。由于串口不能同时被打开两次,所以读操作和写操作不能够同时进行, 
不能够实现全双工通讯。 

Comm API虽然能够实现全双工通讯,但是由于它不是标准的Java API,代码的可移 
植性难以保证。如果程序并不要求实现全双工的话,我认为利用文件操作不失为一 
个好办法。  

  

编辑 guty 

|
不一定,我的就可以

    
 
 

您可能感兴趣的文章:

  • Linux 中用java语言写串口程序,提示找不到串口
  • LINUX串口JAVA编程问题
  • LINUX下的JAVA串口通讯问题,如能解决,不胜感激
  • Java串口开发包 RXTX
  • java中如何实现串口读写?
  • java 中如何使用串口?
  • 用java可以串口通信方面的程序吗?
  • linux下用java访问串口问题
  • 怎样用JAVA语言实现对串口的操作?
  • 关于java串口api
  • 寻求java对串口操作的帮助
  • 如何用java在linux中读写串口啊?请高手指点
  • 请问谁做过在linux下用java开发串口通信程序,所用第三方jar包是rxtx
  • java串口问题
  • 关于JAVA写串口,在UNIX下的问题
  • 请教Java中的串口和USB编程问题
  • 用java在RedHat Linux4.0下开发串口程序的环境配置问题
  • java能否控制串口通讯?若能,如何实现?(急!30分)
  • 有谁了解java 串口通讯的啊
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: stringflavor定义及介绍
  • 我对JAVA一窍不通,可惜别人却给我一个Java的project,要我做一个安装程序,请问哪里有JAVA INSTALLER下载,而且我要不要安装java的sdk才能完成此项任务?
  • java命名空间java.security类keystore的类成员方法: getdefaulttype定义及介绍
  • 新年第一天,让我们讨论一下未来一年JAVA的发展趋势! 个人认为,JAVA将主要朝ERP和JAVA手机方面发展!
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getclasspath定义及介绍
  • 我想学Java,但不知道Java的实用的开发工具有那些,Java主要用在哪些方面,EJB到底是什么东西??
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: javaserializedobjectmimetype定义及介绍
  • redhat7.3下,java程序打印中文直接用java命令执行正常,用crontab执行java命令为乱码
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: javafilelistflavor定义及介绍
  • 各位学java的朋友,学java的未来是什么,你们学java都用来开发什么项目啊!来者给分!!
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getvmname定义及介绍
  • 请问java程序中的import为什么有的用java.….*,而有的又用java.….…,有什么区别吗?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3