RS232通信時にフリーズ

421 views
Skip to first unread message

AS

unread,
Dec 25, 2014, 7:21:28 AM12/25/14
to android-g...@googlegroups.com
いつもお世話になります.

現在Android4.1.1のタブレットを使用して、外部機器とRS232で通信・制御するアプリを作成しています.

シリアルポートはFTDriverを使用させていただいて制御しています.

通信のプログラムなどを作成しテスト動作させていると、たまにOS自体がフリーズしてしまう現象に遭遇してしまいました.
アプリの背景色のみになり(ButtonやTextViewが全て表示されなくなる)、ホームボタンなどをタップしても動作せず、OSを再起動するしかない状況になります.
自作のアプリを起動していない状態では上記のような現象は発生しません.
Logcatでモニタリングしていますが、運が悪く、フリーズ発生時に限ってADBの接続を切断していたため、エラーの発生の有無などは確認できていません.
データ受信時の割り込み処理が衝突してフリーズしているのかと思いましたが、知識がなく判断しかねる状況です.
以下に、受信時の処理を記載します.

問題の解決について何かご助言があれば、何卒宜しく御願い致します.

  //activityの先頭部に記載
  public short d_c;

     //受信データの処理
     Runnable mLoop = new Runnable() {
        @Override
        public void run() {
  
            int len;
            
            byte[] rbuf = new byte[4096];
            int[] is = new int[256];
            
            for (;;) {

                len = mSerial.read(rbuf);//受信データ数の取得
                
                rbuf[len] = 0;
                
       //受信データ数が0でないなら処理実施
                if (len > 0) {

           for (int i=0; i < len ;i++){
               
                //受信データをバッファにコピー
                is[d_c] = rbuf[i];
               
                // \r 受信でコマンド解析処理開始
                if(is[d_c] == 13){
                                      //受信データによる処理実行
              }
                          }

                          mHandler.post(new Runnable() {
                             public void run() {
                                 //この部分でGUIを操作
                             }
                     });
             }

                  }
            }

Tsuneo Koki

unread,
Dec 27, 2014, 11:38:12 PM12/27/14
to android-g...@googlegroups.com
受信バッファーのオーバーフロー処理が入っていませんので、ヒープメモリーに確保した配列にデータを書き込む処理の中で、配列範囲外のメモリーエリアに書き込みが行われ、OSで管理しているデータの一部が破損したためと推測されます。

多分、RS232からくるデータが少ないか、アプリで処理できている時は問題無く、受信バッファーにある程度データが溜まってから当該サブルーチンが呼び出された場合に、ハングアップが起きやすいと思われます。

AS

unread,
Dec 29, 2014, 11:08:13 PM12/29/14
to android-g...@googlegroups.com
Tsuneo Koki様
ご回答ありがとうございます.
ご指摘の通り、確かにオーバーフロー処理を記載することを忘れておりました.
オーバーフロー時に同じようにOSが固まるかどうかを下記のようなコードで何度か試してみたところ
Exceptionが発生してアプリが落ちることは確認出来ましたが、OSが固まるようなことには
なりませんでした.

int[] is = new int[256];
is[300] = 1;

また、Logcatでのログを行っていたのですが、固まる前にエラーは一切出ずに、「Debbug is disconnected」のみ表示されていました.
また、メモリの使用量も12MB程度でした.

なにか他に考えられる原因はございませんでしょうか?

Reply all
Reply to author
Forward
0 new messages