危機處理-藍芽傳送字元(HC-05)



今天來補個用藍芽傳字元給M0的程式碼
使用的藍芽模組是HC-05(主從合一),之後有空再補上HC-05的設定
查了查資料發現藍牙傳輸的方式不會對傳輸內容做任何的手腳(應該說調變?)等效於一條RS-232傳輸線
所以關於藍牙與板子的溝通就是通過UART協定去寫
而NUC140關於UART的腳位如下

(擷取自樹德科技大學資訊工程系 吳鴻志副教授之PPT)


我測試用的程式碼如下:
#include <stdio.h>
#include "NUC1xx.h"
#include "Driver\DrvSYS.h"
#include "Driver\DrvGPIO.h"
#include "Driver\DrvSPI.h"
#include "LCD_Driver.h"
#include "ScanKey.h"
#include "Seven_Segment.h"
#include "LCD_Driver_Extend.h"
#include "Driver/DrvUART.h"
#define DATASIZE 1
uint8_t mode;
extern unsigned char Ascii[];   
unsigned char TEXT1[16]="Keypad = ";
unsigned char LCD_Point[64];
unsigned char DisplayBuf[8*128];

int main(void)
{
  UNLOCKREG();
  DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1);
  SysTimerDelay(5000);
  /* HCLK clock source. 0: external 12MHz; 4:internal 22MHz RC oscillator */
  DrvSYS_SelectHCLKSource(0);  
  LOCKREG();    
  
  Initial_pannel();  //call initial pannel function
  clr_all_pannal();
  OpenKeyPad(); 
  DrvGPIO_Open(E_GPD, 14, E_IO_OUTPUT);
  DrvGPIO_ClrBit(E_GPD,14);
  
  uint8_t  read_buf[16];
  char     TEXT[16];
  STR_UART_T sParam;
  int x=0, y=0;
  int key;
  char a;
  
UNLOCKREG();
  DrvSYS_Open(48000000);
  LOCKREG();
  //藍牙初始化
  DrvGPIO_InitFunction(E_FUNC_UART0); // Set UART pins 
  /* UART Setting */
  sParam.u32BaudRate  = 9600;
  sParam.u8cDataBits  = DRVUART_DATABITS_8;
  sParam.u8cStopBits  = DRVUART_STOPBITS_1;
  sParam.u8cParity  = DRVUART_PARITY_NONE;
  sParam.u8cRxTriggerLevel= DRVUART_FIFO_1BYTES;
  /* Set UART Configuration */
  if(DrvUART_Open(UART_PORT0,&sParam) != E_SUCCESS);
  //球的起始位置
  draw_circle(DisplayBuf, 64+x, 32+y, 3);
  
  while(1){
    // read 1 bytes(由DATASIZE決定) from bluetooth(讀完之後才會往下走)
    DrvUART_Read(UART_PORT0,read_buf,DATASIZE); 
    //sprintf(TEXT,"%s",read_buf);              // display on LCD  
    //print_lcd(1, TEXT);
    a=read_buf[0];
      if(a==0x46){                      //F ascii == 0x46
        y--;
        draw_circle(DisplayBuf, 64+x, 32+y, 3);
      }
      if(a==0x42){                      //B ascii ==0x42
        y++;
        draw_circle(DisplayBuf, 64+x, 32+y, 3);
      } 
      if(a==0x4c){                      //L ascii ==0x4c
        x--;
        draw_circle(DisplayBuf, 64+x, 32+y, 3);
      }
      if(a==0x52){                      //R ascii ==0x52
        x++;
        draw_circle(DisplayBuf, 64+x, 32+y, 3);
      } 
    }   
}

運作起來就是以手機當controller透過藍芽去操控螢幕上的球


play商店上搜尋“bluetooth terminal”就可以找到有前後左右的controller還可以設定每個方向的字元
這裡我設定
Forwad     =   F 
Backward =  
Left           =   L
Right        =   R

draw_circle() 是我寫的一個方便畫球的函式
我中間還有保留將收到的字元顯示螢幕的程式碼方便用來檢查controller的設定

最後程式碼當中是使用UART0 所以代表是使用GPB0&GPB1
連接的方式就是把HC-05的Tx接到GPB0(Rx)即可(板子的傳送端沒用到所以可以懶得接)


留言

這個網誌中的熱門文章

PSPICE不正確使用手冊-方波

PSpice不正確使用手冊-下載篇

PSpice不正確使用手冊-畫畫&分析篇