小白转行入门STM32----手机蓝牙控制STM32单片机点亮LED( 二 )


  • 两人吵架属于哪种通信?
  • 上课传纸条属于哪种通信?
  • 1.2 串行和并行并行通信指双方之间通过多根信息线(8根以上)传输数据 , 数据可以并行传输,即公路很宽能够容纳多辆车并行行驶 。串行通信指双方之间通过很少根信息线(8根及以下)传输数据,数据犹如被一根线串起来的珍珠,所以叫做串行 。
    串行通信抗干扰能力强 , 线路铺设费用低,速率低 。
    1.3 异同通信和同步通信为什么要有同步和异步,或者它们是怎么来的?要想回答这个问题,我们需要考虑一个场景:如何传输大量数据?这个问题是没有完美解决方法的 , 但是最优方法是:当传输线路等硬件既定时,在线路满负荷下可以最快完成数据传输,也就是说:发送方马不停蹄地发送数据 , 接收方也及时接收信息 , 同时为了尽可能保证数据传输安全性,接受方接受一个信息后要给一个是否成功接收的状态,发送方在接受这个状态后才能发送下一个信息 。实现这种马不停蹄,最简单是双方按同一套时间步调一致发送、接收和检验信息,就像生产线一样,每个人在规定的时间内步调一致地完成各自的动作,以达到效率最高 。这就是同步通信过程 。
    异步通信则是为了完成小数据量传输,比如操控遥控车 , 这种场景下通常发送方不定时地发送少量信息,接收方接收后无需回复 。相比于同步通信这是不安全的,但是这无所谓,可以通过其他方式来修正这种不安全 。比如:遥控汽车,因为某个因素 , 汽车没有接受到转向 , 那么人会再次操作一遍转向操作 , 问题不大 。异步通信就不要求双方在同一套时间下进行同步操作,只要它们是相近的时间就好 。但是,双方要有相同的波特率 。
    这里的时间,其实就是时钟周期,类似于人把时间分为年月周日时分秒,时钟周期是把1秒分为很多份,是芯片设备的时间 。
    习题
    1. 在异步通信中 , 为什么通常情况下,双方要保持一样的波特率?
    二、连接STM32单片机下面进入正题
    2.1 编程环境
    1. CubeIDE
    2. 面包板和连接线
    2.2 硬件接线下面给出了接线图,
    2.2.1 接线图
    小白转行入门STM32----手机蓝牙控制STM32单片机点亮LED

    文章插图
    2.2.1 硬件介绍和设置買的蓝牙模块如上图,其VDD GND是接输入电源的正负极 , 他要求输入3.3V电压,我用的STM32板子上的电源 。RXD  TXD是用于连接STM32板子的,RXD是receive external data引脚 , 用于接收来自单片机的信息,TXD引脚用于向单片机发送信息 。买的模块一般都附赠规格说明书,比如引脚、电压、模块默认蓝牙名字和波特率等 。
    STM32是通过USART连接蓝牙模块,UART属于异步全双工通信,包含两根线单向通信线,分别接上述提到的两个引脚 。我用的是STM32F103C8T6芯片,它自带有三组USART,这里选用USART1,CubeIDE会自动选择PA10和PA9两个引脚与蓝牙进行通信 。具体如下图:
    小白转行入门STM32----手机蓝牙控制STM32单片机点亮LED

    文章插图
    小白转行入门STM32----手机蓝牙控制STM32单片机点亮LED

    文章插图
    小白转行入门STM32----手机蓝牙控制STM32单片机点亮LED

    文章插图
    2.3 编码在这里添加如下代码:
      uint8_t rx = 0; // 定义一个无符号整形数,用于接收蓝牙发送的数据 。  while (1)  {      /* USER CODE END WHILE */      // 用于接受来自蓝牙发来的数据 。      // &huart1 是一个封装好的结构体,代表那两个引脚,HAL_UART_Receive函数会自动识别使用PA10进行接受数据 。      // &rx , 接收蓝牙信息放到rx中,由于rx是整形数字,直接传递给函数,传过去的只是副本 , 所以要传递其引用 。      // 1 , 表示接受一个字节(8个二进制) 。      // HAL_MAX_DELAY 表示接受一个蓝牙信号后,单片机就停下来死等下次接收蓝牙信息 。      HAL_UART_Receive(&huart1, &rx, 1, HAL_MAX_DELAY);      // rx == '1', 蓝牙传输过来的是一个字符1而不是数字 。  if (rx == '1'){       HAL_GPIO_WritePin(GPIOA, LED_Pin, GPIO_PIN_SET); # 输出高电平,灯亮      }else{       HAL_GPIO_WritePin(GPIOA, LED_Pin, GPIO_PIN_RESET); # 输出低电平,灯灭   }    /* USER CODE BEGIN 3 */  }

    推荐阅读