STM32FF407串口发送数据错误,调试时显示缓冲区数据是正确的,请大家帮帮忙看一下,不胜感激!

2019-07-20 22:34发布

附代码如下:
void TData(uint8_t *_usBuf, uint8_t _usLen)   {          uint8_t  Tx_Status, Txread, Txwrite, Txcounter;        uint16_t  i;                       Txread =p_uart.Tx_read;        Txcounter =p_uart.Tx_counter;                      //将待发送数据缓冲区写入UART发送数据缓冲区        for(i=0; i<_usLen;i++)        {                 if(++Txread>= USART1_TX_BUF_SIZE)                 {                         Txread= 0;                 }                                         if(++Txcounter>= USART1_TX_BUF_SIZE)  //判断发送缓冲区数据个数                 {                         Txcounter= 0;                 }                                   p_uart.pTxBuf[p_uart.Tx_write]= _usBuf;                      if(++p_uart.Tx_write>= USART1_TX_BUF_SIZE)                      {                         p_uart.Tx_write= 0;                 }                 p_uart.Tx_counter++;                                       }        USART_ITConfig(USART1, USART_IT_TXE,ENABLE);  

if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)     {             USART_ClearITPendingBit(USART1,USART_IT_TXE);             if(p_uart.Tx_read== p_uart.Tx_write)            //没有新数据             {                     USART_ITConfig(USART1,USART_IT_TXE, DISABLE);                                         USART_ITConfig(USART1,USART_IT_TC, ENABLE);                }             else             {                     USART_SendData(USART1,p_uart.pTxBuf[p_uart.Tx_read]);                     while(USART_GetFlagStatus(USART1,USART_FLAG_TXE == RESET));                                         if(++p_uart.Tx_read>= USART1_TX_BUF_SIZE)                     {                       p_uart.Tx_read = 0;                     }                     p_uart.Tx_counter--;             }}        else if(USART_GetITStatus(USART1, USART_IT_TC) !=RESET){      USART_ClearITPendingBit(USART1,USART_IT_TC);    //清除发送完成标志位      if(p_uart.Tx_read == p_uart.Tx_write)            //没有新数据      {        USART_ITConfig(USART1, USART_IT_TC,DISABLE);   //关闭发送完成中断      }      else             {                     USART_SendData(USART1,p_uart.pTxBuf[p_uart.Tx_read]);                     while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);                                           if(++p_uart.Tx_read>= USART1_TX_BUF_SIZE)                     {                             p_uart.Tx_read= 0;                     }                     p_uart.Tx_counter--;             }}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
DAY_AND_DAY
1楼-- · 2019-07-22 13:18
xuyaqi 发表于 2016-4-27 17:19
要想别人帮你还是把工程贴出来,这种片段别人没法帮。

我就是想实现最简单的利用串口USART1发送字符串功能,其它的不外乎就是一些GPIO、USART、NVIC的配置了吧。
openedvadmin
2楼-- · 2019-07-22 13:36
 精彩回答 2  元偷偷看……
DAY_AND_DAY
3楼-- · 2019-07-22 15:30
openedvadmin 发表于 2016-4-28 12:11
你这个代码,总是感觉读起来很古怪。你这个里面多次使用中断判断, 中断服务函数呢?

  不好意思,少些了一个“}”;
  USART_ITConfig(USART1, USART_IT_TXE,ENABLE);  这句话之后的函数就是中断处理函数。
openedvadmin
4楼-- · 2019-07-22 19:00
DAY_AND_DAY 发表于 2016-4-28 05:30
不好意思,少些了一个“}”;
  USART_ITConfig(USART1, USART_IT_TXE,ENABLE);  这句话之后的函数就 ...

那你最好编辑了重新贴一下代码。。。使用帖代码的按钮。
DAY_AND_DAY
5楼-- · 2019-07-22 23:29
openedvadmin 发表于 2016-4-28 14:52
那你最好编辑了重新贴一下代码。。。使用帖代码的按钮。

[mw_shl_code=c,true]int main(void)
{
          uint8_t *str;
            while(1)     
            {
                 str = "Welcome to STM321111";
                TData(str, 20);
          }
}
[/mw_shl_code]

[mw_shl_code=c,true]void TData(uint8_t *_usBuf, uint8_t _usLen)      //将数据存入缓冲区
{  
        uint8_t  Tx_Status, Txread, Txwrite, Txcounter;
        uint16_t  i;        
       
        Txread = p_uart.Tx_read;
        Txcounter = p_uart.Tx_counter;       
       
        //将待发送数据缓冲区写入UART发送数据缓冲区
        for(i=0; i<_usLen; i++)
        {
                if(++Txread >= USART1_TX_BUF_SIZE)
                {
                        Txread = 0;
                }       
               
                if(++Txcounter >= USART1_TX_BUF_SIZE)  //判断发送缓冲区数据个数
                {
                        Txcounter = 0;
                }
               
                p_uart.pTxBuf[p_uart.Tx_write] = _usBuf;     
                if(++p_uart.Tx_write >= USART1_TX_BUF_SIZE)     
                {
                        p_uart.Tx_write = 0;
                }
                p_uart.Tx_counter++;                               
        }
        USART_ITConfig(USART1, USART_IT_TXE, ENABLE);   
}
[/mw_shl_code]

[mw_shl_code=c,true]if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)   //发送寄存器空中断处理函数
{
                USART_ClearITPendingBit(USART1, USART_IT_TXE);
                if(p_uart.Tx_read == p_uart.Tx_write)            //没有新数据
                {
                        USART_ITConfig(USART1, USART_IT_TXE, DISABLE);                         
                        USART_ITConfig(USART1, USART_IT_TC, ENABLE);   
                }
                else
                {
                        USART_SendData(USART1, p_uart.pTxBuf[p_uart.Tx_read]);
                        while(USART_GetFlagStatus(USART1, USART_FLAG_TXE == RESET));                       
                        if(++p_uart.Tx_read >= USART1_TX_BUF_SIZE)
                        {
                          p_uart.Tx_read = 0;
                        }
                        p_uart.Tx_counter--;
                }
}
       
else if(USART_GetITStatus(USART1, USART_IT_TC) !=RESET)   //发送完成中断处理函数
{
          USART_ClearITPendingBit(USART1, USART_IT_TC);    //清除发送完成标志位
          if(p_uart.Tx_read == p_uart.Tx_write)            //没有新数据
          {
            USART_ITConfig(USART1, USART_IT_TC, DISABLE);   //关闭发送完成中断
          }
          else
            {
                        USART_SendData(USART1, p_uart.pTxBuf[p_uart.Tx_read]);
                        while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);                       
                        if(++p_uart.Tx_read >= USART1_TX_BUF_SIZE)
                        {
                                p_uart.Tx_read = 0;
                        }
                        p_uart.Tx_counter--;
                }
}
[/mw_shl_code]

DAY_AND_DAY
6楼-- · 2019-07-23 03:42
openedvadmin 发表于 2016-4-28 14:52
那你最好编辑了重新贴一下代码。。。使用帖代码的按钮。

嗯,这样看着顺眼多了!

一周热门 更多>