小白轉行入門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 */  }

    推薦閱讀