STM32
直播中

梁宏满

8年用户 1057经验值
私信 关注
[问答]

STM32F103RCT6串口重定向数据发送和接收,如何才能不接收MCU发出去的数据?

不知道各位有没有出现过这样的情况,我使用STM32F103RCT6芯片编写串口程序,重定向printf函数到串口1,数据可以正常地发送和接收,但是有个问题
仿真的时候发现,我每次用printf发出去的数据,接收数组同样会接收到,举个例子,我用串口发送123到上位机,上位机发送456回到MCU,我在中断的
接收函数里的数组 W_Rec[]会接收到123456,本来应该是456才对,我想问下是不是重定向后都会这样,如果不是要如何解决?请大家指点下小弟

附一下代码:
串口配置

  • void USART1_Init(void)
  • {
  •         GPIO_InitTypeDef GPIO_InitStructure;
  •         USART_InitTypeDef USART_InitStructure;

  •         /* config USART1 clock */
  •         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

  •         /* USART1 GPIO config */
  •         /* Configure USART1 Tx (PA.09) as alternate function push-pull */
  •         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  •         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  •         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  •         GPIO_Init(GPIOA,  GPIO_InitStructure);
  •         /* Configure USART1 Rx (PA.10) as input floating */
  •         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  •         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  •         GPIO_Init(GPIOA,  GPIO_InitStructure);

  •         /* USART1 mode config */
  •         USART_InitStructure.USART_BaudRate = 115200;
  •         USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  •         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  •         USART_InitStructure.USART_Parity = USART_Parity_No ;
  •         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  •         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  •         USART_Init(USART1,  USART_InitStructure);
  •         USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

  •         USART_Cmd(USART1, ENABLE);
  • }



  • void USART1_NVIC(void)
  • {
  •         NVIC_InitTypeDef NVIC_InitStructure;
  •         //分配到第0组
  •         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

  •         /* Enable the USARTy Interrupt */
  •         NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  •         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级
  •         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//响应优先级
  •         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  •         NVIC_Init( NVIC_InitStructure);
  • }

重定向函数

  • int fputc(int ch, FILE *f)
  • {
  •         /* 将Printf内容发往串口 */
  •         USART_SendData(USART1, (unsigned char) ch);
  •         while (!(USART1->SR   USART_FLAG_TXE));

  •         return (ch);
  • }

中断函数

  • void USART1_IRQHandler(void)
  • {
  •         uint8_t c;
  •         if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  •         {
  •                    USART_ClearITPendingBit(USART1, USART_IT_RXNE);
  •            // W_Rec[wn++] = USART1->DR;
  •                         c = USART_ReceiveData(USART1);
  •                         W_Rec[wn++] = c;

  •         }

  • }

请大家指点下如何才能不接收MCU发出去的数据

回帖(1)

尚文清

2024-5-16 18:16:32
为了解决这个问题,我们需要确保STM32F103RCT6芯片的串口接收和发送是分开的,而不是将发送的数据直接添加到接收数组中。以下是解决这个问题的步骤:

1. 首先,确保你已经正确配置了串口的GPIO引脚。这可以通过GPIO_InitTypeD结构体来完成。

2. 接下来,配置串口的时钟和波特率。这可以通过RCC_APB2PeriphClockCmd和USART_InitTypeD结构体来完成。

3. 为了重定向printf函数到串口1,你需要实现一个自定义的_write函数。这个函数将在printf调用时被调用,并将数据发送到串口1。

```c
int _write(int file, char *ptr, int len)
{
    for (int i = 0; i < len; i++)
    {
        while (!(USART1->SR & 0x40)); // 等待发送数据寄存器为空
        USART_SendData(USART1, *ptr++); // 发送数据
    }
    return len;
}
```

4. 在你的主函数中,调用freopen函数来重定向stdout到串口1。

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

    freopen(NULL, "w", stdout); // 重定向printf到串口1

    // ... 其他代码 ...

    return 0;
}
```

5. 在USART1的中断接收回调函数中,确保只处理接收到的数据,而不是将发送的数据添加到接收数组中。

```c
void USART1_IRQHandler(void)
{
    if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {
        // 读取接收到的数据
        uint8_t data = (uint8_t)USART_ReceiveData(USART1);

        // 处理接收到的数据,例如将其存储在接收数组中
        W_Rec[rec_count++] = data;

        // 清除接收中断标志
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
    }
}
```

通过以上步骤,你应该可以避免在接收数组中接收到发送的数据。如果问题仍然存在,请检查你的代码,确保没有其他地方将发送的数据添加到接收数组中。
举报

更多回帖

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