OpenEdv-开源电子网

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

A板子的串口2向B板子的串口2发数据,但是B板子的串口2接收到的数据是乱的

[复制链接]

2

主题

10

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2014-6-19
在线时间
1 小时
发表于 2014-6-19 15:12:31 | 显示全部楼层 |阅读模式
5金钱
B板子的串口2初始化代码:
[mw_shl_code=c,true]/** * @brief: USART2 初始化 * @param: baud: 波特率 */[/mw_shl_code] [mw_shl_code=c,true]// 波特率:115200 void usart2_init(u32 baud) { float temp; u16 mantissa; u16 fraction; u32 pclk2; pclk2=RCC_ClocksStatus.PCLK2_Frequency; temp=(float)pclk2/(baud*16); //得到USARTDIV mantissa=temp; //得到整数部分 fraction=(temp-mantissa)*16; //得到小数部分 mantissa<<=4; mantissa+=fraction; RCC->APB2ENR|=1<<2; //使能PORTA口时钟 RCC->APB1ENR|=1<<17; //使能串口2时钟 RCC->APB2ENR|=1<<0;// hzh test GPIOA->CRL &= 0XFFFF00FF; GPIOA->CRL |= 0X00008B00;//IO状态设置 RCC->APB1RSTR|=1<<17; //复位串口2 RCC->APB1RSTR&=~(1<<17);//停止复位 //波特率设置 USART2->BRR=mantissa; // 波特率设置 USART2->CR1|=0X200C; //1位停止,无校验位. #ifdef EN_USART1_RX //如果使能了接收 //使能接收中断 USART2->CR1|=1<<8; //PE中断使能 USART2->CR1|=1<<5; //接收缓冲区非空中断使能 //USART2->CR2 |= 0x0200; //USART2->CR2 |= 1<<4; My_NVIC_Init(3,3,USART2_IRQChannel,5);//组5,最低优先级 //My_NVIC_Init(1,0,USART2_IRQChannel,2);//组5,最低优先级 #endif } [/mw_shl_code]

B板子的串口2接收中断:
[mw_shl_code=c,true]//串口2中断服务程序 u8 Usart2RxBuf[USART1_BUF_SIZE];//USART1串口数据缓冲区 u8 Usart2RxStat=0; //接收状态 //接收状态 //bit7,接收完成标志 //bit6,接收到0x0d //bit5~0,接收到的有效字节数目 /** * @brief: 串口中断服务程序 */ void USART2_IRQHandler(void) { u8 res; if(USART2->SR&(1<<5))//接收到数据 { res=USART2->DR; if((Usart2RxStat&0x80)==0)//接收未完成 { if(Usart2RxStat&0x40)//接收到了0x0d { if(res!=0x0a) { Usart2RxStat=0;//接收错误,重新开始 } else { Usart2RxStat|=0x80; //接收完成了 } }else //还没收到0X0D { if(res==0x0d) { Usart2RxStat|=0x40; } else { Usart2RxBuf[Usart2RxStat&0X3F]=res; Usart2RxStat++; if(Usart2RxStat>63) { Usart2RxStat=0;//接收数据错误,重新开始接收 } } } } } } [/mw_shl_code]

A板子的串口2初始化代码(是调用系统函数初始化的):
[mw_shl_code=c,true]USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; 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(USART2, &USART_InitStructure); USART2->CR1 |= 0x0020; USART_Cmd(USART2, ENABLE); [/mw_shl_code]
A板子GPIO口初始化代码:
[mw_shl_code=c,true]/*uart2*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 ; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); [/mw_shl_code]
A板子的发送代码,也是调用的系统函数:
[mw_shl_code=c,true]Print(COM2,"Hello World!\r\n");[/mw_shl_code]

目前的现象是:A板子的串口向PC机发送的数据,用串口工具能正确看到,但是向B板子的串口2发送的数据,B板子的收到的数据是乱码,完全不是自己想要的数据,所以就导致中断里的接收缓冲区一直收不到回车换行,所以缓冲区就一直溢出-->清零,

我是初学者,代码写的乱,不要见怪,还请大家帮帮忙,先谢谢了!!!

最佳答案

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

接了GND,其中一个板子供电就行,数据就能正常收到了!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2014-6-19
在线时间
1 小时
 楼主| 发表于 2014-6-19 15:12:32 | 显示全部楼层
接了GND,其中一个板子供电就行,数据就能正常收到了!
回复

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2014-6-19
在线时间
1 小时
 楼主| 发表于 2014-6-19 17:00:42 | 显示全部楼层
初步认为是时钟源错误,我看论坛中有人指出USART2的时钟源应该是PCLK1的,而我用的是PCLK2的,待我今晚回去实验一番,明日来向大家汇报。
[mw_shl_code=c,true]pclk2=RCC_ClocksStatus.PCLK2_Frequency;[/mw_shl_code]
回复

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2014-6-19
在线时间
1 小时
 楼主| 发表于 2014-6-20 09:51:54 | 显示全部楼层
昨晚试了一下,还是不行,又听说两个板子的GDN要接上,不知道是不是需要???
学软件的伤不起啊。。。。硬件完全不懂。。。。
回复

使用道具 举报

109

主题

1606

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2222
金钱
2222
注册时间
2011-12-15
在线时间
37 小时
发表于 2014-6-20 11:58:49 | 显示全部楼层
gnd需要连接到一起。你波特率什么的都对的吗
专业制作STM32 物联网通信模块板,模块交流群:369840039。
回复

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2014-6-19
在线时间
1 小时
 楼主| 发表于 2014-6-20 15:23:36 | 显示全部楼层
回复【4楼】ST-FAE-SALE:
---------------------------------
两个板子的波特率都是115200

另:多问一句,为什么我用仿真看,串口1的波特率是115200,而串口2的波特率是115384(貌似是这个,反正肯定不是115200),但是如果设9600,则仿真看到的都是9600,不知道115384这个波特率在实际使用中有没有影响?为什么会这样呢?烦请告知,谢谢了!
回复

使用道具 举报

9

主题

126

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
226
金钱
226
注册时间
2014-4-3
在线时间
18 小时
发表于 2014-6-20 16:42:50 | 显示全部楼层
回复【5楼】zhanty:
---------------------------------
这没影响,在允许误差范围内,而且一般都会有点误差,一般硬件的边沿影响都比这大多了,假如差了很多,就是数据是乱的。
回复

使用道具 举报

109

主题

1606

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2222
金钱
2222
注册时间
2011-12-15
在线时间
37 小时
发表于 2014-6-20 17:03:53 | 显示全部楼层
回复【5楼】zhanty:
---------------------------------
是否可以设置在9600测试,因为波特率过高,对晶振的精度要求较高
专业制作STM32 物联网通信模块板,模块交流群:369840039。
回复

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2014-6-19
在线时间
1 小时
 楼主| 发表于 2014-6-20 17:37:33 | 显示全部楼层
回复【7楼】ST-FAE-SALE:
---------------------------------
昨晚试过了,收到的数据,中间会夹杂着其他的字符,比如:本来应该收到“Hello World!”,但是实际收到的是“He$lo W@orld!”类似这种。我估计主要原因是两个板子的GND没接,晚上回去接上再试试,明日通报结果。感谢各位!
回复

使用道具 举报

6

主题

15

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2013-6-3
在线时间
1 小时
发表于 2014-8-8 09:05:17 | 显示全部楼层
LZ把源码发上啊!
没有签名
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-4 11:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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