打印

stm32串口通信问题 有时正确有时乱码 大家帮忙看看程序?

[复制链接]
7318|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tczdon|  楼主 | 2013-5-22 00:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 tczdon 于 2013-6-1 16:20 编辑

#include "stm32f10x.h"

u8 TxData[] = "The string is transmit from STM32!";      
u8 RxData[5];
u8 Rx_Counter=0;                //对接收到得字符计数

/* 函数声明 */
void RCC_Configuration(void);
void NVIC_Configuration(void);
void USART_Configuration(void);

/**************************************** 主函数 *********************************************/
int main(void)
{
        u8 i=0;
        /* 初始化STM32:系统时钟配置(使用外部8MHz晶振,系统时钟倍频至72MHz等)*/
          SystemInit();           
        RCC_Configuration();        //使能USART1的时钟、设置USART1复用端口
        NVIC_Configuration();        //配置中断向量和优先级
        USART_Configuration();        // 初始化USART1
        /*启动时发送缓冲区中的预设数据*/
        USART_ClearFlag(USART1, USART_FLAG_TC);
        for(i=0;TxData!='\0';i++)//这里的发送字符串是正确的
    {
           USART_SendData(USART1, TxData
);
           while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
        }
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);        //使能接收中断

while(Rx_Counter<5)
        {

                for(i=0; i<5; i++)//这里发送接收到的5个字符却有时正常有时乱码,不知是接收的问题还是发送的问题,望哪位大侠给个指示
                {      
                        USART_ClearFlag(USART1, USART_FLAG_TC);
                        USART_SendData(USART1 , RxData
);
                        while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);

                }
        }
        while(1);

}
/********************************GPIO初始化配置 **************************************/
void RCC_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        /*分配时钟*/
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);

        /*初始化GPIOA(PA10==RXD, PA9==TXD)*/
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;           
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        // 复用推挽输出模式
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;           
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;        // 浮空输入模式
        GPIO_Init(GPIOA, &GPIO_InitStructure);
}

/***************************************** NVIC初始化 **************************************/
void NVIC_Configuration(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;         //中断通道USART1中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //抢占优先级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                   //响应优先级
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;        //使能USART1全局中断
        NVIC_Init(&NVIC_InitStructure);
}

/******************************** USART1初始化配置 **************************************/
void USART_Configuration(void)
{
        USART_InitTypeDef USART_InitStructure;
        USART_ClockInitTypeDef USART_ClockInitStructure;

        USART_StructInit(&USART_InitStructure);
        USART_InitStructure.USART_BaudRate =9600;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        USART_InitStructure.USART_Parity = USART_Parity_No;
        USART_InitStructure.USART_Mode        = USART_Mode_Tx|USART_Mode_Rx;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;        
        USART_Init(USART1, &USART_InitStructure);

        USART_ClockStructInit(&USART_ClockInitStructure);
        USART_ClockInit(USART1, &USART_ClockInitStructure);

        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);        //使能接收中断
        USART_ClearFlag(USART1, USART_FLAG_TC);        //清除发送完成标志位
        USART_Cmd(USART1, ENABLE);        //使能USART1
}
/********************************接收数据中断处理**************************************/
void USART1_IRQHandler(void)
{
        
        u8 tmp;
         if(USART_GetITStatus(USART1, USART_IT_RXNE)!=RESET)
        {
           tmp=USART_ReceiveData(USART1);
           if((tmp==0x0d)||(tmp==0x0a))//去掉前面无用的字符
          {
             Rx_Counter=0;
             USART_ClearITPendingBit(USART1,USART_IT_RXNE);
          }
          else
          {
                USART_ClearITPendingBit(USART1, USART_IT_RXNE);        //清除接收中断标志位
                RxData[Rx_Counter]=tmp;        //接收字节送缓冲区
                Rx_Counter++;
          }     
        }

}




沙发
tczdon|  楼主 | 2013-5-22 15:59 | 只看该作者

使用特权

评论回复
板凳
tczdon|  楼主 | 2013-5-22 16:01 | 只看该作者
大师在哪儿啊?

使用特权

评论回复
地板
cjhk| | 2013-5-22 19:09 | 只看该作者
楼主   帮你顶一个   看看别人的意见   顶一个

使用特权

评论回复
5
jeckboy| | 2013-5-24 23:19 | 只看该作者
你写这段程序不知道什么意思,纯粹测试玩?串口驱动在官方的例程里有基本操作方法,你这学得四不像。至少有2处不对:1、接收缓冲区溢出你没有管;2、你本意是先发送这个字符串,同时接收到缓冲区里,再把接收内容发出来,可你是发送完才打开接收中断的。整个程序逻辑一个字:乱!
好好看看论坛里别人给的串口例程,有查询方式、中断方式、查询+中断方式工作的,收发缓冲区一般使用FIFO循环队列,永远不会出错!

使用特权

评论回复
6
jxn98310| | 2013-5-25 10:49 | 只看该作者
程序逻辑有问题 理清思路 认真阅读 STM32编程参考手册

使用特权

评论回复
7
tczdon|  楼主 | 2013-6-1 16:16 | 只看该作者
jeckboy 发表于 2013-5-24 23:19
你写这段程序不知道什么意思,纯粹测试玩?串口驱动在官方的例程里有基本操作方法,你这学得四不像。至少有 ...

呵呵 我这是想测试来做别的东西的。缓冲溢出没管是只想简单测试一下,自己发送合适的字符个数就好。接收中断我在USART_Configuration(void)里就打开了,那条语句是没删掉而已,应该不影响吧?整个程序是先发送一段字符串"The string is transmit from STM32!,再接收PC上我发的字符然后发送回来,就是有时正确有时乱码,不知道还漏了什么,请大师指教!

使用特权

评论回复
8
tczdon|  楼主 | 2013-6-1 16:17 | 只看该作者
cjhk 发表于 2013-5-22 19:09
楼主   帮你顶一个   看看别人的意见   顶一个

谢谢~

使用特权

评论回复
9
tczdon|  楼主 | 2013-6-1 16:18 | 只看该作者
jxn98310 发表于 2013-5-25 10:49
程序逻辑有问题 理清思路 认真阅读 STM32编程参考手册

能指出具体错误么?谢谢啊

使用特权

评论回复
10
1916737701| | 2016-4-19 10:35 | 只看该作者
不知道你有没有解决你的问题,我最近也在学习串口部分,有些问题需要请教下,1916737701我的QQ号,可以加我下吗?

使用特权

评论回复
11
dwq175| | 2016-4-19 14:14 | 只看该作者
while(Rx_Counter<5)//这里错了,没有接收数据时就进入循环了。

使用特权

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

本版积分规则

4

主题

13

帖子

0

粉丝