OpenEdv-开源电子网

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

STM32F417ZG的串口5发送不正常

[复制链接]

11

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2015-7-6
在线时间
5 小时
发表于 2015-7-30 15:27:01 | 显示全部楼层 |阅读模式
5金钱
我想让串口5接受一个字节,再通过串口5发送出去,但是发送总是多个00,然后我通过发送多个字节发现,最后还是多发送个字节00,不知道为什么(如主程序所示,应该发送01 02 03 buffer接收的数据 04 05,可是发送的确是01 02 03 buffer接收的数据 04 05 00)


485的程序

主函数:
[mw_shl_code=c,true]
[mw_shl_code=c,true]#include "sys.h" #include "delay.h" #include "UART5.h" u8 buffer,flag; void main() { Stm32_Clock_Initial(336,26,2,7); delay_initial(168); UART5_Initial(42,9600); RS485_DE=0; //RS485接收模式 RS485_RE=0; while(1) { //如果串口5接收到数据,再将此数据由串口5发送回去 if(flag) { flag=0; RS485_DE=1; //RS485发送模式 RS485_RE=1; UART5_Send_Data(0x01); RS485_DE=0; //RS485接收模式 RS485_RE=0; RS485_DE=1; //RS485发送模式 RS485_RE=1; UART5_Send_Data(0x02); RS485_DE=0; //RS485接收模式 RS485_RE=0; RS485_DE=1; //RS485发送模式 RS485_RE=1; UART5_Send_Data(0x03); RS485_DE=0; //RS485接收模式 RS485_RE=0; RS485_DE=1; //RS485发送模式 RS485_RE=1; UART5_Send_Data(buffer); RS485_DE=0; //RS485接收模式 RS485_RE=0; RS485_DE=1; //RS485发送模式 RS485_RE=1; UART5_Send_Data(0x04); RS485_DE=0; //RS485接收模式 RS485_RE=0; RS485_DE=1; //RS485发送模式 RS485_RE=1; UART5_Send_Data(0x05); RS485_DE=0; //RS485接收模式 RS485_RE=0; } } }[/mw_shl_code]
[/mw_shl_code]
串口函数:
[mw_shl_code=c,true]#include "sys.h" #include "UART5.h" /*初始化串口5*/ void UART5_Initial(u32 pclk1,u32 baudrate) { float temp; u16 mantissa,fraction; temp=(float)(pclk1*1000000)/(baudrate*16); //计算USARTDIV mantissa=temp; //计算整数部分 fraction=(temp-mantissa)*16; //计算小数部分 mantissa<<=4; mantissa+=fraction; RCC->AHB1ENR|=1<<2; //端口C时钟使能 RCC->AHB1ENR|=1<<3; //端口D时钟使能 GPIO_Set(GPIOD,PIN0|PIN1,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PD0-RS485_DE,PD1-RS485_RE GPIO_Set(GPIOC,PIN12,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU); //PC12-UART5_TX GPIO_AF_Set(GPIOC,12,8); GPIO_Set(GPIOD,PIN2,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU); //PD2-UART5_RX GPIO_AF_Set(GPIOD,2,8); RCC->APB1ENR|=1<<20; //串口5时钟使能 RCC->APB1RSTR|=1<<20; //复位串口5 RCC->APB1RSTR&=~(1<<20); //停止复位 UART5->BRR=mantissa; //波特率设置 UART5->CR1&=~(1<<15); //16倍过采样 UART5->CR1|=1<<3; //使能发送器 #if UART5_RECEIVE //使能接收 UART5->CR1|=1<<2; //使能接收器 UART5->CR1|=1<<5; //使能接收中断 MY_NVIC_Initial(3,3,UART5_IRQn,2);//组2,最低优先级 #endif UART5->CR1|=1<<13; //使能UART5 } /*串口5发送单字节数据*/ void UART5_Send_Data(u8 c) { UART5->CR1&=~(1<<5); //禁止接收中断 UART5->DR=c; while(!(UART5->SR&(1<<6))); //等待发送结束 #if UART5_RECEIVE //使能接收 UART5->CR1|=1<<5; //使能接收中断 #endif } #if UART5_RECEIVE //使能接收 /*串口5中断响应函数,接收单字节数据*/ void UART5_IRQHandler() { if(UART5->SR&(1<<5)) //已准备好读取接收到的数据 { buffer=UART5->DR; //将接收的数据存入缓冲数组 flag=1; } } #endif [/mw_shl_code]
串口函数头文件:
[mw_shl_code=c,true]#ifndef __UART5_H #define __UART5_H #include "sys.h" /*串口5相关引脚定义*/ #define RS485_DE PDout(0) //0-接收,1-发送 #define RS485_RE PDout(1) //0-接收,1-发送 /*串口5相关函数声明*/ void UART5_Initial(u32 pclk1,u32 baudrate); void UART5_Send_Data(u8 c); /*串口5中断接收控制*/ #define UART5_RECEIVE 1 //0-禁止,1-使能 /*串口5相关全局变量声明*/ extern u8 buffer,flag; #endif [/mw_shl_code]


最佳答案

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

回复【8楼】1860xq: --------------------------------- 这个可能存在这个问题。 建议参考我们战舰V3的RS485电路。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-7-30 15:27:02 | 显示全部楼层
回复【8楼】1860xq:
---------------------------------
这个可能存在这个问题。
建议参考我们战舰V3的RS485电路。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-7-30 20:43:40 | 显示全部楼层
抗上去没啥问题啊,没经过485芯片吧?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

11

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2015-7-6
在线时间
5 小时
 楼主| 发表于 2015-7-31 08:05:37 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
经过485了,能够发送,但发送的最后一个字节总是00,不知道什么原因,请正点原子老师指教
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-7-31 11:19:16 | 显示全部楼层
回复【3楼】1860xq:
---------------------------------
是多出来的无用数据吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

11

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2015-7-6
在线时间
5 小时
 楼主| 发表于 2015-7-31 13:31:05 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
原子老师,确实是最后多出来一个的无用数据00,怎么才能避免呢?(上述程序略有改动)
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-7-31 23:01:06 | 显示全部楼层
回复【5楼】1860xq:
---------------------------------
485切换模式的时候出来的,你的485电路是什么样的?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

11

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2015-7-6
在线时间
5 小时
 楼主| 发表于 2015-8-1 06:31:59 | 显示全部楼层



回复

使用道具 举报

11

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2015-7-6
在线时间
5 小时
 楼主| 发表于 2015-8-1 06:32:24 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
原子老师,图在6楼
回复

使用道具 举报

11

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2015-7-6
在线时间
5 小时
 楼主| 发表于 2015-8-2 09:42:16 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
谢谢原子老师
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 00:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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