0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32與PC端、HC-06、ROS進(jìn)行USART串口通信

CHANBAEK ? 來(lái)源:月月望歸鳥(niǎo) ? 作者:K.Fire ? 2023-06-15 16:51 ? 次閱讀

01 前言

串口通訊對(duì)于任何開(kāi)發(fā)板都是非常重要的,也是必學(xué)知識(shí)之一,通過(guò)串口通信可以實(shí)現(xiàn)上位機(jī)與下位機(jī)之間、開(kāi)發(fā)板之間的通訊,可以讓我們實(shí)時(shí)掌握機(jī)器人的各個(gè)關(guān)機(jī)的運(yùn)動(dòng)狀態(tài)和傳感器信息。

現(xiàn)在的通信協(xié)議有很多,比如:UART、USART、CAN、SPI等等,它們功能不同,適用于不同的場(chǎng)合,USART作為單片機(jī)之間、下位機(jī)與上位機(jī)之間最常用的通訊方式之一,它對(duì)于數(shù)據(jù)的收發(fā)十分方便,應(yīng)用日益廣泛。

02 USART通信原理

USART(Universal Synchronous/Asynchronous Receiver/Transmitter)中文名叫:全雙工通用同步/異步串行收發(fā)模塊。

先對(duì)這個(gè)名字的各個(gè)部分進(jìn)行解釋:

圖片

在平時(shí)的工程項(xiàng)目中,我們常用的是全雙工串行異步通信方式,雖然串行通信數(shù)據(jù)是一位一位的發(fā)送,但隨著近幾年科技的高速發(fā)展,串行通訊的速度已經(jīng)逐漸趕超并行通訊了,而且串行通訊方式適用于遠(yuǎn)距離通訊,比較常用。

USART通訊的數(shù)據(jù)格式大致是這樣:

起始位(0)+串行數(shù)據(jù)幀(從低位到高位傳輸)+停止位(1)

串行數(shù)據(jù)幀可以人為設(shè)置為8位或者9位,9位是8位數(shù)據(jù)加上1位校驗(yàn)位(奇偶校驗(yàn))。

另外一個(gè)比較重要的概念是波特率,在任何通訊開(kāi)始之前,通訊雙方都要約定好波特率,波特率是每秒發(fā)送有效數(shù)據(jù)的位數(shù)(bit/s),雙方如果沒(méi)有約定好一致的波特率,在傳輸過(guò)程中則會(huì)出現(xiàn)亂碼的情況。

STM32中,有專門的數(shù)據(jù)寄存器和特定的引腳負(fù)責(zé)USART通訊,并配合有相應(yīng)的標(biāo)志位,用于幫我們判斷數(shù)據(jù)是否發(fā)送/接收完畢,并且也有相關(guān)的庫(kù)函數(shù)幫助我們對(duì)串口進(jìn)行配置。

相關(guān)寄存器有:發(fā)送數(shù)據(jù)寄存器(TDR)、發(fā)送移位寄存器、接收數(shù)據(jù)寄存器(RDR)、接受移位寄存器。

相關(guān)標(biāo)志位有:

  • TEX標(biāo)志位:1:數(shù)據(jù)寄存器無(wú)數(shù)據(jù);0:數(shù)據(jù)寄存器有數(shù)據(jù)
  • TX標(biāo)志位:1:發(fā)送完成;0:發(fā)送未完成
  • RXNE標(biāo)志位:1:數(shù)據(jù)接收完成,可以讀出;0:數(shù)據(jù)未收到

具體知識(shí)在中文參考手冊(cè)P517,大家可以詳細(xì)查看

03 STM32與PC通訊

STM32與PC通訊需要進(jìn)行一些配置,這里實(shí)現(xiàn)由PC端向STM32發(fā)送一個(gè)數(shù)據(jù),STM32接收到后再發(fā)回到PC端,該實(shí)驗(yàn)需要用到串口調(diào)試助手。

STM32可以作為串口通訊的引腳大家可以通過(guò)數(shù)據(jù)手冊(cè)進(jìn)行查看,比如PA9(TX)和PA10(RX)

圖片

串口通訊一般都配合中斷進(jìn)行使用,下面講解串口配置過(guò)程:

1.串口時(shí)鐘、GPIO時(shí)鐘使能 RCC_APB2PeriphClockCmd

2.GPIO端口模式配置 GPIO_Init

3.串口參數(shù)初始化 USART_Init

4.開(kāi)啟終端并初始化NVIC USART_ITConfig、NVIC_Init

5.使能串口 USART_Cmd 6.編寫中斷服務(wù)函數(shù) USART1_IRQHandler

my_usart.c 代碼如下:

void My_Usart1_Init(int bound)
{
  /*1.串口時(shí)鐘、GPIOA使能*/
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA,ENABLE);


  /*2.GPIO端口模式設(shè)置*/
  GPIO_InitTypeDef GPIO_InitStruct;
  /*TX*/
  GPIO_InitStruct.GPIO_Pin = Usart1_TX;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStruct);
  /*RX*/
  GPIO_InitStruct.GPIO_Pin = Usart1_RX;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  //GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStruct);


  /*3.串口參數(shù)初始化*/
  USART_InitTypeDef USART_InitStruct;
  USART_InitStruct.USART_BaudRate = bound;//波特率
  USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件流控制
  USART_InitStruct.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;//USART模式
  USART_InitStruct.USART_Parity = USART_Parity_No;//校驗(yàn)位
  USART_InitStruct.USART_StopBits = USART_StopBits_1;//終止位
  USART_InitStruct.USART_WordLength = USART_WordLength_8b;//數(shù)據(jù)長(zhǎng)度,如果有奇偶校驗(yàn)就設(shè)置為9位
  USART_Init(USART1, &USART_InitStruct);

  /*4.開(kāi)啟中斷并初始化NVIC*/
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//開(kāi)中斷,開(kāi)啟接受中斷后,接收到數(shù)據(jù)則會(huì)進(jìn)入中斷服務(wù)函數(shù)

  NVIC_InitTypeDef NVIC_InitStruct;
  NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;
  NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
  NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 3;
  NVIC_InitStruct.NVIC_IRQChannelSubPriority = 3;
  NVIC_Init(&NVIC_InitStruct);//初始化NVIC

  /*5.使能串口*/
  USART_Cmd(USART1, ENABLE);

  /*6.編寫中斷服務(wù)函數(shù)*/

}

進(jìn)行如上配置后,當(dāng)STM32接收到PC發(fā)送的信息就會(huì)進(jìn)入中斷服務(wù)函數(shù),中斷服務(wù)函數(shù)接收到數(shù)據(jù)后再進(jìn)行發(fā)送。

中斷服務(wù)函數(shù)代碼:

void USART1_IRQHandler(void)
{
  u16 RX_From_PC;
  if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET)
  {
    USART_ClearITPendingBit(USART1,USART_IT_RXNE);//清空中斷標(biāo)志位
    RX_From_PC = USART_ReceiveByte(USART1);//接收PC端發(fā)來(lái)的消息
    USART_SendByte(USART1,RX_From_PC);//將數(shù)據(jù)發(fā)回到PC端

    //usartReceiveOneData(&TargetVelocity,&TargetVelocity,&RX_Cmd_Form_Ros);//接收ROS發(fā)來(lái)的消息
  }
}

在這里我們沒(méi)有使用官方固件庫(kù)中提供的收發(fā)函數(shù) USART_ReceiveData 和 USART_SendData,而是使用了我自己對(duì)他們進(jìn)行重寫的函數(shù),在其中加入了相關(guān)標(biāo)志位的判斷,這樣可以保證收發(fā)過(guò)程中不會(huì)發(fā)生數(shù)據(jù)覆蓋。

重寫后的函數(shù):

void USART_SendByte(USART_TypeDef* USARTx, uint16_t Data)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_DATA(Data)); 

  /* Transmit Data */
  USARTx- >DR = (Data & (uint16_t)0x01FF);
  while(USART_GetFlagStatus(USARTx,USART_FLAG_TXE)==RESET);
}

void USART_SendString(USART_TypeDef* USARTx,char* str)
{
  while((*str) != '\\0')
  {
    USART_SendByte(USARTx, *str);
    str++;
  }
  while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET);
}



uint16_t USART_ReceiveByte(USART_TypeDef* USARTx)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));

  while(USART_GetFlagStatus(USARTx,USART_FLAG_RXNE)==RESET);

  /* Receive Data */
  return (uint16_t)(USARTx- >DR & (uint16_t)0x01FF);
}

在主函數(shù)中進(jìn)行相應(yīng)的初始化,我們就可以通過(guò)串口助手與STM32進(jìn)行通訊了。

image.png

另外,Keil5是沒(méi)有終端的,但我們可以通過(guò)一些設(shè)置也使用printf函數(shù),讓數(shù)據(jù)收發(fā)更加方便,我們需要對(duì)fputs和fgets這兩個(gè)函數(shù)進(jìn)行重定向(其實(shí)只重定向fputs即可),需要在程序中加入如下代碼:

/*重定向這兩個(gè)函數(shù)*/
int fputc(int ch,FILE *f)
{
  while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
  USART_SendData(USART1,(uint8_t) ch);
  return ch;
}

int fgetc(FILE *f)
{
  while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) == RESET);
  return (int)USART_ReceiveData(USART1);
}

printf函數(shù)使用的是半主機(jī)工作模式,需要使用微控制器,需要進(jìn)行如下配置:

圖片

這玩意功能少一些,如果不想用,則需要在程序中再加入以下代碼,這是printf函數(shù)的底層程序:

#pragma import(__use_no_semihosting)

struct __FILE
{
  int handle;
};

FILE __stdout;
_sys_exit(int x)
{
  x = x;
}

編譯后,我們就可以與PC端進(jìn)行愉快的通訊了!

04 STM32與HC-06通訊

STM32與HC-06的通訊與PC端的通訊類似,知識(shí)接線方式的不同而已,只需要進(jìn)行如下正確的接線,即可完成順利地通訊。

圖片

這里要注意的是,給HC-06供電時(shí),需要提供3.6V-6V的電壓;另外,要注意看一下STM32的引腳輸出電壓是多少,HC-06的輸入輸出電壓都是3.3V,比如像Arduino的輸出電壓為5V,這時(shí)單片機(jī)的TX在接HC-06的RX時(shí)需要分壓!

05 STM32與ROS通訊

STM32與ROS通訊時(shí),需要定義一個(gè)協(xié)議,以保證數(shù)據(jù)傳輸?shù)目煽啃?,這個(gè)協(xié)議是STM32與ROS通訊時(shí)最廣泛使用的協(xié)議,協(xié)議格式如下:

數(shù)據(jù)頭55aa + 控制命令 + 數(shù)據(jù)字節(jié)數(shù)size + 數(shù)據(jù) + 校驗(yàn)crc8 + 數(shù)據(jù)尾0d0a

在通訊時(shí),我們只要對(duì)接收到的信息進(jìn)行解碼,即可獲得有效數(shù)據(jù)信息,比如:設(shè)定的速度值、航向角等,保證了數(shù)據(jù)收發(fā)的可靠性。

先定義相關(guān)的變量:

//數(shù)據(jù)接收暫存區(qū)
unsigned char  receiveBuff[Message_Length-4] = {0};         
//通信協(xié)議常量
const unsigned char header[2]  = {0x55, 0xaa};
const unsigned char ender[2]   = {0x0d, 0x0a};

//發(fā)送數(shù)據(jù)(左輪速、右輪速、角度)共用體(-32767 - +32768)
union sendData
{
  float d;
  char data[4];
}leftVelNow,rightVelNow,angleNow;

//左右輪速控制速度共用體
union receiveData
{
  float d;
  char data[4];
}leftVelSet,rightVelSet;

接收信息函數(shù):

int usartReceiveOneData(float *p_leftSpeedSet,float *p_rightSpeedSet,unsigned char *p_crtlFlag)
{
  unsigned char USART_Receiver              = 0;          //接收數(shù)據(jù)
  static unsigned char checkSum             = 0;
  static unsigned char USARTBufferIndex     = 0;
  static short j=0,k=0;
  static unsigned char USARTReceiverFront   = 0;
  static unsigned char Start_Flag           = START;      //一幀數(shù)據(jù)傳送開(kāi)始標(biāo)志位
  static short dataLength                   = 0;

  USART_Receiver = USART_ReceiveByte(USART1);
  //接收消息頭
  if(Start_Flag == START)
  {
    if(USART_Receiver == 0xaa)                             //buf[1]
    {  
      if(USARTReceiverFront == 0x55)        //數(shù)據(jù)頭兩位 //buf[0]
      {
        Start_Flag = !START;              //收到數(shù)據(jù)頭,開(kāi)始接收數(shù)據(jù)
        //printf("header ok\\n");
        receiveBuff[0]=header[0];         //buf[0]
        receiveBuff[1]=header[1];         //buf[1]
        USARTBufferIndex = 0;             //緩沖區(qū)初始化
        checkSum = 0x00;          //校驗(yàn)和初始化
      }
    }
    else 
    {
      USARTReceiverFront = USART_Receiver;  
    }
  }
  else
    { 
    switch(USARTBufferIndex)
    {
      case 0://接收控制指令
        receiveBuff[2] = USART_Receiver;
        *p_crtlFlag = receiveBuff[2];        //buf[2]
        USARTBufferIndex++;
      case 1://接收左右輪速度數(shù)據(jù)的長(zhǎng)度
        receiveBuff[3] = USART_Receiver;
        dataLength     = receiveBuff[3];            //buf[3]
        USARTBufferIndex++;
        break;        
      case 2://接收所有數(shù)據(jù),并賦值處理 
        receiveBuff[j + 4] = USART_Receiver;        //buf[4] - buf[11]          
        j++;
        if(j >= dataLength)                         
        {
          j = 0;
          USARTBufferIndex++;
        }
        break;
      case 3://接收校驗(yàn)值信息
        receiveBuff[4 + dataLength] = USART_Receiver;
        checkSum = getCrc8(receiveBuff, 4 + dataLength);
          // 檢查信息校驗(yàn)值
        if (checkSum != receiveBuff[4 + dataLength]) //buf[12]
        {
          printf("Received data check sum error!");
          return 0;
        }
        USARTBufferIndex++;
        break;

      case 4://接收信息尾
        if(k==0)
        {
          //數(shù)據(jù)0d     buf[13]  無(wú)需判斷
          k++;
        }
        else if (k==1)
        {
          //數(shù)據(jù)0a     buf[14] 無(wú)需判斷

          //進(jìn)行速度賦值操作          
           for(k = 0; k < 4; k++)
          {
            leftVelSet.data[k]  = receiveBuff[k + 4]; //buf[4] - buf[7]
            rightVelSet.data[k] = receiveBuff[k + 8]; //buf[8] - buf[11]
          }        

          //速度賦值操作
          sscanf(leftVelSet.data,"%f",&(*p_leftSpeedSet));
          sscanf(leftVelSet.data,"%f",&(*p_rightSpeedSet));


          //-----------------------------------------------------------------
          //完成一個(gè)數(shù)據(jù)包的接收,相關(guān)變量清零,等待下一字節(jié)數(shù)據(jù)
          USARTBufferIndex   = 0;
          USARTReceiverFront = 0;
          Start_Flag         = START;
          checkSum           = 0;
          dataLength         = 0;
          j = 0;
          k = 0;
          //-----------------------------------------------------------------          
        }
        break;
       default:break;
    }    
  }
  return 0;
}

發(fā)送信息函數(shù):

void usartSendData(float leftVel, float rightVel,float angle,unsigned char ctrlFlag)
{
  // 協(xié)議數(shù)據(jù)緩存數(shù)組
  unsigned char buf[Message_Length] = {0};
  int i, length = 0;

  // 計(jì)算左右輪期望速度
  leftVelNow.d  = leftVel;
  rightVelNow.d = rightVel;
  angleNow.d    = angle;

  // 設(shè)置消息頭
  for(i = 0; i < 2; i++)
    buf[i] = header[i];                      // buf[0] buf[1]

  //設(shè)置命令位
  buf[2] = ctrlFlag;               // buf[2]

  //設(shè)置數(shù)據(jù)長(zhǎng)度
  length = 3 * sizeof(float);
  buf[3] = length;               // buf[3]

  // 設(shè)置機(jī)器人左右輪速度、角度
  for(i = 0; i < 4; i++)
  {
    buf[i + 4] = leftVelNow.data[i];         // buf[4] buf[5] buf[6] buf[7]
    buf[i + 8] = rightVelNow.data[i];        // buf[8] buf[9] buf[10] buf[11]
    buf[i + 12] = angleNow.data[i];           // buf[12] buf[13] buf[14] buf[15]
  }

  // 設(shè)置校驗(yàn)值、消息尾
  buf[Message_Length - 3] = getCrc8(buf, 4 + length);  // buf[16]
  buf[Message_Length - 2] = ender[0];              // buf[17]
  buf[Message_Length - 1] = ender[1];              // buf[18]

  //發(fā)送字符串?dāng)?shù)據(jù)
  USART_Send_String(buf,sizeof(buf));
}

循環(huán)冗余校驗(yàn):

unsigned char getCrc8(unsigned char *ptr, unsigned short len)
{
  unsigned char crc;
  unsigned char i;
  crc = 0;
  while(len--)
  {
    crc ^= *ptr++;
    for(i = 0; i < 8; i++)
    {
      if(crc&0x01)
                crc=(crc >>1)^0x8C;
      else 
                crc > >= 1;
    }
  }
  return crc;
}

然后我們只要在中斷服務(wù)函數(shù)中調(diào)用收發(fā)信息函數(shù),即可實(shí)現(xiàn)與ROS的通訊。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • STM32
    +關(guān)注

    關(guān)注

    2264

    文章

    10858

    瀏覽量

    354395
  • 串口通訊
    +關(guān)注

    關(guān)注

    1

    文章

    258

    瀏覽量

    24820
  • 開(kāi)發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    4913

    瀏覽量

    97086
  • USART
    +關(guān)注

    關(guān)注

    1

    文章

    195

    瀏覽量

    30768
  • ROS
    ROS
    +關(guān)注

    關(guān)注

    1

    文章

    276

    瀏覽量

    16942
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    請(qǐng)問(wèn)hc-05和hc-06有什么區(qū)別?

    hc-05和hc-06有什么區(qū)別嗎?原本實(shí)用hc-06通信設(shè)備我現(xiàn)在用hc-05,發(fā)送的數(shù)據(jù)會(huì)出錯(cuò)不?
    發(fā)表于 05-27 02:10

    USART2與HC06藍(lán)牙模塊進(jìn)行通信

    STM32F407的USART2與HC06藍(lán)牙模塊進(jìn)行通信。本文寫的盡量詳細(xì)簡(jiǎn)單,讓初學(xué)ARM的新手也能看懂,同時(shí)也涉及到一些容易出錯(cuò)的細(xì)節(jié)
    發(fā)表于 08-05 08:17

    怎樣使用STM32F407的USART2 HC06藍(lán)牙模塊進(jìn)行通信

    串口通信是什么?怎樣使用STM32F407的USART2 HC06藍(lán)牙模塊進(jìn)行
    發(fā)表于 10-26 07:52

    如何用藍(lán)橋杯單片機(jī)開(kāi)發(fā)板實(shí)現(xiàn)與HC-06藍(lán)牙模塊的通訊

    STC-ISP軟件首先需了解HC-06,這是藍(lán)牙串口通透模塊,可實(shí)現(xiàn)與單片機(jī)串口的信息交換,有四根管腳,VCC、GND連接電源,TXD藍(lán)牙模塊數(shù)據(jù)發(fā)送,RXD藍(lán)牙模塊數(shù)據(jù)接收
    發(fā)表于 12-07 11:45

    HC-06控制舵機(jī)的相關(guān)資料推薦

    一.學(xué)習(xí)筆記 HC-06控制舵機(jī)(51版)要學(xué)習(xí)HC-06藍(lán)牙模塊與51單片機(jī)互相通信以控制舵機(jī)首先了解51內(nèi)部RXD與TXD的關(guān)系(如下圖):通過(guò)此圖可以清晰了解51與TXD/RXD數(shù)據(jù)傳輸方式
    發(fā)表于 12-07 13:26

    如何在ROS上使用serial包進(jìn)行串口通信

    如何在ROS上使用其提供的serial包進(jìn)行串口通信。我的環(huán)境介紹:PC:使用的是Ubuntu 16-04
    發(fā)表于 02-21 07:27

    如何讀取寫入arduino串行監(jiān)視器的文本并使用HC-06藍(lán)牙模塊進(jìn)行顯示

    連接原理圖之類的所有東西,它應(yīng)該可以工作。確保將HC-06藍(lán)牙模塊連接到3v
    的頭像 發(fā)表于 11-12 09:29 ?3663次閱讀
    如何讀取寫入arduino串行監(jiān)視器的文本并使用<b class='flag-5'>HC-06</b>藍(lán)牙模塊<b class='flag-5'>進(jìn)行</b>顯示

    帶有HC-05的通信藍(lán)牙模塊HC-06

    Hc-06模塊不能只需要進(jìn)行調(diào)整以在從屬模式下工作。但是,如果要更改其他設(shè)置,則需要以相同的方式進(jìn)行連接。由于不需要執(zhí)行此模塊的針腳到9針的連接。
    的頭像 發(fā)表于 10-21 10:22 ?9921次閱讀
    帶有<b class='flag-5'>HC</b>-05的<b class='flag-5'>通信</b>藍(lán)牙模塊<b class='flag-5'>HC-06</b>

    用藍(lán)橋杯單片機(jī)開(kāi)發(fā)板實(shí)現(xiàn)與HC-06藍(lán)牙模塊的通訊

    STC-ISP軟件首先需了解HC-06,這是藍(lán)牙串口通透模塊,可實(shí)現(xiàn)與單片機(jī)串口的信息交換,有四根管腳,VCC、GND連接電源,TXD藍(lán)牙模塊數(shù)據(jù)發(fā)送,RXD藍(lán)牙模塊數(shù)據(jù)接收
    發(fā)表于 11-24 11:21 ?19次下載
    用藍(lán)橋杯單片機(jī)開(kāi)發(fā)板實(shí)現(xiàn)與<b class='flag-5'>HC-06</b>藍(lán)牙模塊的通訊

    STM32CubeMX完成USART串口通信

    STM32CubeMX完成USART串口通信
    發(fā)表于 12-06 20:36 ?24次下載
    <b class='flag-5'>STM32</b>CubeMX完成<b class='flag-5'>USART</b><b class='flag-5'>串口</b><b class='flag-5'>通信</b>

    16 . USART 串口通信實(shí)驗(yàn)

    USART 串口通信實(shí)驗(yàn)我們知道STM32F1 內(nèi)部含有非常多的通信接口,我們就來(lái)學(xué)習(xí)下USART
    發(fā)表于 12-20 19:22 ?20次下載
    16 . <b class='flag-5'>USART</b> <b class='flag-5'>串口</b><b class='flag-5'>通信</b>實(shí)驗(yàn)

    STM32下的USART串口通信程序

    STM32USART串口通信實(shí)踐
    發(fā)表于 12-24 18:42 ?13次下載
    <b class='flag-5'>STM32</b>下的<b class='flag-5'>USART</b><b class='flag-5'>串口</b><b class='flag-5'>通信</b>程序

    Arduino條LED RGB模塊HC-06開(kāi)源

    電子發(fā)燒友網(wǎng)站提供《Arduino條LED RGB模塊HC-06開(kāi)源.zip》資料免費(fèi)下載
    發(fā)表于 07-07 15:17 ?2次下載
    Arduino條LED RGB模塊<b class='flag-5'>HC-06</b>開(kāi)源

    HC-06藍(lán)牙模塊與Arduino連接教程

    電子發(fā)燒友網(wǎng)站提供《將HC-06藍(lán)牙模塊與Arduino連接教程.zip》資料免費(fèi)下載
    發(fā)表于 06-25 11:24 ?2次下載
    將<b class='flag-5'>HC-06</b>藍(lán)牙模塊與Arduino連接教程

    STM32里的串口通信

    STM32里的串口通信STM32里,串口通信USART
    的頭像 發(fā)表于 11-10 15:58 ?2907次閱讀
    <b class='flag-5'>STM32</b>里的<b class='flag-5'>串口</b><b class='flag-5'>通信</b>