首頁 > 評測 > Android Things之七:樹莓派3實現(xiàn)串口通信

Android Things之七:樹莓派3實現(xiàn)串口通信

  • 作者:SATURN
  • 來源:21ic
  • [導讀]
  • 關(guān)于Android Things的探索,并不會因為買不起i.MX 7D的顯示屏配件而止步!接下來只能換上樹莓派3B來繼續(xù)學習了。

從今天開始,準備使用RPI3來代替i.MX7DAndroid Things開發(fā)。

歡迎加入Android Things交流群:452863046

因為接下來準備探索GUI編程。不錯,Android Things是支持GUI的,不過專用的顯示屏太貴,而RPI3也是支持Android Things并且提供了HDMI接口,不必另外專門購買一個專用的顯示屏了。

UART是用于與外圍設備交換原始數(shù)據(jù)的通用接口。它是通用的,因為數(shù)據(jù)傳輸速度和數(shù)據(jù)字節(jié)格式都是可配置的。同時它是異步的(UART而非USART),因為沒有時鐘信號來同步兩個設備之間的數(shù)據(jù)傳輸。設備硬件會在先進先出(FIFO)緩沖區(qū)中收集所有傳入數(shù)據(jù),直到應用程序讀取完成為止。

UART數(shù)據(jù)傳輸是全雙工的,這意味著可以同時發(fā)送和接收數(shù)據(jù)。它通常比I 2 C 快,但缺少共享時鐘意味著兩個設備必須就每個設備能夠以最小的定時誤差獨立地遵守的通用數(shù)據(jù)傳輸速率達成一致。

UART外設通常有兩種形式:

             3線端口包括數(shù)據(jù)接收(RX),數(shù)據(jù)發(fā)送(TX)和接地參考(GND)信號。

             5線端口添加用于硬件流控制的發(fā)送請求(RTS)和清除發(fā)送(CTS)信號。流控制允許接收設備指示其FIFO緩沖器暫時滿,并且發(fā)送設備應該在發(fā)送任何更多數(shù)據(jù)之前等待。

SPII2C不同,UART僅支持兩個器件之間的點對點通信。

rId21.png

一般為了簡單,通常只使用UART來通信,這樣只需要三根線就可以通信,如圖。為了和RPI3進行UART通信,另外使用了一塊Arduino UNO,通過ArduinoUARTRPI進行通信。

RPI3GPIO引腳接口如下
rId22.png

連接后的硬件如下

rId23.jpg

接下來開始寫代碼。

Arduino端的代碼非常簡單,如下

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  Serial.println("Uart Initialized. Now commucation begins...");
 
}

void loop() {
  // put your main code here, to run repeatedly:

  if(Serial.available()) {
    String msg = Serial.readString();
    Serial.println(msg);
  }

}

代碼的作用就是打開串口,設置通信速率,其它的參數(shù)使用默認值。一旦串口接收到數(shù)據(jù),就打印出來,驗證通信是否成功。

接下來是Android Things端的代碼了。相比GPIO/I2C等設備通信來說,UART的通信稍微復雜一些,主要是增加了事件監(jiān)聽機制。這樣的好處是減少輪詢時大量CPU時間的浪費。


   
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        try {
            mUartDevice = PeripheralManager.getInstance().openUartDevice(UartName);
            configureUart(mUartDevice);

            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    try {
                        mUartDevice.write(msg.getBytes(), msg.getBytes().length);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    Log.d(TAG, "run: " + msg);
                    mHandler.postDelayed(this, 2000);

                }
            });

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

onCreate函數(shù)里,主要做了兩件事:一是打開UART設備;其次是使用Handler來定時發(fā)送消息。

打開UART設備與前面使用GPIO的方法并無差別,先使用PeripheralManager來獲取一個實例,然后通過該實例來管理UART設備,這些方法都放在try...catch塊中以處理異常。

Handler來實現(xiàn)定時操作是Android中常見的操作,參考前文相關(guān)介紹,這里每隔2秒發(fā)送一段信息。


   
@Override
    protected void onStart() {
        super.onStart();

        try {
            mUartDevice.registerUartDeviceCallback(mUartDeviceCallback);
        } catch (IOException e) {
            e.printStackTrace();

        }
    }

    @Override
    protected void onStop() {
        super.onStop();
        mUartDevice.unregisterUartDeviceCallback(mUartDeviceCallback);
    }

這一段代碼用來注冊及注銷UART事件回調(diào),即只有在APP處于前臺時才監(jiān)聽事件。


   
private UartDeviceCallback mUartDeviceCallback = new UartDeviceCallback() {
        @Override
        public boolean onUartDeviceDataAvailable(UartDevice uartDevice) {

            return false;
        }
    };

這里是UART事件處理程序,當串口接收到數(shù)據(jù)后,可以在這里處理,這里只演示了RPI3發(fā)送數(shù)據(jù)的情況,沒有處理接收后的數(shù)據(jù)。當然我們可以在這里加一條簡單的LOG語句來處理接收到的信息。

    public void configureUart(UartDevice uart) throws IOException {
        uart.setBaudrate(115200);
        uart.setDataSize(8);
        uart.setParity(UartDevice.PARITY_NONE);
        uart.setStopBits(1);
    }

這里配置UART參數(shù),注意與Arduino端的配置要相同,否則接收到的數(shù)據(jù)就是亂碼了。

將代碼上傳到RPI3,通過Android StudioArduino各自的監(jiān)聽機制,可以看到實時的通信情況,如下圖

rId24.png

這是Arduino端的串口監(jiān)視器查看到的結(jié)果,注意通信率為115200

rId25.png

這是Android StudioLogcat輸出的信息,使用了filter來過濾其它的信息,只顯示與串口通信相關(guān)的輸出。

接下來準備開始GUI的編程體驗,通過RPI3HDMI接口連接顯示器,可以實現(xiàn)圖形化的操作外設

rId26.png

這是Android Things的桌面(如果也能稱為桌面的話),這里可以看到一些硬件相關(guān)的信息,如IP地址,GPIO等外設,要查看更具體的外設信息,可以點擊I/O Pinout,得到如下信息

rId27.png

接下來我們開始激動的GUI之旅吧!

 

  • 本文系21ic原創(chuàng),未經(jīng)許可禁止轉(zhuǎn)載!

網(wǎng)友評論