Android中串口通讯的问题

    公司的项目是要做一个应用于工厂的一个物理网系统,android方面需要应用到串口通讯 .通过上网查询到Google官方api,当时为了快速,把这个demo 依赖了

 在application里面生成了getSerialPort() 函数,用来获取到SerialPort 对象 都是调用api中的 .so 文件中open函数。
 public SerialPort getSerialPort(String deviceName) throws SecurityException, IOException, InvalidParameterException {
        if (mSerialPort == null) {

            String packageName = getPackageName();
            SharedPreferences sp = getSharedPreferences(packageName + "_preferences", MODE_PRIVATE);
//            int baudRate = Integer.decode(sp.getString("BAUDRATE", "-1"));
            int baudRate = 9600;
            if ((deviceName.length() == 0) || (baudRate == -1)) {
                throw new InvalidParameterException();
            }

            mSerialPort = new SerialPort(new File(deviceName), baudRate, 0);
        }
        return mSerialPort;
    }

    public void closeSerialPort() {
        if (mSerialPort != null) {
            mSerialPort.close();
            mSerialPort = null;
        }
    }

然后可以写一个专门用于串口通讯的基类。
public abstract class SerialPortActivity extends AppCompatActivity {
    String TAG = "===== 串口通讯Activity界面 =";

    protected MyApp mApplication;
    protected SerialPort mSerialPort;
    protected OutputStream mOutputStream;
    private InputStream mInputStream;
    private ReadThread mReadThread;
    String deviceName = "/dev/ttyS1";

    private class ReadThread extends Thread {
        @Override
        public void run() {
            super.run();
            while (!isInterrupted()) {
                int size;
                try {
                    byte[] buffer = new byte[1024];
                    if (mInputStream == null) {
                        return;
                    }

                    size = mInputStream.read(buffer);

                    if (size > 0) {
                        onDataReceived(buffer, size);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                    return;
                }
            }
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mApplication = (MyApp) getApplication();

        try {
            mSerialPort = mApplication.getSerialPort(deviceName);
            mOutputStream = mSerialPort.getOutputStream();
            mInputStream = mSerialPort.getInputStream();

			/* Create a receiving thread */
            mReadThread = new ReadThread();
            mReadThread.start();

        } catch (SecurityException e) {
            Toast.makeText(mApplication, "您没有串口的读写权限", Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            Toast.makeText(mApplication, "您没有串口的读写权限", Toast.LENGTH_SHORT).show();
        } catch (InvalidParameterException e) {
            Toast.makeText(mApplication, "请先配置串口参数", Toast.LENGTH_SHORT).show();
        }

        Log.e(TAG, " 获取输入流 = " + mInputStream);
        Log.e(TAG, " 获取输出流 = " + mOutputStream);

    }

    protected abstract void onDataReceived(final byte[] buffer, final int size);

    @Override
    protected void onDestroy() {
        if (mReadThread != null) mReadThread.interrupt();
        mApplication.closeSerialPort();
        mSerialPort = null;
        super.onDestroy();
    }

}

通过log 打印出来的只要执行到了open()函数,并且输入输出流不为空 ,那串口通讯就基本完成,剩下的就是和单片机或者
串口模拟助手之间数据的交换了.


猜你喜欢

转载自blog.csdn.net/u011139062/article/details/78685762
今日推荐