DIY智能插座(四) -- 藍牙POS編碼

TC35661藍牙芯片要正常使用的話,必須先要進行一系列配置,GD32F芯片通過串口和該藍牙芯片相連,首先需要通過串口將配置命令一條一條的寫進去。這些命令就是所謂的 HCI Command。

如果不寫程序,單純就可以通過串口助手發送這些命令即可完成初始化,

大致分爲幾個階段 : HCI命令 –> MNG配置 –> SPP 配置
主要是配置MAC地址、設備類型、配對密鑰、鏈路密鑰、射頻參數等。
這些都涉及到具體的藍牙協議了,本文就不詳細描述了。

下面會放上具體的代碼地址。本文主要探討和C51單片機交互的部分,即初始化完成之後如何通過串口和51單片機交互,也即如何完成數據透傳。

GD32F芯片,和藍牙交互的部分利用了USART3,和單片機交互的利用了USART1,還是直接放上相關部分代碼:

#define TX_STR_SIZE 128

volatile uint8_t Uart1_pos=0;
char rx_char[TX_STR_SIZE] = {0x0};
uint8_t count = 0;

uint8_t uart1_is_rx_buffer_empty(void)
{
    return !(Uart1_RcvCnt - Uart1_pos);
}

uint8_t uart1_read(void)
{
    uint8_t c;
    c = Uart1_Buff[Uart1_pos++];
    if(Uart1_RcvCnt == Uart1_pos){
        Uart1_RcvCnt = Uart1_pos = 0;
    }   
    return c;
}

/** 處理單片機發來的消息,然後通過藍牙發送出去 **/
/** 單片機 --> 手機 ,主要通過該函數進行透傳 **/
void msg_process(void)
{
    while(!uart1_is_rx_buffer_empty()&& count < TX_STR_SIZE)
        rx_char[count++] = uart1_read();
    if(count >= TX_STR_SIZE)
    {
        count = 0;
        return;
    }
    if(count > 0 && rx_char[count-1] == ':') //判定分隔符
    {
        rx_char[count-1] = 0x0 ;//讀到分隔符後,將':'修改爲'\0',字符串結束標誌
        C_bt_send(rx_char);  //將字符串通過藍牙發送出去
        count = 0 ;
    }
}

/** GD32主函數 **/
int main ( void )
{

    SystemInit();

    if(SysTick_Config(72000*1))  //配置TICK中斷頻率                       
        while(1);

    IO_Init();//IO初始化   
    NVIC_Configuration();//中斷級聯初始化 
    Uart1Init ( 115200 ); //串口1初始化
    Uart3Init ( 115200 ); //串口3初始化

    if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6)) //讀取GPIOA6電平,判斷是否進入充電模式
        LED1_Blink_Start(1000); //如果有充電,則LED1閃爍
    else
    {
        SYS_POWER_ON;  //未進入充電模式,開啓三極管,打開系統電源
        LED1_ON; //LED1常亮
    }

    BT_POWER_OFF; 
    C_bt_init(); //藍牙初始化
    BT_POWER_ON; //打開藍牙電源

    printf("\nInitial OK !\n");

    while(1)
    {
        if((ms_timer % 1) == 0)
        {
            C_bt_step();   //藍牙模塊交互
            msg_process();  //USART1消息處理
        }               
    }

}

手機 –> 單片機方向 主要通過下面代碼實現透傳,代碼在pan1026.cpp中,藍牙協議處理部分代碼:

case(0x48): //收到SPP數據
{
        uint16_t spplength = ((uint16_t)parser_buffer[6]<<8) | parser_buffer[5];
        if(spplength)
        {
            uint16_t datalength = ((uint16_t)parser_buffer[8]<<8) | parser_buffer[7];
            //將有效數據部分轉發到USART1
            this->RawSendStaticBinary(&parser_buffer[9],datalength);
        }
}
break;

基本上透傳就這麼點東西,很簡單。主要是藍牙協議相關的比較複雜。另外該POS機按鍵中斷、充電判斷都需要看電路板引線才分析出來,已經在代碼中實現了~

附上完整代碼: https://github.com/lonely-geek/bluetooth-bm77

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章