|
|
| 使用Java读取串口的程序 |
作者:未知
文章来源:www.jspcn.net
访问次数:429次
加入时间:2005年01月19日
|
|
下是我写的用Java读取串口的程序。这个程序里面还有一些问题,也希望有经验的网友能够给我提点意见。
这个简单的程序包括以下文件:
IMU.java (主程序) ReadBuffer.java (从缓冲区读取一个消息) ReadSerial.java (读取串口数据并放入缓冲区) SerialBuffer.java (缓冲区) WriteSerial.java (不断的往串口送星号´*´)
测试程序:
SendCom.java (将一个数据文件往串口发送) SEND.TXT (供测试用的数据文件)
在这个通讯程序中使用了一个简单的协议,既不同的消息之间用星号´*´作为分隔。这个程序中的问题是ReadSerial进程和WriteSerial进程不能够同时启动,出错信息是不能够打开串口,因为同样一个串口不能够同时被打开两次(在ReadSerial中声明了FileReader
测试程序:
SendCom.java (将一个数据文件往串口发送) SEND.TXT (供测试用的数据文件)
在这个通讯程序中使用了一个简单的协议,既不同的消息之间用星号´*´作为分隔。这个程序中的问题是ReadSerial进程和WriteSerial进程不能够同时启动,出错信息是不能够打开串口,因为同样一个串口不能够同时被打开两次(在ReadSerial中声明了FileReader和在WriteSerial中声明了FileWriter)。这样是不能够实现全双工通讯的。 ------------------------------------------ import java.io.*;
class IMU { public static void main(String[] args) { //TO DO: Add your JAVA codes here
File ComPort = new File("COM1");
SerialBuffer SB = new SerialBuffer(); ReadSerial r1 = new ReadSerial(SB, ComPort); ReadBuffer r2 = new ReadBuffer(SB); WriteSerial r3 = new WriteSerial(ComPort);
r1.start(); r2.start(); r3.start(); } } --------------------------------------------- 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); }
} } ----------------------------------------------- import java.io.*;
public class ReadSerial extends Thread { private SerialBuffer ComBuffer; private File ComPort;
public ReadSerial(SerialBuffer SB, File Port) { ComBuffer = SB; ComPort = Port; }
public void run() { int c; try { FileReader in = new FileReader(ComPort); while (true) { c = in.read(); ComBuffer.PutChar(c); } try { FileReader in = new FileReader(ComPort); while (true) { c = in.read();
ComBuffer.PutChar(c); } } catch (IOException e) {} } } ------------------------------------------------ public class SerialBuffer { private String Content = ""; private String CurrentMsg, TempContent; private boolean available = false;
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; }
public synchronized void PutChar(int c) { Character d = new Character((char) c); Content = Content.concat(d.toString()); if (c == ´*´) { available = true; } notifyAll(); } } ------------------------------------------------- import java.io.*;
public class WriteSerial extends Thread { private SerialBuffer ComBuffer; private File ComPort;
public WriteSerial(File Port) { ComPort = Port; }
public void run() { int c; try { FileWriter out = new FileWriter(ComPort); while (true) { out.write(´*´); } } catch (IOException e) { System.out.println(e.getMessage()); } } } ----------------------------------------------- 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. *
|
|
|