シリアル通信で受信したデータによる図の描写
RS-232Cのシリアル通信により受信したデータをもとに
appletに図を描写するプログラムを考えています。
まず受信したデータをコマンドプロンプトに出力することはできたのですがプログラムを改良して
受信データを用いてappletに図を描こうとしたところ
コンパイルはできたのですがappletで実行すると
コマンドプロンプトにエラーメッセージが表示され実行できませんでした。
プログラムは以下の通りです。
分かる方がおられたらご回答のほどよろしくお願いします。
import javax.comm.*;
import java.io.*;
import java.util.*;
import java.applet.Applet;
import java.awt.*;
public class SerialPortReader extends Applet implements SerialPortEventListener {
protected SerialPort port;
private InputStream is;
public int newData;
public void init(){
String portName = "COM6";
CommPortIdentifier portID = null;
try{
// COM6 のCommPortIdentifier を取得
portID = CommPortIdentifier.getPortIdentifier(portName);
}catch(NoSuchPortException ex){
ex.printStackTrace();
System.exit(1);
}
try{
//ポートのオープン
port = (SerialPort)portID.open("SerialPortWriter", 5000);
}catch(PortInUseException ex){
ex.printStackTrace();
System.exit(1);
}
try {
// 通信速度などの通信条件の設定
port.setSerialPortParams(9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
port.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN
| SerialPort.FLOWCONTROL_RTSCTS_OUT);
} catch (UnsupportedCommOperationException ex){
ex.printStackTrace();
System.exit(1);
}
try {
// SerialPortEvent を受け取るためのリスナの登録
port.addEventListener(this);
} catch(TooManyListenersException ex){
ex.printStackTrace();
System.exit(1);
}
// Data Available イベントを受け取るようにする
port.notifyOnDataAvailable(true);
try {
//COM6ポートから入力ストリームを取得する
is = port.getInputStream();
} catch (IOException ex){
ex.printStackTrace();
System.exit(1);
}
}
//受信データの大きさの円を描く
public void paint(Graphics g) {
g.fillOval(50, 50 , newData , newData);
}
// SerialPortEvent 処理ルーチン
public void serialEvent(SerialPortEvent event) {
newData = 0;
switch(event.getEventType()) {
case SerialPortEvent.BI:
case SerialPortEvent.OE:
case SerialPortEvent.FE:
case SerialPortEvent.PE:
case SerialPortEvent.CD:
case SerialPortEvent.CTS:
case SerialPortEvent.DSR:
case SerialPortEvent.RI:
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
// Data Available 以外のイベントは処理しない
break;
case SerialPortEvent.DATA_AVAILABLE:
while (newData != -1) {
try {
//入力ストリームから次のバイトデータを読み込む
newData = is.read();
//十進数のアスキーコードから0~9の整数に変換
newData = newData - 48;
//受信データを元にグラフ表示
repaint();
//入力ストリームからバイトデータがなくなったら処理を終える
if (newData == -1) {
break;
}
} catch (IOException ex) {
System.err.println(ex);
return;
}
}
break;
}
}
}