<output id="hxt7n"><dfn id="hxt7n"><form id="hxt7n"></form></dfn></output>

<track id="hxt7n"><progress id="hxt7n"><th id="hxt7n"></th></progress></track>
<address id="hxt7n"><big id="hxt7n"></big></address>

      <sub id="hxt7n"></sub>

      搜索
      打印

      GD32F307接收串口问题

      [复制链接]
      926|7
      跳转到指定楼层
      楼主
      程序作用:将接收到的数据再发送到电脑上
      问题:程序可以进入接收中断,但无法将接收到的数据返回。(我尝试在中断里加一句发送固定值的语句,可以正常发送)
      #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
      谢谢指导,已找到原因,是自己电路设计的问题。准备用您的方法也试试 ...

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

      使用特权

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

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

      使用特权

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

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

      使用特权

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

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

      使用特权

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


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

      使用特权

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

      本版积分规则

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

      快速回复

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

      论坛热帖

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