本人最近在研究嵌入式的串口通信,任務是要寫一個手機端的遙控器用來遙控雙輪平衡小車。界面只用了一個小時就寫好了,重要的問題是如何與板子所帶的SPP-CA藍牙模塊進行通信。
SPP-CA模塊自帶代碼,在這里我使用的全部都是SPP-CA的默認模式。其中波特率是9600。讀者若要修改其匹配密碼,波特率等請使用串口調試工具對SPP-CA使用AT命令進行修改。詳情參考其技術手冊。
首先介紹Android端,官方的SDK中給了一個BluetoothChat的版本,這個版本稍加修改就可以進行串口通信。由於源代碼網上隨處可查,這里不加復制。修改方法如下:
首先修改UUID,在Android系統中,與手機通信的UUID和與藍牙串口通信的UUID是不同的。手機通信可以使用生成的UUID進行通信,但與藍牙串口不可,需使用下面的UUID。(位置:BluetoothChatService.java)
1 private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
在這里,如果其他的resource文件全部添加完畢並正確后之后,是可以正常運行不會產生致命錯誤的。但是要注意一個地方,在BluetoothChat的文件中,它所使用的connect和discovery的按鈕是在菜單中實現的。現在Android系統中普遍在取代菜單鍵這個功能,所以可能會出現部分小白發現沒有這兩個按鈕的情況,不知道如何跳轉到BluetoothConnect.java這個界面。解決方法:可以設置一個按鈕,按鈕按下,跳出菜單。跳出菜單代碼如下:
1 menuButton.setOnClickListener(new OnClickListener() { 2 3 @Overridepublic 4 5 void onClick(View v) { 6 7 openOptionsMenu(); 8 9 } 10 11 });
最后介紹一個重要問題。在手機端我沒有進行測試,不過網上絕大部分我能找到的用來進行手機藍牙通信的博客都沒有標明這個錯誤,應該是手機之間不會出現這個錯誤。但是,同樣的代碼用於藍牙串口通信就會有亂碼!!就會有亂碼!!就會有亂碼!!
這個亂碼有時是出現在末尾,或者是一串字符傳過來,就只顯示了最后一個字符等等奇奇怪怪的神奇現象。這個現象在我仔細研究了他的BluetoothChatService中的run()方法並結合網上的博客之后發現了問題。
這個問題是由InputStream這個類導致的。它的讀取方法是,每次循環都將InputStream中的所有字符讀出來。但是在藍牙串口通信時,它有可能導致一句話沒有傳完,就已經被讀取出來。所以會出現銜接和亂碼等問題。
以下是解決辦法:通過available方法來得知InputStream中的字符串個數,由於我的需求每次傳一個字符就可以,所以我這里buffer是char[1],在接收完成后,把available減去相應的字符串個數即可。
1 public void run() { 2 System.err.println("++++++++++run Thread+++++++++++++++++++++++"); 3 int bytes; // bytes returned from read() 4 int availableBytes = 0; 5 // Keep listening to the InputStream until an exception occurs 6 while (true) { 7 try { 8 availableBytes += mmInStream.available(); 9 if(availableBytes > 0){ 10 byte[] buffer = new byte[1]; 11 // buffer store for the stream 12 // Read from the InputStream 13 bytes = mmInStream.read(buffer); 14 availableBytes--; 15 // Log.d("mmInStream.read(buffer);", new String(buffer)); 16 if( bytes > 0 ){ 17 // Send the obtained bytes to the UI activity 18 mHandler.obtainMessage(BluetoothChat.MESSAGE_READ, bytes, -1, buffer).sendToTarget(); 19 } 20 } 21 } catch (IOException e) { 22 Log.d("Error reading", e.getMessage()); 23 e.printStackTrace(); 24 break; } 25 26 } 27 }
以上就是完整的BluetoothChat修改方法。已經通過串口調試工具驗證,發送接受都無問題。
本人第一次更新博客,如有不足敬請指出。
