GD32F307接收串口问题

[复制链接]
755|4
 楼主 | 2020-2-5 12:21 | 显示全部楼层 |阅读模式
程序作用:将接收到的数据再发送到电脑上
问题:程序可以进入接收中断,但无法将接收到的数据返回。(我尝试在中断里加一句发送固定值的语句,可以正常发送)
#ifndef MAIN_H
#define MAIN_H
#include "gd32f30x.h"
/****************USART宏定义*******************/
#define DEBUG_UARTx                              UART3
#define DEBUG_UARTx_TX_PORT               GPIOC
#define DEBUG_UARTx_TX_PIN                  GPIO_PIN_10
#define DEBUG_UARTx_RX_PORT               GPIOC
#define DEBUG_UARTx_RX_PIN                  GPIO_PIN_11
#define DEBUG_UARTx_BAUDRATE             115200U
#define DEBUG_UARTx_CLK                       RCU_UART3
#define DEBUG_GPIO_CLK                         RCU_GPIOC
#define DEBUG_UART_IT_SOURCE             UART3_IRQn
/***************函数声明*************************/
void Uart_Init(void);
void Uart_SendByte(uint32_t pUart, uint8_t Data);
void Uart_SendString(uint32_t pUart, char *str);
#endif /* MAIN_H */
/***************************************
  函数名称:Uart_SendByte
    函数功能:发送一个字节
    调用函数:void usart_data_transmit(uint32_t usart_periph, uint32_t data);
              FlagStatus usart_flag_get(uint32_t usart_periph, usart_flag_enum flag);
    入口参数:pUatr: USARTx(x=0,1,2)/UARTx(x=3,4)
              Data: 要发送的数据
    出口参数:无
    返回值:无
****************************************/
void Uart_SendByte(uint32_t pUart, uint8_t Data)
{
   usart_data_transmit(pUart, Data);                                                                               // 发送数据
   while(usart_flag_get(pUart, USART_FLAG_TBE) == RESET);                                          // 等待发送完成
}
/***************************************
  函数名称:Uart_SendString
    函数功能:发送字符串
    调用函数:void usart_data_transmit(uint32_t usart_periph, uint32_t data);
              FlagStatus usart_flag_get(uint32_t usart_periph, usart_flag_enum flag);
              void usart_flag_clear(uint32_t usart_periph, usart_flag_enum flag);
    入口参数:pUatr: USARTx(x=0,1,2)/UARTx(x=3,4)
              str: 要发送的数据
    出口参数:无
    返回值:无
****************************************/
void Uart_SendString(uint32_t pUart, char *str)
{
   unsigned int k;
   k = 0;
    do
    {
        Uart_SendByte(pUart, *(str + k) );                                                           // 发送数据
        k++;
    } while(*(str + k)!='\0');
    while(usart_flag_get(pUart, USART_FLAG_TC) == RESET);                             // 等待发送完成
   usart_flag_clear(pUart, USART_FLAG_TC);                                                     // 清除标志位
}



void  UART3_IRQHandler()
{
   uint8_t ucTemp;                                                                                                             // 用于存储接收的数据
    if (usart_interrupt_flag_get(DEBUG_UARTx, USART_INT_FLAG_RBNE)!= RESET)                  // 判断是否接收成功
   {
       usart_interrupt_flag_clear(DEBUG_UARTx, USART_INT_FLAG_RBNE);                              // 清楚中断位
       ucTemp = (uint8_t)usart_data_receive(DEBUG_UARTx);                                                 // 读取接收的数据
       Uart_SendByte(DEBUG_UARTx, ucTemp);                                                                      // 发送数据
     //Uart_SendByte(DEBUG_UARTx, 0xFF);
  }
}

使用特权

评论回复
| 2020-2-5 19:40 | 显示全部楼层
错误的串口使用方式哦, 应该接收好1整包数据后,再回发。 如果要做接收1个字节,测试马上回发,那个发送标志位查询会阻塞程序从中断处理中跳出,对于整个产品的程序构架来说,是BUG的用法。

使用特权

评论回复
 楼主 | 2020-2-5 22:42 | 显示全部楼层
lvben5d 发表于 2020-2-5 19:40
错误的串口使用方式哦, 应该接收好1整包数据后,再回发。 如果要做接收1个字节,测试马上回发,那个发送标 ...

谢谢指导,已找到原因,是自己电路设计的问题。准备用您的方法也试试

使用特权

评论回复
| 2020-2-6 10:09 | 显示全部楼层
199925msl 发表于 2020-2-5 22:42
谢谢指导,已找到原因,是自己电路设计的问题。准备用您的方法也试试 ...

亲 太客气了。  有空留个邮箱,给你看看我认为比较符合常规的用法的代码参考。

使用特权

评论回复
| 2020-2-6 10:10 | 显示全部楼层
199925msl 发表于 2020-2-5 22:42
谢谢指导,已找到原因,是自己电路设计的问题。准备用您的方法也试试 ...

请尽量按照楼上给你建议的方法去做,假如数据量大且对方发送速度较快的话,你这个程序肯定会漏掉数据的,楼上的方法是正确的。

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表