国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32開發(fā)(六)STM32F103 通信 —— RS485 Modbus通信編程詳解

這篇具有很好參考價(jià)值的文章主要介紹了STM32開發(fā)(六)STM32F103 通信 —— RS485 Modbus通信編程詳解。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

??《上一篇》 ???《主目錄》 ???《下一篇》



一、基礎(chǔ)知識(shí)點(diǎn)

了解 RS485 Modbus協(xié)議技術(shù) 。本實(shí)驗(yàn)是基于STM32F103開發(fā) 實(shí)現(xiàn) 通過(guò)RS-485實(shí)現(xiàn)modbus協(xié)議。

準(zhǔn)備好了嗎?開始我的show time。


二、開發(fā)環(huán)境

1、硬件開發(fā)準(zhǔn)備
主控:STM32F103ZET6
RS485收發(fā)器:SP3485P
stm32 modbus通信,STM32開發(fā),stm32,單片機(jī),嵌入式硬件,linux,驅(qū)動(dòng)開發(fā)

2、軟件開發(fā)準(zhǔn)備
軟件開發(fā)使用虛擬機(jī) + VScode + STM32Cube 開發(fā)STM32,在虛擬機(jī)中直接完成編譯下載。
該部分可參考:軟件開發(fā)環(huán)境構(gòu)建


三、STM32CubeMX相關(guān)配置

1、STM32CubeMX基本配置

本實(shí)驗(yàn)基于CubeMX詳解構(gòu)建基本框架 進(jìn)行開發(fā)。

2、STM32CubeMX RS485 相關(guān)配置

(1)發(fā)送接收控制腳配置(GPIO配置)
stm32 modbus通信,STM32開發(fā),stm32,單片機(jī),嵌入式硬件,linux,驅(qū)動(dòng)開發(fā)

stm32 modbus通信,STM32開發(fā),stm32,單片機(jī),嵌入式硬件,linux,驅(qū)動(dòng)開發(fā)
gpio輸出電平: 低(控制引腳默認(rèn)低電平,芯片處于讀狀態(tài))
gpio模式: 推挽輸出
gpio上下拉設(shè)置: 不上下拉
gpio輸出速度: 低速
gpio命名: RS485_DE_nRE (與硬件標(biāo)識(shí)一致,便于代碼編寫)

(2)串口UART3配置
stm32 modbus通信,STM32開發(fā),stm32,單片機(jī),嵌入式硬件,linux,驅(qū)動(dòng)開發(fā)

根據(jù)硬件引腳連接,RS485芯片連接UART3通信

stm32 modbus通信,STM32開發(fā),stm32,單片機(jī),嵌入式硬件,linux,驅(qū)動(dòng)開發(fā)
基本配置: 實(shí)驗(yàn)波特率采用9600、數(shù)據(jù)位8bit、無(wú)奇偶校驗(yàn)、停止位1bit
數(shù)據(jù)方向: 接收發(fā)送
stm32 modbus通信,STM32開發(fā),stm32,單片機(jī),嵌入式硬件,linux,驅(qū)動(dòng)開發(fā)
DMA配置: Add添加發(fā)送和接收的DMA,DMA參數(shù)保持默認(rèn)狀態(tài)

(3)中斷配置
stm32 modbus通信,STM32開發(fā),stm32,單片機(jī),嵌入式硬件,linux,驅(qū)動(dòng)開發(fā)
實(shí)驗(yàn)中接收數(shù)據(jù)采用空閑觸發(fā);發(fā)送數(shù)據(jù)采用DMA發(fā)送觸發(fā)后發(fā)送完成中斷
UART3總中斷(USART3 global interrupt)必須打開(為了發(fā)送完成中斷實(shí)現(xiàn))
UART_RX (DMA1 channel3 global interrupt) DMA接收中斷不打開,取消對(duì)鉤(這里對(duì)鉤無(wú)法改變,后續(xù)解決)
UART_TX (DMA1 channel2 global interrupt) DMA發(fā)送中斷打開。

stm32 modbus通信,STM32開發(fā),stm32,單片機(jī),嵌入式硬件,linux,驅(qū)動(dòng)開發(fā)
進(jìn)行NVIC中斷等級(jí)配置(0等級(jí)最高)
上述講到無(wú)法取消DMA接收中斷,原因是選中了強(qiáng)制DMA中斷(右上角藍(lán)色框,取消對(duì)鉤就ok)


四、Vscode代碼講解

1、初始化相關(guān)中斷

#ifdef STM32_F407_RS485_Modbus
    printf("----DWB   此程序通過(guò)RS-485實(shí)現(xiàn)modbus協(xié)議----\r\n");

    __HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);        // 使能串口3空閑中斷
    HAL_UART_Receive_DMA(&huart3, UART3.pucRec_Buffer, UART3_Rec_LENGTH);
#endif

2、RS485 結(jié)構(gòu)體 以及函數(shù)實(shí)現(xiàn)

typedef struct 
{
  uint8_t* pucSend_Buffer;     //發(fā)送緩存指針  
  uint8_t* pucRec_Buffer;     //接收緩存指針 

  void (*SendArray)(uint8_t*, uint16_t);    //串口發(fā)送數(shù)組
  void (*SendString)(uint8_t*);             //串口發(fā)送字符串

  void (*RS485_Set_SendMode)(void);  //RS-485接口設(shè)置為發(fā)送模式
  void (*RS485_Set_RecMode)(void);   //RS-485接口設(shè)置為接收模式
 
  /* data */
} UART_t;

// 串口發(fā)數(shù)組
static void SendArray(uint8_t* p_Arr,uint16_t LEN) 
{
  UART3.RS485_Set_SendMode(); 
  HAL_UART_Transmit_DMA(&huart3,p_Arr,LEN);
}

// RS485接口設(shè)置發(fā)送模式
static void RS485_Set_SendMode()
{
  HAL_GPIO_WritePin(RS485_DE_nRE_GPIO_Port, RS485_DE_nRE_Pin,,GPIO_PIN_SET);
}

// RS485接口設(shè)置接收模式
static void RS485_Set_RecMode()
{
  HAL_GPIO_WritePin(RS485_DE_nRE_GPIO_Port, RS485_DE_nRE_Pin,,GPIO_PIN_RESET);
}

3、RS485 Modbus發(fā)送
重構(gòu)接收回調(diào)函數(shù)(整個(gè)DMA發(fā)送過(guò)程后面有講解)

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */
  if(huart->Instance == huart3.Instance)
  {
    UART3.RS485_Set_RecMode();
  }
}

4、RS485 Modbus接收
接收使用空閑中斷 ,在串口總中斷中添加空閑中斷檢測(cè)。

void USART3_IRQHandler(void)
{
  /* USER CODE BEGIN USART3_IRQn 0 */
  if(__HAL_UART_GET_FLAG(&huart3, UART_FLAG_IDLE))      // 判斷空閑中斷標(biāo)志位
  {
    __HAL_UART_CLEAR_IDLEFLAG(&huart3);                 // 1、清除中斷標(biāo)志位
    HAL_UART_IdleCallback(&huart3);                     // 2、空閑中斷回調(diào)函數(shù)
  }
  /* USER CODE END USART3_IRQn 0 */
  HAL_UART_IRQHandler(&huart3);
  /* USER CODE BEGIN USART3_IRQn 1 */

  /* USER CODE END USART3_IRQn 1 */
}

在 Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_uart.h 文件中回調(diào)函數(shù)并沒(méi)有串口空閑中斷回調(diào)函數(shù)
stm32 modbus通信,STM32開發(fā),stm32,單片機(jī),嵌入式硬件,linux,驅(qū)動(dòng)開發(fā)
重構(gòu)空閑中斷回調(diào)函數(shù)

void HAL_UART_IdleCallback(UART_HandleTypeDef *huart)
{
  if(huart->Instance == huart3.Instance)
  {
    Modbus.Protocol_Analysis(&UART3);                                        // 接收數(shù)據(jù)解析
    HAL_UART_Receive_DMA(&huart3, UART3.pucRec_Buffer, UART3_Rec_LENGTH);    // 重新開啟接收DMA(在數(shù)據(jù)解析中會(huì)暫時(shí)關(guān)閉接收DMA)
  }
}

5、Modbus 收發(fā)數(shù)據(jù)詳解

(1)Modbus結(jié)構(gòu)體

typedef struct 
{
  uint16_t addr;

  void (*Protocol_Analysis)(UART_t*);  

} Modbus_t;

(2)Modbus接收數(shù)據(jù)整體框架

#define UART_Order_Index 8
#define FunctionCode_Read_Register 0x03
#define FunctionCode_Write_Register 0x06
#define UART3_Send_LENGTH  20
#define UART3_Rec_LENGTH   20

static void Protocol_Analysis(UART_t* UART)
{
  UART_t* const COM_UART = UART;
  uint8_t i = 0, Index = 0;

  // 1、關(guān)閉接收
  HAL_UART_AbortReceive(&huart3);

  // 2、整理接收數(shù)據(jù)
  for(i=0; i<UART3_Rec_LENGTH; i++)
  {
    if(Index == 0)
    {
        if(*(COM_UART->pucRec_Buffer+i) != Modbus.addr)
        continue;
    }

    *(COM_UART->pucRec_Buffer + Index) = *(COM_UART->pucRec_Buffer + i);
    // 取7字節(jié)
    if(Index == UART_Order_Index) 
      break;        
     
    Index++;
  }

    // 4、校驗(yàn)碼
    CRC_16.CRC_Value = CRC_16.CRC_Check(COM_UART->pucRec_Buffer, 6);
    CRC_16.CRC_H = (u_int8_t)(CRC_16.CRC_Value >> 8);
    CRC_16.CRC_L = (u_int8_t)CRC_16.CRC_Value;

    if(((*(COM_UART->pucRec_Buffer+6) == CRC_16.CRC_L) && (*(COM_UART->pucRec_Buffer+7) == CRC_16.CRC_H))
                                                                                                ||
       ((*(COM_UART->pucRec_Buffer+6) == CRC_16.CRC_H) && (*(COM_UART->pucRec_Buffer+7) == CRC_16.CRC_L)))
    {
            //校驗(yàn)地址
            if((*(COM_UART->pucRec_Buffer+0)) == Modbus.addr)
            {
            // 5、數(shù)據(jù)處理
                if((*(COM_UART->pucRec_Buffer+1)) == FunctionCode_Read_Register)
                {
                    Modbus_Read_Register(COM_UART);
                }
                else if((*(COM_UART->pucRec_Buffer+1)) == FunctionCode_Write_Register)
                {
                    Modbus_Wrtie_Register(COM_UART);
                }   
            }
        }
    
    //清緩存
    for(i=0;i<UART3_Rec_LENGTH;i++)
    {
        *(COM_UART->pucRec_Buffer+i) = 0x00;
    }
}

Modbus_Read_Register函數(shù)數(shù)據(jù)解析(協(xié)議數(shù)據(jù):地址碼+功能碼+數(shù)據(jù)長(zhǎng)度(字節(jié))+發(fā)送數(shù)據(jù)+CRC)連續(xù)讀取從設(shè)備寄存器值返回給主設(shè)備。

static void Modbus_Read_Register(UART_t* UART)
{
  UART_t* const COM_UART = UART;
    
    //校驗(yàn)地址
    if((*(COM_UART->pucRec_Buffer+2) == 0x9C) && (*(COM_UART->pucRec_Buffer+3) == 0x41))
    {
        回應(yīng)數(shù)據(jù)
        //地址碼
        *(COM_UART->pucSend_Buffer+0)  = Modbus.addr;
        //功能碼
        *(COM_UART->pucSend_Buffer+1)  = FunctionCode_Read_Register;
        //數(shù)據(jù)長(zhǎng)度(字節(jié))
        *(COM_UART->pucSend_Buffer+2)  = 2;
        //發(fā)送數(shù)據(jù)
        // deep status
        *(COM_UART->pucSend_Buffer+3)  = 0;
        *(COM_UART->pucSend_Buffer+4) = Deep.Read_Deep();
        *(COM_UART->pucSend_Buffer+5)  = 0;
        *(COM_UART->pucSend_Buffer+6) = 0x66;
        
        //插入CRC
        CRC_16.CRC_Value = CRC_16.CRC_Check(COM_UART->pucSend_Buffer,7); //計(jì)算CRC值
        CRC_16.CRC_H     = (uint8_t)(CRC_16.CRC_Value >> 8);
        CRC_16.CRC_L     = (uint8_t)CRC_16.CRC_Value;
        
        *(COM_UART->pucSend_Buffer+7) = CRC_16.CRC_L;
        *(COM_UART->pucSend_Buffer+8) = CRC_16.CRC_H;

        //發(fā)送數(shù)據(jù)
        UART3.SendArray(COM_UART->pucSend_Buffer,9);
    }
}

Modbus_Wrtie_Register函數(shù)數(shù)據(jù)解析。從主設(shè)備獲取控制從設(shè)備外設(shè)的數(shù)值,解析后控制外設(shè)。

static void Modbus_Wrtie_Register(UART_t* UART)
{
    UART_t* const COM_UART = UART;
    uint8_t i=0;
    
    //回應(yīng)數(shù)據(jù)
    for(i=0;i<8;i++)
    {
        *(COM_UART->pucSend_Buffer+i) = *(COM_UART->pucRec_Buffer+i);
    }
    //發(fā)送數(shù)據(jù)
    UART3.SendArray(COM_UART->pucSend_Buffer,8);

    //解析數(shù)據(jù),控制外設(shè)
    if((*(COM_UART->pucRec_Buffer+2) == 0x9C) && (*(COM_UART->pucRec_Buffer+3) == 0x42))
    {
        if(*(COM_UART->pucRec_Buffer+5) == Deep_Status_ON )
            Deep.Deep_Enable();
        else
            Deep.Deep_Disable();
    }
}

為什么要使能DMA發(fā)送完成中斷才會(huì)觸發(fā)UART的發(fā)送完成中斷?
答案就在代碼里,帶大家解析一遍相關(guān)代碼:

// 調(diào)用HAL_UART_Transmit_DMA函數(shù)實(shí)現(xiàn)DMA發(fā)送
HAL_UART_Transmit_DMA
    -> huart->hdmatx->XferCpltCallback = UART_DMATransmitCplt;   // 設(shè)置發(fā)送完成回調(diào)函數(shù)

static void UART_DMATransmitCplt(DMA_HandleTypeDef *hdma)
{
  UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
  /* DMA Normal mode*/
  if ((hdma->Instance->CCR & DMA_CCR_CIRC) == 0U)
  {
    huart->TxXferCount = 0x00U;

    /* Disable the DMA transfer for transmit request by setting the DMAT bit
       in the UART CR3 register */
    CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT);

    /* Enable the UART Transmit Complete Interrupt */
    SET_BIT(huart->Instance->CR1, USART_CR1_TCIE);            // 當(dāng)DMA發(fā)送完成后,會(huì)使能串口發(fā)送完成中斷

  }
  /* DMA Circular mode */
  else
  {
#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
    /*Call registered Tx complete callback*/
    huart->TxCpltCallback(huart);
#else
    /*Call legacy weak Tx complete callback*/
    HAL_UART_TxCpltCallback(huart);
#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
  }
}

當(dāng)DMA發(fā)送完成后,會(huì)使能串口發(fā)送完成中斷。配置打開UART3中斷總開關(guān)。

HAL_UART_IRQHandler
    -> if (((isrflags & USART_SR_TC) != RESET) && ((cr1its & USART_CR1_TCIE) != RESET))
    -> UART_EndTransmit_IT(huart);
        -> HAL_UART_TxCpltCallback(huart);      // 回調(diào)函數(shù)為弱函數(shù),可重構(gòu)

五、結(jié)果演示以及報(bào)文解析

實(shí)驗(yàn)測(cè)試使用USB轉(zhuǎn)RS485工具。從設(shè)備板子上A B接口連接USB轉(zhuǎn)RS485工具上對(duì)應(yīng)A B接口。主設(shè)備為PC端安裝的MThings進(jìn)行Modbus收發(fā)數(shù)據(jù)測(cè)試。有興趣的小伙伴可以體驗(yàn)下MTings官網(wǎng)
stm32 modbus通信,STM32開發(fā),stm32,單片機(jī),嵌入式硬件,linux,驅(qū)動(dòng)開發(fā)
發(fā)送數(shù)據(jù)報(bào)文解析
stm32 modbus通信,STM32開發(fā),stm32,單片機(jī),嵌入式硬件,linux,驅(qū)動(dòng)開發(fā)

[2023-03-05 13:13:03-802]COM34-發(fā)送:01 06 9c 42 00 01 c6 4e
[2023-03-05 13:13:03-827]COM34-接收:01 06 9c 42 00 01 c6 4e
0x01:主機(jī)要查詢的從設(shè)備地址
0x06:功能碼 修改寫操作
0x9c 0x42:寄存器地址0x9c42轉(zhuǎn)十進(jìn)制地址為40,002
0x00 0x01:寫入地址的數(shù)值為0x01 (控制從設(shè)備蜂鳴器打開)
0xc6 0x4e:CRC校驗(yàn)碼

[2023-03-05 13:13:04-980]COM34-發(fā)送:01 06 9c 42 00 00 07 8e
[2023-03-05 13:13:05-012]COM34-接收:01 06 9c 42 00 00 07 8e
0x01:主機(jī)要查詢的從設(shè)備地址
0x06:功能碼 修改寫操作
0x9c 0x42:寄存器地址0x9c42轉(zhuǎn)十進(jìn)制地址為40,002
0x00 0x01:寫入地址的數(shù)值為0x00 (控制從設(shè)備蜂鳴器關(guān)閉)
0xc6 0x4e:CRC校驗(yàn)碼

接收數(shù)據(jù)報(bào)文解析
stm32 modbus通信,STM32開發(fā),stm32,單片機(jī),嵌入式硬件,linux,驅(qū)動(dòng)開發(fā)

[2023-03-05 13:41:54-954]COM34-發(fā)送:01 06 9c 42 00 01 c6 4e
[2023-03-05 13:41:54-977]COM34-接收:01 06 9c 42 00 01 c6 4e
0x01:從設(shè)備地址
0x06:功能碼 修改寫操作
0x9c 0x42:寄存器地址0x9c42轉(zhuǎn)十進(jìn)制地址為40,002
0x00 0x01:寫入地址的數(shù)值為0x00 (控制從設(shè)備蜂鳴器關(guān)閉)
0xc6 0x4e:CRC校驗(yàn)碼

[2023-03-05 13:41:56-289]COM34-發(fā)送:01 03 9c 41 00 02 ba 4f
0x01:主機(jī)要查詢的從設(shè)備地址
0x03:功能碼 查詢讀操作
0x9c 0x42:寄存器地址0x9c41轉(zhuǎn)十進(jìn)制地址為40,001
0x00 0x02:讀取兩個(gè)數(shù)據(jù)(一個(gè)數(shù)據(jù)2字節(jié))
0xba 0x4f:CRC校驗(yàn)碼

[2023-03-05 13:41:56-320]COM34-接收:01 03 02 00 01 00 66 d9 a3
0x01:告訴主機(jī)自己從設(shè)備地址
0x03:功能碼 讀操作
0x00 0x01:讀出第一個(gè)數(shù)據(jù)為0x01,當(dāng)前蜂鳴器打開狀態(tài)
0x00 0x66:讀取第二個(gè)數(shù)據(jù)為0x66(該值是本猿在代碼中寫死的值,后續(xù)功能會(huì)結(jié)合本章節(jié)modbus功能通信,敬請(qǐng)期待)
0xd9 0xa3:CRC校驗(yàn)碼


六、代碼下載

STM32開發(fā)(六)STM32F103 RS485 Modbus通信代碼文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-779346.html

到了這里,關(guān)于STM32開發(fā)(六)STM32F103 通信 —— RS485 Modbus通信編程詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • stm32f103與openmv串口通信

    串口通信是指通過(guò)串行通信接口進(jìn)行數(shù)據(jù)傳輸?shù)囊环N通信方式。在串口通信中,數(shù)據(jù)被分成一個(gè)個(gè)的字節(jié),按照一定的順序依次發(fā)送和接收。串口通信通常使用UART(通用異步收發(fā)傳輸)協(xié)議進(jìn)行數(shù)據(jù)傳輸。 串口通信在嵌入式系統(tǒng)中應(yīng)用非常廣泛,其主要用途包括: 調(diào)試和監(jiān)

    2024年02月13日
    瀏覽(22)
  • 學(xué)習(xí)記錄之openmv和STM32F103的通信

    分上下位機(jī),下位機(jī)向上位機(jī)發(fā)送數(shù)據(jù)。(上位機(jī)控制,下位機(jī)收集數(shù)據(jù)) 可能用到的函數(shù): UART :通用異步 收/發(fā)器 USART :通用同步/異步 收/發(fā)器 USART_ init() 串口初始化:波特率、數(shù)據(jù)字長(zhǎng),奇偶校驗(yàn),硬件流控及收發(fā)使能 USART_ Cmd 使能串口? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

    2024年02月14日
    瀏覽(25)
  • STM32F103C8T6串口通信

    STM32F103C8T6串口通信

    ? 首先來(lái)看一下需要操作的函數(shù),以及配置的步驟: 圖1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖2?? Code: usart.c #include \\\"usart.h\\\" void ustart_Init(void ) { GPIO_InitTypeDef GPIO_Init_Ustar ; // 定義輸出端口TX的結(jié)構(gòu)體對(duì)象 USART_InitTypeDef USTART_Init; // 定義串口初始化結(jié)構(gòu)體對(duì)象

    2024年02月16日
    瀏覽(27)
  • 關(guān)于兩個(gè)STM32F103系列單片機(jī)的藍(lán)牙通信

    關(guān)于兩個(gè)STM32F103系列單片機(jī)的藍(lán)牙通信

    ? ?畢設(shè)做的是掌控小車,因此采用藍(lán)牙通信作為小車和手部通信,前段時(shí)間做出實(shí)物,對(duì)其遇到的問(wèn)題以及解決的方法做一些總結(jié)。一個(gè)主控芯片采用STM32F103ZET6,另一個(gè)主控芯片采用STM32F103C8T6,原因是本來(lái)準(zhǔn)備了兩個(gè)主控C8T6,不小心燒了一個(gè)。 1.兩個(gè)藍(lán)牙的配對(duì) ?需要準(zhǔn)

    2024年02月13日
    瀏覽(93)
  • AD7606與STM32F103ZET6的串行通信

    AD7606與STM32F103ZET6的串行通信

    ??本文是AD7606與STM32的串行通信的學(xué)習(xí)心得,可幫助你快速入門AD7606。 ??圖一 ??圖二 ??圖三 ??圖四 ??根據(jù)圖一,一些引腳在置高或置低時(shí)的上升或下降沿會(huì)受時(shí)間影響,因此在編寫代碼時(shí),一些對(duì)引腳的操作需要放在一起,且延時(shí)函數(shù)不能隨意使用。 ??圖

    2024年02月08日
    瀏覽(32)
  • STM32CubeIDE開發(fā)(二十二), stm32的RS485/232串口通信開發(fā)要點(diǎn)

    STM32CubeIDE開發(fā)(二十二), stm32的RS485/232串口通信開發(fā)要點(diǎn)

    目錄 一、stm32串口通信 ??????? 1.1 硬件流控 ???????? 1.2 軟件流控 ??????? 1.3 串口通信參數(shù) 二、新建RS485通信工程 ??????? 2.1 項(xiàng)目實(shí)現(xiàn)背景信息 ??????? 2.2 項(xiàng)目配置 ??????? 2.3 代碼實(shí)現(xiàn) ?? 三、RS485驅(qū)動(dòng)調(diào)用及測(cè)試 ??????? 3.1 接口調(diào)用 ?????? 3.2 編

    2024年01月20日
    瀏覽(79)
  • 【STM32】STM32F103C8T6串口通信,實(shí)現(xiàn)3個(gè)串口收發(fā)數(shù)據(jù)

    串口通信(Serial Communications)實(shí)現(xiàn)單片機(jī)與電腦或者其它外設(shè)進(jìn)行通信,通信時(shí)只需兩根線(TX,RX)就可以實(shí)現(xiàn)數(shù)據(jù)傳輸。STM32f103有三個(gè)串口,分別為串口1(RX PA10, TX PA 9),串口2(RX PA3,TX PA2),串口3(RX PB11,TX PB10)。 以下代碼是配置三個(gè)串口: usart.c usart.h main.c 注意,

    2024年02月12日
    瀏覽(28)
  • ESP32 使用RS485模塊實(shí)現(xiàn)Modbus通信(二)

    ESP32 使用RS485模塊實(shí)現(xiàn)Modbus通信(二)

    MODBUS是一種廣泛使用的工業(yè)通信協(xié)議,它允許通過(guò)串行線路在不同設(shè)備之間進(jìn)行通信和數(shù)據(jù)交換。RS485模塊是一個(gè)在ESP32上實(shí)現(xiàn)MODBUS協(xié)議的硬件。在本教程中,我們將使用RS485模塊在ESP32開發(fā)板上創(chuàng)建一個(gè)MODBUS主機(jī)和從機(jī)設(shè)備,并實(shí)現(xiàn)與MODBUS主機(jī)的通信。 多個(gè)Modbus(Server)從機(jī)設(shè)備

    2024年01月20日
    瀏覽(29)
  • 基于STM32F103C8T6的HC-06藍(lán)牙通信

    基于STM32F103C8T6的HC-06藍(lán)牙通信

    如果朋友們 遇到了如下問(wèn)題 ,可以仔細(xì)借鑒本文章和另一篇專門講解 藍(lán)牙通信問(wèn)題 的文章,一定能夠解決你在藍(lán)牙通信時(shí)遇到的諸多困難 1.在調(diào)試藍(lán)牙模塊AT指令時(shí)無(wú)返回值 2.身邊 無(wú)USB轉(zhuǎn)TTL模塊 可以直接調(diào)試藍(lán)牙模塊(本人就是由于無(wú)模塊花了了整整一天才調(diào)試成功)

    2024年02月03日
    瀏覽(33)
  • STM32F103C8T6的USART串口通信及中斷

    STM32F103C8T6的USART串口通信及中斷

    一、串口通信 (一)串口協(xié)議和RS-232標(biāo)準(zhǔn) 1.串口通信協(xié)議 串口通信是指串口按位(bit)發(fā)送和接收字節(jié)。盡管比特字節(jié)(byte)的串行通信慢,但是串口可以在使用一根線發(fā)送數(shù)據(jù)的同時(shí)用另一根線接收數(shù)據(jù)。 串口通信協(xié)議是指規(guī)定了數(shù)據(jù)包的內(nèi)容,內(nèi)容包含了起始位、主體

    2024年02月02日
    瀏覽(26)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包