这里还有个例子 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)。这样是不能够实现全双工通讯的。不知道有没有做过的大侠能够讲讲处理的办法。/* * * 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) * [email protected] * */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(); } }/* * * 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) * [email protected]* */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); } } }/* * * 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) * [email protected] * */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) {} } } /* * * 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) * [email protected]* */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(); } } /* * * WriteSerial.java 1.0 * Program to send a character to the serial port * * 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) * [email protected] * */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. *
http://www-900.ibm.com/developerWorks/cn/java/joy-comm/index.shtml
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)。这样是不能够实现全双工通讯的。不知道有没有做过的大侠能够讲讲处理的办法。/*
*
* 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)
* [email protected]
*
*/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();
}
}/*
*
* 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)
* [email protected]*
*/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);
} }
}/*
*
* 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)
* [email protected]
*
*/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) {}
}
}
/*
*
* 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)
* [email protected]*
*/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();
}
}
/*
*
* WriteSerial.java 1.0
* Program to send a character to the serial port
*
* 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)
* [email protected]
*
*/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. *