Android USB转串口接收错误

时间:2013-11-02 04:50:51

标签: java android multithreading serial-port usb

我目前正致力于在Android上编写应用程序以与Arduino Board进行交互。我能够将串行数据发送到我的Arduino就好了,但是当我开始尝试接收数据时,我的应用程序在启动时崩溃。

我目前已将其设置为一个文本字段从用户获取数据,并发送到Arduino,Arduino执行一项功能。

对于我的收到,我正在创建一个新线程,以不断收听来自Arduino的数据。每当执行此线程中的代码时,它就会崩溃。

我使用此库作为我的基础:https://github.com/mik3y/usb-serial-for-android

以下是该应用提供的其他功能的所有相关代码,省略代码,这些代码是未实现的:

import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;



import com.hoho.android.usbserial.driver.UsbSerialDriver;


import android.hardware.usb.UsbManager;
import android.content.Intent;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.content.Context;
import android.util.Log;
import com.hoho.android.usbserial.driver.UsbSerialProber;




     public class MainActivity extends Activity implements SensorEventListener, LocationListener{

private EditText sendTextField;
    TextView uartRX;

 public Handler Handler; 


UsbManager manager;



/** Called to create application activity*/
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);



    uartRX = (TextView)findViewById(R.id.rxUART);

    sendTextField = (EditText) findViewById(R.id.sendTextField);






    Handler = new Handler() { 
        @Override public void handleMessage(Message msg) { 
        String text = (String)msg.obj; 
        uartRX.append(text); 




        } 
        };


        Thread t = new Thread(new Runnable() {
             public void run()
             {
                 Message msg = new Message(); 
                    msg.obj = "Start Serial Listen\n"; 
                    Handler.sendMessage(msg);
                 rxUART();
             }

            public void rxUART()
            {

                manager = (UsbManager) getSystemService(Context.USB_SERVICE);
                UsbSerialDriver rxDriver = UsbSerialProber.acquire(manager);
                if (rxDriver != null) {
                      try {
                          rxDriver.open();
                    } catch (IOException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                }


                int byteSize = 0;
                String data = "";
                while(true)
                {
                byte[] arr = null;
                try {
                    rxDriver.setBaudRate(115200);
                    rxDriver.read(arr, byteSize);
                    data = new String(arr);
                    Message msg = new Message(); 
                    msg.obj = data; 
                    Handler.sendMessage(msg);

                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                }
            }

    });
    t.start();

    }


public void sendUART(String data)
{
    manager = (UsbManager) getSystemService(Context.USB_SERVICE);
    // Find the first available driver.
    UsbSerialDriver driver = UsbSerialProber.acquire(manager);
    if (driver != null) {
          try {
            driver.open();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
          try {
            driver.setBaudRate(115200);

            byte buffer[] = new byte[16];
            int numBytesRead = driver.read(buffer, 1000);
            Log.d(TAG, "Read " + numBytesRead + " bytes.");


            byte temp[] = data.getBytes();

            driver.write(temp, 16);

          } catch (IOException e) {
            // Deal with error.
          } finally {
            try {
                driver.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block

                e.printStackTrace();
            }
          } 
        }



}
   public void onClickSendBtn(View v)
    {
       String data = "";
       data = sendTextField.getText().toString();
       sendUART(data);
       sendTextField.setText(" ");
    } 

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}







  }

任何人都可以帮我弄清楚为什么应用程序崩溃了在线程中创建的代码?

注意:代码在不在线程中时也会崩溃。 Code最初是sendUART()调用的函数,用于检查响应。没有(真实)。

logcat的:

   11-02 09:49:22.988: E/AndroidRuntime(22652): FATAL EXCEPTION: Thread-964
   11-02 09:49:22.988: E/AndroidRuntime(22652): java.lang.NullPointerException
   11-02 09:49:22.988: E/AndroidRuntime(22652):     at       com.example.sensortest.MainActivity$2.rxUART(MainActivity.java:143)
   11-02 09:49:22.988: E/AndroidRuntime(22652):     at com.example.sensortest.MainActivity$2.run(MainActivity.java:119)
   11-02 09:49:22.988: E/AndroidRuntime(22652):     at java.lang.Thread.run(Thread.java:856)

引用的行号是:

           Thread t = new Thread(new Runnable() {
             public void run()
             {
                 Message msg = new Message(); 
                    msg.obj = "Start Serial Listen\n"; 
                    Handler.sendMessage(msg);
                 rxUART();
             }

            public void rxUART()
            {

                manager = (UsbManager) getSystemService(Context.USB_SERVICE);
                UsbSerialDriver rxDriver = UsbSerialProber.acquire(manager);
                if (rxDriver != null) {
                      try {
                          rxDriver.open();
                    } catch (IOException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                }


                int byteSize = 0;
                String data = "";
                while(true)
                {
                byte[] arr = null;
                try {
                    rxDriver.setBaudRate(115200);
                    rxDriver.read(arr, byteSize);
                    data = new String(arr);
                    Message msg = new Message(); 
                    msg.obj = data; 
                    Handler.sendMessage(msg);

                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                }
            }

    });
    t.start();

1 个答案:

答案 0 :(得分:1)

您无法正确处理rxDriver == null中的案例rxUart()

if()语句仅跳过open()来电,但while()循环执行时rxDriverNULL,导致NPE。你在`sendUART(),btw。

中遇到了同样的问题