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

来源:互联网 发布:淘宝买家素质差 编辑:程序博客网 时间:2024/05/19 13:27

TC35661蓝牙芯片要正常使用的话,必须先要进行一系列配置,GD32F芯片通过串口和该蓝牙芯片相连,首先需要通过串口将配置命令一条一条的写进去。这些命令就是所谓的 HCI Command。

如果不写程序,单纯就可以通过串口助手发送这些命令即可完成初始化,

大致分为几个阶段 : HCI命令 –> MNG配置 –> SPP 配置
主要是配置MAC地址、设备类型、配对密钥、链路密钥、射频参数等。
这些都涉及到具体的蓝牙协议了,本文就不详细描述了。

下面会放上具体的代码地址。本文主要探讨和C51单片机交互的部分,即初始化完成之后如何通过串口和51单片机交互,也即如何完成数据透传。

GD32F芯片,和蓝牙交互的部分利用了USART3,和单片机交互的利用了USART1,还是直接放上相关部分代码:

#define TX_STR_SIZE 128volatile 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

0 0
原创粉丝点击