DIY智能插座(四) -- 蓝牙POS编码

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lonely_geek/article/details/52187751

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

猜你喜欢

转载自blog.csdn.net/lonely_geek/article/details/52187751