STM32
直播中

王桂英

7年用户 1329经验值
私信 关注
[问答]

stm32的modbus.c文件,如何触发串口发送中断?

从网上下载了个STM32的modbus.c文件,有些地方看不懂,来论坛求救.
供用户调用的有三个函数:
    1.void ModInit(u8 Id);                    //modbus初始化
    2.void ModRcv(void);                    //modbus信息接收,放在串口接收中断
    3.void ModSend(void);                    //modbus信息接收,放在串口接收中断
函数1和2很好理解.3就不明白了,我估计后面的注释写错了,这算是个串口发送函数,不应该放在串口中断里.
完整函数如下:

  • /*        º¯Êý¹¦ÄÜ£ºÓÃÓÚModbusÐÅÏ¢·¢ËÍ
  •          º¯ÊýÊäÈ룺ÎÞ¡£
  •         º¯ÊýÊä³ö£ºÎÞ¡£        */
  • void ModSend(void)
  • {
  •         Send_Data = *(PointToSendBuf + Send_Num);
  •           USART_SendData(USART1, Send_Data);
  •         Send_Num++;
  •         if(Send_Num > (*PointToSendBuf))        //·¢ËÍÒѾ­Íê³É
  •         {
  •                 Comu_Busy = 0;
  •                 *PointToSendBuf = 0;
  •                 Rcv_Num = 0;
  •                 Send_Num = 1;
  •                 //Æô¶¯Êý¾Ý·¢ËÍ
  •             USART_ITConfig(USART1, USART_IT_TC, DISABLE);//¹Ø±ÕÊý¾Ý·¢ËÍÖжÏ
  •         }
  • }

一开始我以为是将函数3放在串口发送中断里,但疑惑的是,没有触发发送中断的条件.
后来bing搜索了下,貌似USART_ITConfig(USART1, USART_IT_TC, DISABLE);这个函数,使能发送中断后,会发送个空白帧?从而引发第一次串口发送中断.
所以说,这个函数应该作为个串口发送函数放在modbus处理程序里而不是放在串口中断里?
是不是这样呢?

回帖(1)

微风挽雨

2024-5-10 17:00:24
要触发串口发送中断,您需要按照以下步骤操作:

1. 首先,确保您已经正确初始化了串口。在STM32中,这通常涉及到配置GPIO引脚、时钟、串口波特率等。您可以在STM32CubeMX工具中进行这些配置,然后生成初始化代码。

2. 在您的主函数中,调用`ModInit(u8 Id);`函数来初始化Modbus。这个函数通常会配置串口的接收和发送中断,以及初始化Modbus相关的变量。

```c
int main(void) {
    // 其他初始化代码...

    // 初始化Modbus
    ModInit(1);

    // 其他代码...
}
```

3. 在`Modbus.c`文件中,找到`ModRcv(void)`函数。这个函数应该包含了串口接收中断的处理逻辑。确保在接收到数据时,会调用`ModSend(void)`函数来发送数据。

```c
void ModRcv(void) {
    // 接收数据的处理逻辑...

    // 调用ModSend函数来发送数据
    ModSend();
}
```

4. 在STM32的中断向量表中,找到串口接收中断的入口。这通常是`USARTx_IRQHandler`,其中`x`是您使用的串口号(如USART1、USART2等)。

5. 在您的代码中,实现串口接收中断处理函数。在这个函数中,调用`HAL_UART_Receive_IT()`函数来启动串口接收中断。

```c
void USARTx_IRQHandler(void) {
    // 检查是否是接收中断
    if (HAL_UART_Receive_IT(&huart1, &rxBuffer, 1) == HAL_OK) {
        // 接收到数据后,调用ModRcv函数
        ModRcv();
    }
}
```

6. 确保在初始化串口时,已经开启了接收中断。这通常是在`ModInit(u8 Id);`函数中完成的。

```c
void ModInit(u8 Id) {
    // 其他初始化代码...

    // 开启串口接收中断
    HAL_UART_Receive_IT(&huart1, &rxBuffer, 1);
}
```

通过以上步骤,当串口接收到数据时,会触发接收中断,然后调用`ModRcv(void)`函数。在`ModRcv(void)`函数中,又会调用`ModSend(void)`函数来发送数据。这样就实现了通过串口接收中断来触发发送中断的功能。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分