PC の通常のシリアル ポートを使用して、Java アプリケーションでデータを送受信しています。PC は Java 1.6.0 で Windows XP SP3 を実行します。コードは次のとおりです。
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.util.concurrent.ArrayBlockingQueue;
// Open the serial port.
CommPortIdentifier portId;
SerialPort serialPort;
portId = CommPortIdentifier.getPortIdentifier("COM1");
serialPort = (SerialPort) portId.open("My serial port", 1000 /* 1 second timeout */);
serialPort.setSerialPortParams(115200, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
// Set up input and output streams which will be used to receive and transmit data on the UART.
InputStream input;
OutputStream output;
input = serialPort.getInputStream();
output = serialPort.getOutputStream();
// Wrap the input and output streams in buffers to improve performance. 1024 is the buffer size in bytes.
input = new BufferedInputStream(input, 1024);
output = new BufferedOutputStream(output, 1024);
// Sync connection.
// Validate connection.
// Start Send- and Receive threads (see below).
// Send a big chunk of data.
データを送信するために、キュー (ArrayBlockingQueue) からパッケージを取得して UART で送信するスレッドをセットアップしました。受信についても同様です。アプリケーションの他の部分は、単純にパッケージを送信キューに挿入し、受信キューをポーリングして応答を取得できます。
private class SendThread extends Thread {
public void run() {
try {
SendPkt pkt = SendQueue.take();
// Register Time1.
output.write(pkt.data);
output.flush();
// Register Time2.
// Put the data length and Time2-Time1 into an array.
// Receive Acknowledge.
ResponsePkt RspPkt = new ResponsePkt();
RspPkt.data = receive(); // This function calls "input.read" and checks for errors.
ReceiveQueue.put(RspPkt);
} catch (IOException e) { ... }
}
各送信パケットは最大 256 バイトで、転送には 256*8 ビット / 115200 ビット/秒 = 17,7ms かかります。
Time2-Time1 の測定値、つまり送信時刻を配列に入れ、後で確認します。256 バイトの転送には転送に 15 ミリ秒かかる場合があることがわかりました。これは、理論上の最小値に近いため、問題ないようです。理論よりも実際に高速である理由はわかりません。ただし、問題は、256 バイトの転送に 32 ミリ秒、つまり必要な時間の 2 倍かかる場合があることです。何が原因でしょうか?
/ヘンリック