Java串口通信编程指导
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java串口通信编程指导
Java串口通信编程
概述
在java中,利用Java Communication包能够操作串口,但官方的包在3.0之后就只支持Linux和Solaris平台了,Windows平台的只支持到98年出的2.0版本,只是在XP下还能使用。另外,也能够用开源的Rxtx实现串口通信,那个地点仅以Java Communication包,在Windows平台实现串口通信进行讲明。
前期预备
下载Java Communication包
下载地址如下:/Jolt/javacomm20-win32.zip。
配置
解压缩javacomm20-win32.zip
把win32com.dll拷贝到{JA V A_HOME}\jre\bin
把comm.jar拷贝到{JA V A_HOME}\jre\lib\ext
set CLASSPATH={JA V A_HOME}\jre \lib\ext \comm.jar;%classpath%
实现过程
要紧步骤包括:
获得串口标识
打开串口
设置串行端口通讯参数
猎取输入(出)流
进行读写操作
获得串口标识
指定串口的端口号,生成串口的标识类的实例。
a. 通过驱动决定通讯端口是可用的。
b. 打开通讯端口为了I/O操作。
c. 决定端口的拥有者。
d. 解析端口拥有者的争夺。
e. 治理事件显示在端口拥有者的中的状态改变。示例代码如下:
代码:
打开串口
示例代码如下:
代码:
5000(毫秒)是超时时刻。
设置串行端口通讯参数
设置串口传输的波特率、数据位、停止位、奇偶校验等参数。
示例代码如下:
代码:
try {
// 通信条件の設定
// 通信速度 9600 baud
// データビット 8bit
// ストップビット 1bit
// パリティなし
// フローコントロールの設定
// 無制御を使用
port.setSerialPortParams(9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
} catch (UnsupportedCommOperationException ex) {
ex.printStackTrace();
System.exit(1);
}
猎取输入(出)流
利用getInputStream()以及getOutputStream()从每个串口产生对应的输入输出流对象。
示例代码如下:
代码:
进行读写操作
写操作专门简单,只需要调用BufferedOutputStream的write()方法就能够了。
示例代码如下:
代码:
读操作,需要如下步骤:
继承SerialPortEventListener接口。
为SerialPort添加监听Listener。
实现该接口的serialEvent (SerialPortEvent event)方法。
通过BufferedReader的read()方法逐byte读取。因此也能够用readLine ()方法进行逐行读取。
示例代码如下:
代码:
protected BufferedOutputStream comWriter;
public SerialPortTerminal(String portName){
super(portName, "SerialPortTerminal");
try {
// SerialPortEvent を受け取るためのリスナの登録
port.addEventListener(this);
} catch(TooManyListenersException ex){
ex.printStackTrace();
System.exit(1);
}
// Data Available イベントを受け取るようにする
port.notifyOnDataAvailable(true);
try {
// RS-232C 入力用の Reader を生成
comReader = new BufferedReader(
new InputStreamReader(port.getInputStream()));
// RS-232C 出力用の Writer を生成
comWriter = new BufferedOutputStream(port.getOutputStream()); } catch (IOException ex){
ex.printStackTrace();
System.exit(1);
}
}
// イベント処理ルーチン
public void serialEvent(SerialPortEvent event) {
switch(event.getEventType()) {
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
// Data Available 以外のイベントは処理しない
break;
case SerialPortEvent.DATA_AVAILABLE:
// Data Available の処理
String buffer = null;
StringWriter strWriter = new StringWriter();
char[] c = new char[20];
int newData = 0;
int i = 0;
while (true) {
try {
newData = comReader.read();// 入力ストリームから読み込み if (newData == -1 || newData == 0x0d) {// CR
break;
}
c[i] = (char)newData;
if(i > 100){
break;
}
} catch (IOException ex) {
return;
}
i++;
}
try{
strWriter.write(c);
strWriter.flush();
buffer = strWriter.toString();