发新帖

[原创] 【Raspberry Pi 3 开发板 试用体验】AndroidThings简易串口App

[复制链接]
发表于 2017-9-25 10:37:35
| 192 查看 | 0 回复
最近光顾着研究蓝牙去了,却忽略了更常用、更简单的串口。看了别人的试用之后突然意识到AndroidThings的串口也是会用的上的。因为有计划做一下DHT11的驱动,但是DHT11对延时精度有非常高的要求,之前用Go实现都会出现读取失败的情况,更慢的Java更难说了,所以可能有部分传感器需要通过其他开发版来配合AndroidThings使用,那用串口来传递数据最合适不过了。

DHT11的驱动有一些不确定因素,延后一下吧。而且手上没有逻辑分析仪,如果出问题只能靠猜,正在考虑要不要买一个逻辑分析仪玩玩。所以,还是先研究一下比较有把握的串口更可靠一些。

AndroidThings的串口操作比较简单,相信不少人都用过串口、还有串口调试工具,有了AndroidThings的UI,我们自己实现图形界面的串口调试工具就非常简单了。

串口操作和GPIO操作基本类似,GPIO使用的是Gpio类,串口使用的是UartDevice类,这两者都是通过PeripheralManagerService来获取的。在取得串口device之后可以通过如下函数来对串口进行配置,设置波特率、终止位等。
  1. PeripheralManagerService manager = new PeripheralManagerService();
  2. try {
  3.     mDevice = manager.openUartDevice("UART0");
  4.     mDevice.setBaudrate(115200);
  5.     mDevice.setDataSize(8);
  6.     mDevice.setParity(UartDevice.PARITY_NONE);
  7.     mDevice.setStopBits(1);

  8.     mDevice.registerUartDeviceCallback(mUartCallback);
  9. } catch (IOException e) {
  10.     Log.w(TAG, "Unable to access UART device", e);
  11. }
复制代码


串口的读写也很简单,只要通过UartDevice的read、write函数即可。因为串口不一定随时有数据传输过来,UartDevice还提供了UartDeviceCallback,当有数据发送到串口时,onUartDeviceDataAvailable就会被调用,我们就不用去考虑数据什么时候来了。

在了解这些函数之后写一个简易的串口App就不是什么难事了。大概的功能是用户输入要发送的数据,点击发送按钮之后就发送给串口。另外还有一个TextView用来显示串口接收到的数据。目前只能按ASCII字符来发送、传输数据,所以就叫做简易串口App了。

点击按钮的事件处理如下:
  1. Button btnSend = (Button)findViewById(R.id.button);
  2. btnSend.setOnClickListener(new View.OnClickListener() {
  3.     @Override
  4.     public void onClick(View view) {
  5.         Log.i(TAG, "onClick: Led on!");
  6.         if (mDevice != null && mEditText.getText().length() > 0) {
  7.             try {
  8.                 String data = mEditText.getText().toString() + "\n";
  9.                 byte[] buffer = data.getBytes();
  10.                 int count = mDevice.write(buffer, buffer.length);
  11.                 Log.d(TAG, "Wrote " + count + " bytes to peripheral");
  12.             } catch (IOException e) {
  13.                 e.printStackTrace();
  14.             }
  15.         }
  16.     }
  17. });
复制代码

UartDeviceCallback如下定义,在数据可用时调用了readUartBuffer,callback在配置串口的时候已经设置过了。
  1. UartDeviceCallback如下定义,在数据可用时调用了readUartBuffer,callback在配置串口的时候已经设置过了。
  2. private UartDeviceCallback mUartCallback = new UartDeviceCallback() {
  3.     @Override
  4.     public boolean onUartDeviceDataAvailable(UartDevice uart) {
  5.         try {
  6.             readUartBuffer();
  7.         } catch (IOException e) {
  8.             Log.w(TAG, "Unable to access UART device", e);
  9.         }

  10.         return true;
  11.     }

  12.     @Override
  13.     public void onUartDeviceError(UartDevice uart, int error) {
  14.         Log.w(TAG, uart + ": Error event " + error);
  15.     }
  16. };
复制代码


readUartBuffer主要是将收到的数据转换成字符串,然后在TextView上显示。
  1. public void readUartBuffer() throws IOException {
  2.     final int maxCount = 1024;
  3.     byte[] buffer = new byte[maxCount];

  4.     int count;
  5.     while ((count = mDevice.read(buffer, buffer.length)) > 0) {
  6.         Log.d(TAG, "Read " + count + " bytes from peripheral");
  7.         String txt = new String(buffer, 0, count);
  8.         Log.d(TAG, "[DATA]" + txt);
  9.         mTextView.setText(mTextView.getText() + "\n" + txt);
  10.     }
  11. }
复制代码


最终的UI如下图所示,将树莓派的串口连接到电脑之后,向电脑发送了ickey.cc。
device-2017-09-24-222413.png
在电脑上使用Arduino自动的串口工具,可以看到数据已经收到了,在电脑上向树莓派发送数据,可以在上图中看到树莓派收到的数据。
D9C18E4C-FA66-4149-92B7-E7E7C58BD95E.png
从这两张图上下一对比,我们在加入一个波特率设置,树莓上还可以加入一个串口选择,那基本上就是一个可用工具了。AndroidThings在开发UI上还是非常有优势的,所以可以充分利用这个特长来做一些好玩的东西。


Thingsuart.zip (517.34 KB, 下载次数: 9)

评分

参与人数 5 +5 收起 理由
donatello + 1
汉云 + 1
黄莨元 + 1
Sourcelink + 1
chen0000009 + 1

查看全部评分

我要点赞 1

举报

您需要登录后才可以回帖 登录 | 立即注册