打印

GD32F307接收串口问题

[复制链接]
1927|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
199925msl|  楼主 | 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);
  }
}

使用特权

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

使用特权

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

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

使用特权

评论回复
地板
lvben5d| | 2020-2-6 10:09 | 只看该作者
199925msl 发表于 2020-2-5 22:42
谢谢指导,已找到原因,是自己电路设计的问题。准备用您的方法也试试 ...

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

使用特权

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

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

使用特权

评论回复
6
szhxz1234| | 2020-3-4 10:21 | 只看该作者
lvben5d 发表于 2020-2-6 10:09
亲 太客气了。  有空留个邮箱,给你看看我认为比较符合常规的用法的代码参考。 ...

大神,能把代码发给我吗?邮箱:84234490@qq.com
谢谢大神

使用特权

评论回复
7
lvjian108| | 2020-3-30 22:57 | 只看该作者
lvben5d 发表于 2020-2-6 10:09
亲 太客气了。  有空留个邮箱,给你看看我认为比较符合常规的用法的代码参考。 ...

你好,可否将你的代码发我一份参考学习下,谢谢。邮箱lvjian_miaojie108@163.com

使用特权

评论回复
8
199925msl|  楼主 | 2020-4-3 14:44 | 只看该作者
本帖最后由 199925msl 于 2020-4-3 14:57 编辑
lvben5d 发表于 2020-2-6 10:09
亲 太客气了。  有空留个邮箱,给你看看我认为比较符合常规的用法的代码参考。 ...


您好,我的邮箱是m199925_msl@163.com,期待您的指导,谢谢啦

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

7

帖子

0

粉丝