シリアル通信で受信したデータによる図の描写

このQ&Aのポイント
  • RS-232Cのシリアル通信により受信したデータをもとにappletに図を描写するプログラムを考えています。
  • 受信したデータをコマンドプロンプトに出力することはできたのですがプログラムを改良して受信データを用いてappletに図を描こうとしたところ、コンパイルはできたのですがappletで実行するとコマンドプロンプトにエラーメッセージが表示され実行できませんでした。
  • プログラムは以下の通りです。分かる方がおられたらご回答のほどよろしくお願いします。
回答を見る
  • ベストアンサー

シリアル通信で受信したデータによる図の描写

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; } } }

  • Java
  • 回答数3
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.2

java.security.SecureClassLoaderのエラーのようなので、このアプレットに下のようなmain()を付けてローカルアプリケーションとして動かしてみて動けば、無署名アプレットはセキュリティ上の理由により、クライアントのシリアルポートにアクセスできないという結論になるでしょう。すでに、ローカルアプリケーションとしては動かして見られたのかな? ------------------------------------------------- public static void main(String[] args){ SerialPortReader spr = new SerialPortReader(); Frame frame = new Frame(); frame.setSize(600, 600); frame.add(spr); frame.setVisible(true); spr.init(); } -----------------------------------------------

minority64
質問者

お礼

何度もご回答いただきありがとうございます。 教えていただいたmain文を追加したところアプリケーションにて 実行することができました。 本当にありがとうございました!

その他の回答 (2)

  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.3

そ、そ、そ、それとも、アプレットを動かしているクライアントのJavaに、javax.commがない?

  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.1

> エラーメッセージが表示され実行できませんでした どんなエラーメッセージですか?。それがいちばん重要な診断情報です。 メッセージの全文、そしてソースの行番号などを示していたら、それがどの行かも教えてください。

minority64
質問者

補足

ご回答ありがとうございます。 説明が不足していて申し訳ありませんでした。 表示されたメッセージは以下の通りです。 よろしくお願いします。 at java.lang.NoClassDefFoundError: javax/comm/SerialPortEventListener at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:620) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124) at sun.applet.AppletClassLoader.findClass(AppletClassLoader.java:178) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.applet.AppletClassLoader.loadClass(AppletClassLoader.java:127) at java.lang.ClassLoader.loadClass(ClassLoader.java:251) at sun.applet.AppletClassLoader.loadCode(AppletPanel.java:618) at sun.applet.AppletPanel.createApplet(AppletPanel.java:780) at sun.applet.AppletPanel.runLoader(AppletPanel.java:709) at sun.applet.AppletPanel.run(AppletPanel.java:363) at java.lang.Thread.run(Thread.java:619)

関連するQ&A

  • VB2010で、シリアル通信をするには

    VB2010で、シリアル通信をするには シリアルポートをopenしようとすると、エラーで弾かれてしまいます。 どのように対処したら良いですか? 使っているソースコードは、下記の通り。 Private Sub ButtonRsStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonRsStart.Click Try '例外処理のはじまり If SerialPort1.IsOpen = True Then 'ポートはオープン済み MessageBox.Show("すでに" & SerialPort1.PortName & "は接続されています。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End If SerialPort1.PortName = "COM1" 'オープンするポート名を格納 SerialPort1.Open() 'ポートオープン PORT_STATE.Text = "OPEN" Catch ex As Exception '例外処理 MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End Sub --------------- エラーが発生する場所は、「Catch 」になります。 エラーメッセージは、「ポート 'COM1' へのアクセスが拒否されました。」です。 何が原因なのか、さっぱり分かりません。 ヒントになりそうな解答を頂けないでしょうか?

  • C# シリアル通信でデータ受信時の欠損について

    Visualstudio 2013 を使用して C# で開発を行っています。 SerialPort Classを使用してデータの送受信をするプログラムを作成しているのですが、 非同期でデータを受信する際にどうしてもうまくデータを取得出来ません。 5Byteのデータは正常に取得できるのですが、 その直後にくる40Byteのデータは、真ん中あたりの10数Byteや最後の10数Byteしか取れません。 serialPort.DataReceived に登録したイベント関数の中身です。 -------------------------------------------------------------------------------------- private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { bytesRead = 0; // Initialize a buffer to hold the received data byte[] buffer = new byte[this.serialPort.ReadBufferSize]; try { bytesRead = this.serialPort.Read(buffer, 0, buffer.Length); if (true == serialPort.IsOpen) { serialPort.DiscardInBuffer();//受信バッファをクリアする } } catch (Exception ex) { DataLog.Exception(ex); } //派生クラス用の処理 DeviceClassEventArgs _DeviceClassEventArgs = new DeviceClassEventArgs(buffer, bytesRead); DeviceClassEvent(this, _DeviceClassEventArgs); } -------------------------------------------------------------------------------------- ネットの情報を参考に、 ReceivedBytesThreshold の値を期待するデータ量に逐一変えることで とりあえず正常に取ることが出来たのですが、これでいいのでしょうか? 期待するデータ量がわからなかった場合は使えないのかなとも思います。 データが欠損してしまう理由、 上記の対処法以外の一般的な対処法など有りましたら教えて下さい。 その他参考になるページ等ありましたら教えていただけると大変助かります。

  • シリアル受信データをファイルに書き出したい

    マイコンとPCをCOMポートで通信し、受信データをファイルに書き出したいのです。 やってみたこと1.と2.の間を埋める技術についてアドバイスをお願いします。 1.キーボード入力したテキストボックスの内容をファイルに書き出す ⇒書けました、OK     Dim xxx As New System.IO.StreamWriter("e:xxx.txt", False, System.Text.Encoding.Default) xxx.WriteLine(TextBox1.Text) xxx.Close() 2.サンプルコードでシリアル通信 ⇒受信データがテキストボックスに表示されました、OK     以下サイトを参考に勉強中、テキストボックス部分を抜粋させて頂きます     (http://www.kana-soft.com/tech/sample_0008_4.htm#1) 3.2.で表示されたテキストボックスの内容を、1.のように書き出したいのですが   上手くいきません。'■から'■間に xxx.WriteLine(RcvTextBox.Text) 書いてみましたが   e:xxx.txtは作成されません。delegate、invokeの理解不足が原因かと思うのですが、   調べ回るうちに・・・限界みたいです。(^_^;) (抜粋) '===== Private Delegate Sub Delegate_RcvDataToTextBox( data As String ) '===== Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived Try '受信データを読み込む. Dim data As String data = SerialPort1.ReadExisting() '受信したデータをテキストボックスに書き込む. Dim args(0) As Object args(0) = data Invoke(New Delegate_RcvDataToTextBox(AddressOf Me.RcvDataToTextBox), args) Catch ex As Exception MsgBox( ex.Message ) End Try End Sub '===== Private Sub RcvDataToTextBox( data As String ) '受信データをテキストボックスの最後に追記する. If IsNothing( data ) = False Then RcvTextBox.AppendText( data ) End If '■     Dim xxx As New System.IO.StreamWriter("e:xxx.txt", False, System.Text.Encoding.Default) xxx.WriteLine(RcvTextBox.Text) xxx.Close()     '■ End Sub ===== 以上、駄目出しをよろしくお願いします。

  • C#とマイコンでSCI通信

    マイコンとC#で仮想COMポートを使ってSCI通信しているんですが、 ・「マイコン⇒C#」でデータを受信するときは、  正常に受信でき、 「C#⇒マイコン」がデータを受信するときは    正常に受信できません。 ・C#から何を送っても0x0aの値しかマイコンが受け取りません。 (TeraTermからは正常な値を受け取っています) 以上の点から、C#の送信プログラムの中身が悪いと思うのですが、 C#は初めて手をつけたのでよくわかりません。 送信にはWriteLine()関数を使っています serialPort1.WriteLine("a"); このような感じで一文字一文字送り、マイコンでLCDに表示させ結果を見ています。 シリアルポートの設定は次のように行っています try { beginTime = DateTime.Now; //←プログラムの関係上いれてるだけです this.serialPort1.PortName = this.textBox2.Text; this.serialPort1.BaudRate = 9600; this.serialPort1.Parity = System.IO.Ports.Parity.None; this.serialPort1.DataBits = 8; this.serialPort1.StopBits = System.IO.Ports.StopBits.One; serialPort1.Open(); serialPort1.DtrEnable = true; serialPort1.RtsEnable = true; } catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } COMポートに関してはFormに別途ボタンを作りそこから選択するようにしています。 どこが悪いのか概要だけでも教えてほしいください;; よろしくおねがいしますm(__)m

  • visual c# 2010 シリアル通信アプリ

    http://www.kana-soft.com/tech/sample_0007.htm のサイトを参考に、マイコンとのシリアル通信評価に使うPCのアプリケーションを visual c# 2010で作っています。 一応データを受け取るようになったのですが、 63H 62H 61H 00H (アスキーコードだと"cba<null>") というデータを送っているはずなのですが、 扣a というデータが受信されてしまいます。 正しく受信するにはどうすれば良いでしょうか。 (該当していそうな部分のソースです) : : /****************************************************************************/ /*! * @brief データ受信が発生したときのイベント処理. * * @param [in] sender イベントの送信元のオブジェクト. * @param [in] e イベント情報. * * @retval なし. */ private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { //! シリアルポートをオープンしていない場合、処理を行わない. if (serialPort1.IsOpen == false) { return; } try { //! 受信データを読み込む. string data = serialPort1.ReadExisting(); //! 受信したデータをテキストボックスに書き込む. Invoke(new Delegate_RcvDataToTextBox(RcvDataToTextBox), new Object[] { data }); } catch (Exception ex) { MessageBox.Show(ex.Message); } } /****************************************************************************/ /*! * @brief 受信データをテキストボックスに書き込む. * * @param [in] data 受信した文字列. * * @retval なし. */ private void RcvDataToTextBox(string data) { //! 受信データをテキストボックスの最後に追記する. if (data != null) { rcvTextBox.AppendText(data); } }

  • vb2005で受信関数を以下の作成しています。

    vb2005で受信関数を以下の作成しています。 Private Sub r_SerialPort1_DataReceived(ByVal sender As Object, _  ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) _  Handles SerialPort1.DataReceived  Dim tmp As Integer  Try   tmp = SerialPort1.BytesToRead '受信バイト数取得 SerialPort1.Read(s_RxBuff, s_RxCont, tmp) 'データ読込み s_RxCont = s_RxCont + tmp '受信バイト数更新  Catch ex As Exception s_Status = c_ErrTRP 'ポートエラー(受信) End Try End Sub この関数で割込みが入るのですが、tmp=の所でbreakし読出そうとしてSerialPort1をウォッチすると、 "ポートは閉じられています"と表示されていて、Catch方向に進むのですが、何故こんなことが起こるのでしょうか? 宜しくお願いします。

  • 'Button1を押したらポートオープン

    'Button1を押したらポートオープン Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 'シリアルポートを設定。 SerialPort1.PortName = SerialPortComboBox.Text SerialPort1.BaudRate = SerialBpsComboBox.Text Select Case SerialParityComboBox.Text Form3.SerialPort1.Parity = IO.Ports.Parity.None 'データ長 SerialPort1.DataBits = SerialDataBitsComboBox.Text 'RTSラインを有効にする SerialPort1.RtsEnable = True '送信タイムアウト SerialPort1.WriteTimeout = 3000 Try 'ポートをオープン SerialPort1.Open() 'いざ送信 'SerialPort1.Write(Chr(&HC)) 'ケーブルが外れた場合などのタイムアウトエラーなら、 Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Critical, "シリアル通信エラー") SerialPort1.Close() Exit Sub End Try '送信バッファが空になるまで待って、 While SerialPort1.BytesToWrite > 0 My.Application.DoEvents() End While ''''''''''''文字送信 'シリアルポート送信データをSJISに指定 SerialPort1.Encoding = System.Text.Encoding.GetEncoding(932) Dim Settei As String '送信文字代入 Settei = "A.1=" & vbCrLf 'いざ送信 SerialPort1.Write(Settei) '送信バッファが空になるまで待って、 While SerialPort1.BytesToWrite > 0 My.Application.DoEvents() End While End Sub '文字受信 Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived Dim strDataReceived As String Dim add As New AddDataDelegate(AddressOf AddData) Try strDataReceived = SerialPort1.ReadLine Catch ex As Exception strDataReceived = ex.Message End Try TextBox1.Invoke(add, strDataReceived) End Sub ///////// 文字を送信した後に相手から帰ってきます。 送信した後の受信の部分ですが、これで正しいか教えて頂きたいです。

  • VB2010から外部機器へのシリアル通信によるデー

    VB2010をのserialport機能を用いて,外部機器にデータを送るプログラムを作成しています。 外部機器から送信されてきたデータの受信は問題なくできましたが,PCからの送信がうまく出来ません。 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click If TextBox2.Text.Length = 0 Then MessageBox.Show("送信文字列を入力してください", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error) TextBox2.Focus() Exit Sub End If Try SerialPort1.WriteLine(TextBox2.Text) Catch ex As Exception MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End Sub プログラムは上記のようになります。(microsoftのサンプルそのままです。) 上記のプログラムで 数字の「1」を送信したいのですが,うまく送ることができません。 外部機器は,データが送信されたことは感知していますが, 「1」 が送られたことは認識できていないようです。 serialdebug2というソフトを使用して,「1」 を送信した場合は,問題ありませんでした。 どうすれば,上記のような問題を解決できるdしょうか?

  • カードリーダーのデータ受信方法

    統合開発環境ソフト:Microsoft Visual Studio 2010 Express OS:windowsXP 言語:Visual Basic 上記環境で磁気カードを読み込んだカードリーダのデータをUSBにつないで、パソコンに送信し、パソコンのソフト側で受信するソフトを作りたいと思っているのですが、カードリーダでデータの方が送信されず、アドバイスいただければと思い質問させていただきました。 ネットで調べながらテキストボックスに書いたポート番号を開いて、その後、リーダーで送信するという動きをさせようと、以下のようなソースを書いてみたのですが、データが送信されません。 磁気リーダ(アメリカ製)のプログラマーズマニュアルを調べてみたところ、 Upload Data 1. ID-e will send the first record and wait for an <ACK > (hex code: 06h) to send the next one or a NAK (hex code: 15h) to resend the record. と書いており、プログラム側で「ACK」というデータを送信しないとリーダーが送信を開始しないのかと思ったのですが、どのようにすればいいのか調べても解りませんでした。 他にも抜けていることがあるのかも知れませんが、お気づきの点ございましたら、ご教授いただけると幸いです。 また、参考までに作ったプログラムの実行時の画面を添付いたします。 尚、ポートの設定は磁気カードリーダのマニュアルの記載通り Baud rate: 19200 Parity: None Data bit: 8 Stop bit: 1 としております。 ただ、 Hardware flow control: None という記載があるのですが、どこで設定すればいいのかわからないため、変更しておりません。 よろしくお願いいたします。 ------------------------------------------------------------------------ Public Class Form1 Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click Try If SerialPort1.IsOpen = True Then Exit Sub End If SerialPort1.PortName = TextBox1.Text SerialPort1.Open() Catch ex As Exception MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try SerialPort1.RtsEnable = True End Sub Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click If SerialPort1.IsOpen = True Then SerialPort1.Close() End If End Sub Delegate Sub DataDelegate(ByVal sdata As String) Private Sub PrintData(ByVal sdata As String) TextBox2.Text = sdata End Sub Private Sub SerialPort1_DataReceived() Dim ReceivedData As String = " " Try ReceivedData = SerialPort1.ReadLine Catch ex As Exception ReceivedData = ex.Message End Try Dim adre As New DataDelegate(AddressOf PrintData) Me.Invoke(adre, ReceivedData) End Sub End Class

  • VB2010 シリアル受信した情報を表示する

    VB2010 シリアル受信した情報を表示する フォームが表示されたらポートを開けてテキストボックスに文字を表示させたいです。 送られてくる情報はSTXとETXで挟まれた数十文字のアスキー文字です。 フォーム表示中は、teratermやハイパーターミナルで接続不可エラーが出ますし その逆でteratermやハイパーターミナルで接続している時にはcomポートエラーが出ます。 teratermやハイパーターミナルではシリアルで受信した文字が表示されています。 そのような状況で下記、シンプルなコードを作りましたが表示されません。 テキストボックスが何も変化しない状態です。なんでもいいので、テキストボックスに受信した情報を出してみたいです。 http://msdn.microsoft.com/ja-jp/library/cc720852.aspx を参考に受信部分に使っています。 Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Call SerialPort1.Open() End Sub Delegate Sub AddDataDelegate(ByVal str As String) Private Sub AddData(ByVal str As String) TextBox1.Text = TextBox1.Text + str End Sub Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived Dim strDataReceived As String Dim add As New AddDataDelegate(AddressOf AddData) Try strDataReceived = SerialPort1.ReadLine Catch ex As Exception strDataReceived = ex.Message End Try TextBox1.Invoke(add, strDataReceived) End Sub End Class

専門家に質問してみよう