硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5877|回复: 9
收起左侧

[有问必答] STM32F407 USART1发送字符串乱码

[复制链接]

4

主题

19

回帖

31

积分

新手上路

积分
31
发表于 2016-4-28 10:48:03 | 显示全部楼层 |阅读模式
int main(void)   //主函数
{
uint8_t *str;
           while(1)     
           {
                          str = "Welcome to STM321111";
                         TData(str, 20);
       }
}


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--;
                }
}
回复

使用道具 举报

4

主题

19

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2016-4-28 10:51:24 | 显示全部楼层
如果发送字符串的长度为2的整数次幂,就可以正常发送,如果不是的话发出的就是乱码。请各位大神指点一二!!!在此谢过了!!!
回复

使用道具 举报

4

主题

19

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2016-4-28 11:05:45 | 显示全部楼层
如果发送字符串的长度为2的整数次幂,就可以正常发送,如果不是的话发出的就是乱码。请各位大神指点一二!!!在此谢过了!!!
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2016-4-28 11:56:53 | 显示全部楼层
乱码一般是波特率问题,是不是板子的波特率跟电脑端的波特率一致,另外重要的一点是,你是在往电脑端发送数据吧,看看串口线是否好用。
回复

使用道具 举报

4

主题

19

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2016-4-28 12:57:34 | 显示全部楼层
可能是发送数据的速度太慢。。。
回复

使用道具 举报

4

主题

19

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2016-4-28 13:01:32 | 显示全部楼层

回 eric2013 的帖子

eric2013:乱码一般是波特率问题,是不是板子的波特率跟电脑端的波特率一致,另外重要的一点是,你是在往电脑端发送数据吧,看看串口线是否好用。 (2016-04-28 11:56) 
    波特率程序设置的是115200,串口调试软件设置的也是115200。不知道是不是还有其它的地方没有注意到。
    另外,当发送的字符串长度是2的整数次幂的时候,显示是正常的,不是乱码。
回复

使用道具 举报

4

主题

19

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2016-4-28 13:09:10 | 显示全部楼层

回 eric2013 的帖子

参考程序

参考程序
eric2013:
乱码一般是波特率问题,是不是板子的波特率跟电脑端的波特率一致,另外重要的一点是,你是在往电脑端发送数据吧,看看串口线是否好用。
    程序我是参考STM32F407开发板裸机程序的思路写的,感觉意思是一样的,但是就是打不到同样的效果。
回复

使用道具 举报

4

主题

19

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2016-4-28 14:51:02 | 显示全部楼层

回 eric2013 的帖子

eric2013:乱码一般是波特率问题,是不是板子的波特率跟电脑端的波特率一致,另外重要的一点是,你是在往电脑端发送数据吧,看看串口线是否好用。 (2016-04-28 11:56) 
       eric,我想请教一下,开发板uart发送数据例程中程序的思路是,存一遍缓冲区,然后中断不停地往外发送;还是说要不断的存缓冲区呢?
回复

使用道具 举报

4

主题

19

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2016-4-29 09:27:53 | 显示全部楼层
  1. if(++Txread >= USART1_TX_BUF_SIZE)
  2.                 {
  3.                         Txread = 0;
  4.                 }        
  5.                 if(++Txcounter >= USART1_TX_BUF_SIZE)  //判断发送缓冲区数据个数
  6.                 {
  7.                         Txcounter = 0;
  8.                 }
复制代码
谢谢大家了,问题解决了。问题出在这两个判断语句上。是我对中断发送数据原理理解的太不透彻了!
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2016-4-29 10:52:38 | 显示全部楼层

回 cjhardwork 的帖子

cjhardwork:if(++Txread >= USART1_TX_BUF_SIZE)
                {
                    &nbs .. (2016-04-29 09:27)
[s:142][s:142]

昨天一直忙于QQ群的售后了,不好意思啊。没有及时回复你。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-14 05:21 , Processed in 0.045307 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表