OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3686|回复: 11

STM32F407串口通信

[复制链接]

1

主题

10

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-1-18
在线时间
4 小时
发表于 2018-1-25 09:54:26 | 显示全部楼层 |阅读模式
1金钱
我按照教程配置库函数,发送数据,会是不是出现乱码,我以为是,没有接收完又再次发送数据的原因,我又下载例程,发现PC端接收到的数据还是乱码是什么原因啊?[mw_shl_code=c,true]void uart_init(u32 bound){
   //GPIO¶Ë¿ÚÉèÖÃ
  GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //ʹÄÜGPIOAʱÖÓ
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//ʹÄÜUSART1ʱÖÓ

        //´®¿Ú1¶ÔÓ¦Òý½Å¸´ÓÃÓ³Éä
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9¸´ÓÃΪUSART1
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10¸´ÓÃΪUSART1
       
        //USART1¶Ë¿ÚÅäÖÃ
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9ÓëGPIOA10
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//¸´Óù¦ÄÜ
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //ËÙ¶È50MHz
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //ÍÆÍ츴ÓÃÊä³ö
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //ÉÏÀ­
        GPIO_Init(GPIOA,&GPIO_InitStructure); //³õʼ»&macrA9£&notA10

   //USART1 ³õʼ»¯ÉèÖÃ
        USART_InitStructure.USART_BaudRate = bound;//²¨ÌØÂÊÉèÖÃ
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö³¤Îª8λÊý¾Ý¸ñʽ
        USART_InitStructure.USART_StopBits = USART_StopBits_1;//Ò»¸öֹͣλ
        USART_InitStructure.USART_Parity = USART_Parity_No;//ÎÞÆæÅ¼Ð£Ñéλ
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎÞÓ²¼þÊý¾ÝÁ÷¿ØÖÆ
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //ÊÕ·¢Ä£Ê½
  USART_Init(USART1, &USART_InitStructure); //³õʼ»¯´®¿Ú1
       
  USART_Cmd(USART1, ENABLE);  //ʹÄÜ´®¿Ú1
       
        //USART_ClearFlag(USART1, USART_FLAG_TC);
       
#if EN_USART1_RX       
        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//¿ªÆôÏà¹ØÖжÏ

        //Usart1 NVIC ÅäÖÃ
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//´®¿Ú1ÖжÏͨµÀ
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//ÇÀÕ¼ÓÅÏȼ¶3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;                //×ÓÓÅÏȼ¶3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQͨµÀʹÄÜ
        NVIC_Init(&NVIC_InitStructure);        //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷¡¢

#endif
       
}


void USART1_IRQHandler(void)                        //´®¿Ú1ÖжϷþÎñ³ÌÐò
{
        u8 Res;
#if SYSTEM_SUPPORT_OS                 //Èç¹ûSYSTEM_SUPPORT_OSÎªÕæ£¬ÔòÐèÒªÖ§³ÖOS.
        OSIntEnter();   
#endif
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //½ÓÊÕÖжÏ(½ÓÊÕµ½µÄÊý¾Ý±ØÐëÊÇ0x0d 0x0a½áβ)
        {
                Res =USART_ReceiveData(USART1);//(USART1->DR);        //¶ÁÈ¡½ÓÊÕµ½µÄÊý¾Ý
               
                if((USART_RX_STA&0x8000)==0)//½ÓÊÕδÍê³É
                {
                        if(USART_RX_STA&0x4000)//½ÓÊÕµ½ÁË0x0d
                        {
                                if(Res!=0x0a)USART_RX_STA=0;//½ÓÊÕ´íÎó,ÖØÐ¿ªÊ¼
                                else USART_RX_STA|=0x8000;        //½ÓÊÕÍê³ÉÁË
                        }
                        else //»¹Ã»ÊÕµ½0X0D
                        {       
                                if(Res==0x0d)USART_RX_STA|=0x4000;
                                else
                                {
                                        USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
                                        USART_RX_STA++;
                                        if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//½ÓÊÕÊý¾Ý´íÎó,ÖØÐ¿ªÊ¼½ÓÊÕ          
                                }                 
                        }
                }                    
  } [/mw_shl_code]
这是乱码的图片

QQ截图20180125095527.png

最佳答案

查看完整内容[请看2#楼]

解决了,当我把波特率设置为9600就没有乱码了,这是为什么呀?115200不行吗?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-1-18
在线时间
4 小时
 楼主| 发表于 2018-1-25 09:54:27 | 显示全部楼层
解决了,当我把波特率设置为9600就没有乱码了,这是为什么呀?115200不行吗?
回复

使用道具 举报

0

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
361
金钱
361
注册时间
2016-11-1
在线时间
119 小时
发表于 2018-1-25 09:58:15 | 显示全部楼层
你调用uart_init时传入的参数是115200吗?
回复

使用道具 举报

22

主题

92

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2018-1-16
在线时间
74 小时
发表于 2018-1-25 10:39:15 | 显示全部楼层
看看程序里波特率设置的对不对。。
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-1-18
在线时间
4 小时
 楼主| 发表于 2018-1-25 14:24:53 | 显示全部楼层
Noctis 发表于 2018-1-25 09:58
你调用uart_init时传入的参数是115200吗?

嗯嗯主函数中设置的是115200波特率
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-1-18
在线时间
4 小时
 楼主| 发表于 2018-1-25 14:28:36 | 显示全部楼层
Miracle223 发表于 2018-1-25 10:39
看看程序里波特率设置的对不对。。

[mw_shl_code=c,true]int main(void)
{

        u8 t;
        u8 len;       
        u16 times=0;  
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//ÉèÖÃϵͳÖжÏÓÅÏȼ¶·Ö×é2
        delay_init(168);                //ÑÓʱ³õʼ»¯
        uart_init(115200);        //´®¿Ú³õʼ»¯²¨ÌØÂÊΪ115200
        LED_Init();                                  //³õʼ»¯ÓëLEDÁ¬½ÓµÄÓ²¼þ½Ó¿Ú  
        while(1)
        {
                if(USART_RX_STA&0x8000)
                {                                          
                        len=USART_RX_STA&0x3fff;//µÃµ½´Ë´Î½ÓÊÕµ½µÄÊý¾Ý³¤¶È
                        printf("\r\nÄú·¢Ë͵ÄÏûϢΪ:\r\n");
                        for(t=0;t<len;t++)
                        {
                                USART_SendData(USART1, USART_RX_BUF[t]);         //&Iuml;ò&acute;&reg;&iquest;&Uacute;1·&cent;&Euml;&Iacute;&Ecirc;&yacute;&frac34;&Yacute;
                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//&micro;&Egrave;&acute;&yacute;·&cent;&Euml;&Iacute;&frac12;á&Ecirc;&oslash;
                        }
                        printf("\r\n\r\n");//&sup2;&aring;&Egrave;&euml;&raquo;&raquo;&ETH;&ETH;
                        USART_RX_STA=0;
                }else
                {
                        times++;
                        if(times%5000==0)
                        {
                                printf("\r\nALIENTEK &Igrave;&frac12;&Euml;÷&Otilde;&szlig;STM32F407&iquest;&ordf;·&cent;°&aring; &acute;&reg;&iquest;&Uacute;&Ecirc;&micro;&Ntilde;é\r\n");
                                printf("&Otilde;&yacute;&micro;&atilde;&Ocirc;&shy;×&Oacute;@ALIENTEK\r\n\r\n\r\n");
                        }
                        if(times%200==0)printf("&Ccedil;&euml;&Ecirc;&auml;&Egrave;&euml;&Ecirc;&yacute;&frac34;&Yacute;,&Ograve;&Ocirc;&raquo;&Oslash;&sup3;&micro;&frac14;ü&frac12;á&Ecirc;&oslash;\r\n");  
                        if(times%30==0)LED0=!LED0;//&Eacute;&Aacute;&Euml;&cedil;LED,&Igrave;á&Ecirc;&frac34;&Iuml;&micro;&Iacute;&sup3;&Otilde;&yacute;&Ocirc;&Uacute;&Ocirc;&Euml;&ETH;&ETH;.
                        delay_ms(10);   
                }
        }
}[/mw_shl_code]
回复

使用道具 举报

0

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
361
金钱
361
注册时间
2016-11-1
在线时间
119 小时
发表于 2018-1-25 14:31:40 | 显示全部楼层
看你的图片好像你发的都的中文,有没有试过发英文字符?
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-1-18
在线时间
4 小时
 楼主| 发表于 2018-1-26 09:35:42 | 显示全部楼层
Noctis 发表于 2018-1-25 14:31
看你的图片好像你发的都的中文,有没有试过发英文字符?

试过了,发送英文字符的话会好点,但时不时还是会出现乱码,我把波特率改为9600就不会出现乱码了,我想知道这是为什么?
回复

使用道具 举报

0

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
361
金钱
361
注册时间
2016-11-1
在线时间
119 小时
发表于 2018-1-26 09:57:50 | 显示全部楼层
eieieiei 发表于 2018-1-26 09:35
试过了,发送英文字符的话会好点,但时不时还是会出现乱码,我把波特率改为9600就不会出现乱码了,我想知 ...

可能是你的线不够好,或者是你的usb转串口模块有些问题吧
回复

使用道具 举报

0

主题

126

帖子

0

精华

高级会员

Rank: 4

积分
502
金钱
502
注册时间
2016-11-28
在线时间
97 小时
发表于 2018-1-26 23:44:50 | 显示全部楼层
时钟树根本不对
回复

使用道具 举报

3

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
448
金钱
448
注册时间
2016-9-16
在线时间
51 小时
发表于 2018-1-28 09:20:53 | 显示全部楼层
之前也遇到这个问题,波特率高了,发中文偶尔会出现乱码,英文就不会有乱码,不知道是不是串口助手的问题。
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-1-18
在线时间
4 小时
 楼主| 发表于 2018-1-28 15:48:04 | 显示全部楼层
apricity 发表于 2018-1-28 09:20
之前也遇到这个问题,波特率高了,发中文偶尔会出现乱码,英文就不会有乱码,不知道是不是串口助手的问题。

嗯嗯,我也觉得有可能,搜了一下,有的解释是波特率太高,干扰太大了
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 21:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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