求助STM32F407VG串口通信的接收与发送接收数据有误

【原创】stm32f407(cortex-M4)USART串口调试程序_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
【原创】stm32f407(cortex-M4)USART串口调试程序
&&stm32f407(cortex-M4)USART串口调试程序
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩7页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢查看: 444|回复: 4
STM32F407串口1问题
主题帖子精华
中级会员, 积分 286, 距离下一级还需 214 积分
在线时间26 小时
我在看原子串口1通信实验的例程的时候发现,在中断服务程序中,判断接收到的数据必须是0x0d 0x0a结尾,我想请问下这个0x0d 0x0a是不是规定的,还是怎样。我想问下,这个是怎么来的。
是我们协议规定的,你可以自己定义协议,那就可以不要了。
主题帖子精华
金钱114239
在线时间853 小时
是我们协议规定的,你可以自己定义协议,那就可以不要了。
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子& &
主题帖子精华
中级会员, 积分 286, 距离下一级还需 214 积分
在线时间26 小时
回复【2楼】正点原子:
---------------------------------
规定这个协议,有什么要求没有哇。
主题帖子精华
金钱114239
在线时间853 小时
回复【3楼】huaiqiao:
---------------------------------
能达到你的目的即可
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子& &
主题帖子精华
中级会员, 积分 286, 距离下一级还需 214 积分
在线时间26 小时
回复【4楼】正点原子:
---------------------------------
好的,谢谢原子哥。
Powered by21ic官方微信-->
后使用快捷导航没有帐号?
ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU
请完成以下验证码
查看: 2759|回复: 8
stm32407利用RS485通信时,只能发送,不能接收数据。。
&&已结帖(5)
主题帖子积分
资深技术员, 积分 333, 距离下一级还需 167 积分
资深技术员, 积分 333, 距离下一级还需 167 积分
主题帖子积分
专家等级:结帖率:83%
主题帖子积分
资深技术员, 积分 333, 距离下一级还需 167 积分
资深技术员, 积分 333, 距离下一级还需 167 积分
之前是用232通信已经可以通了,现在加了一个485的控制端,结果无法进入接收中断,也不能接收数据。可以发送数据。而且485的硬件没问题,用其他的程序调试可以正常发送和接收。下面是我的代码,不知道为什么进不了中断,请大家帮忙看看是什么问题/*************485宏定义****************/
#define RS485TX()&&GPIO_SetBits(GPIOB,GPIO_Pin_8)
#define RS485RX()&&GPIO_ResetBits(GPIOB,GPIO_Pin_8)
/************** 串口中断接收数据 ****************/
void USART1_IRQHandler(void)
{
& && & & &
& && &if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
& & & && & {
& & & && && &USART_ClearITPendingBit(USART1,USART_IT_RXNE);
& && && && & dat=USART1_GetByte();
& & & && && &USART1_SendByte(dat);& & & & & & & &
& & & && &&&}& & & && && &
}
void RS485_GpioInit(void)
{
GPIO_InitTypeDef&&GPIO_InitS
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //485使能端配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void USART1_SendByte(unsigned int SendData)
& &RS485TX(); //打开发送控制端
& &Delay(0xff);
&&USART_SendData(USART1,SendData); //发送数据
&&while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); //等待数据发送完成
&&Delay(0xff);
&&RS485RX(); //关闭发送控制端
unsigned int USART1_GetByte(void)
{
unsigned int&&MidData=0;
RS485RX(); //打开接收控制端
Delay(0xff);
MidData = USART_ReceiveData(USART1); //接收数据
Delay(0xff);
RS485TX(); //关闭接收控制端
return MidD
/**************串口的IO口配置****************/
void USART_GPIO_Init(void)
{
& & & & GPIO_InitTypeDef GPIO_InitS
& & & & RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);& & & &
& & & & RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
& & & & GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);& & & &
& & & & GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);& & & &
& & & & GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
& & & & GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
&&& & & & GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
&&& & & & GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
&&& & & & GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
&&& & & & GPIO_Init(GPIOA, &GPIO_InitStructure);
& & & & GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
&&& & & & GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
&&& & & & GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
& & & & GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/**************开串口(波特率、停止位、接收发送中断可调)****************/
void OpenCom(unsigned int BaudRate,unsigned int StopBits,unsigned int Mode)
{
& & & & USART_InitTypeDef USART_InitS
& & & & NVIC_InitTypeDef&&NVIC_InitS
& & & &&&
& & & & USART_GPIO_Init();&&
& & & & USART_InitStructure.USART_BaudRate = BaudR
& & & & USART_InitStructure.USART_WordLength = USART_WordLength_8b;
& & & & switch(StopBits)
& & & & {
& & & & & & & & case 0:& & & & USART_InitStructure.USART_StopBits = USART_StopBits_1;
& & & & & & & & case 1: USART_InitStructure.USART_StopBits = USART_StopBits_2;
& & & & & & & & default:
& & & & }
& & & & USART_InitStructure.USART_Parity = USART_Parity_No;
& & & & USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_N
& & & & USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
& & & & USART_Init(USART1, &USART_InitStructure);& & & & /* USART configuration */
& & & & switch(Mode)
& & & & {
& & & & & & & & case 0: USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
& & & & & & & & case 1:& & & & USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);& & & & & & & & & & & & & & & & & & & & & & & & & & & &
& & & & }
& & & &
& & & & USART_Cmd(USART1, ENABLE);
& & & & USART_ClearFlag(USART1, USART_FLAG_TC);
& & & & RS485RX();
& & & &
& & & & NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
& & & & NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
& & & & NVIC_InitStructure.NVIC_IRQChannelSubPriority=4;
& & & & NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
& & & & NVIC_Init(&NVIC_InitStructure);&&
}
复制代码
主题帖子积分
高级技术员, 积分 709, 距离下一级还需 291 积分
高级技术员, 积分 709, 距离下一级还需 291 积分
主题帖子积分
专家等级:结帖率:76%
主题帖子积分
高级技术员, 积分 709, 距离下一级还需 291 积分
高级技术员, 积分 709, 距离下一级还需 291 积分
switch(Mode)
& &&&case 0: USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
& &&&case 1: USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);& && && && && && && && && && && && && && && && && && &&&
从楼主的这段程序看,楼主是只使能了其中一个中断,不知道是不是调用的参数不对?
生命不息,奋斗不止!
主题帖子积分
资深技术员, 积分 333, 距离下一级还需 167 积分
资深技术员, 积分 333, 距离下一级还需 167 积分
主题帖子积分
专家等级:结帖率:83%
主题帖子积分
资深技术员, 积分 333, 距离下一级还需 167 积分
资深技术员, 积分 333, 距离下一级还需 167 积分
LOVE_ELEC 发表于
switch(Mode)
& &&&case 0: USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
我不开启发送数据,只通过串口助手向板子发送数据,然后在中断里接收这些数据后放在一个数组里,都不行,就是接受中断进不去。但是可以再主函数里发送数据,不知道什么情况。能不能直接在主函数循环里写
while(1)
dat=USART1_GetByte();
然后用串口助手发送数据给串口时,dat里会有数据吗?
主题帖子积分
资深技术员, 积分 333, 距离下一级还需 167 积分
资深技术员, 积分 333, 距离下一级还需 167 积分
主题帖子积分
专家等级:结帖率:83%
主题帖子积分
资深技术员, 积分 333, 距离下一级还需 167 积分
资深技术员, 积分 333, 距离下一级还需 167 积分
已自己解决。谢谢~
主题帖子积分
实习生, 积分 3, 距离下一级还需 47 积分
实习生, 积分 3, 距离下一级还需 47 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 3, 距离下一级还需 47 积分
实习生, 积分 3, 距离下一级还需 47 积分
已自己解决。谢谢~
楼主,我现在也遇到相同的问题,我用485实现STM32和传感器的通讯,命令发过去了,但是却进入不了接收中断函数里面去,我确定发送的命令是正确的,
void jieshou()
& & & && &while(& & & & USART_GetFlagStatus(USART2,USART_FLAG_RXNE)!= SET);
& & & & & & & & & & & & temp = USART_ReceiveData(USART2);
& & & & & & & &
& & & & & & & &
& & & & & & & & che[iup]=
& & & & & & & & iup++;
上面这是我写的新的接受函数,因为接受中断函数进不去,我就自己重新写了一个接受函数,旧的中断函数如下
void USART2_IRQHandler(void)
& & & &&&ch=0;
& & & & //u8 temp=0;
& & & & if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
& & & & { & & & &
& & & && &&&//ch = USART1-&DR;
& & & & & & & & & & & & ch=USART_ReceiveData(USART2);
& & & & & & & & GPIO_SetBits(mac485REDE_PORT,mac485REDE_PIN);
& & & & & & & & delay_ms(1);
& & & & & & & & //USART_SendData(USART2,temp);
& & & & //& & & & while(USART_GetFlagStatus(USART2,USART_FlAG_TXE)==RESET);
& & & & & & & & //delay_ms(2);
& & & & & & & & //GPIO_ResetBits(GPIOE,GPIO_Pin_5);
& & & & //& & & & USART_PutHEX(USART2,ch);
& & & & & & & & printf(&%c&,ch);
然后现在的问题是接收过来的数据只有一个十六进制数01,本来应该会返回5个十六进制数01 05 02 3F 3F,能请楼主给我指导一下吗?我是初学者,希望能有大神给我指导一下
主题帖子积分
高级技术员, 积分 560, 距离下一级还需 440 积分
高级技术员, 积分 560, 距离下一级还需 440 积分
主题帖子积分
专家等级:结帖率:77%
主题帖子积分
高级技术员, 积分 560, 距离下一级还需 440 积分
高级技术员, 积分 560, 距离下一级还需 440 积分
已自己解决。谢谢~
怎么解决的啊。我的问题和你的一样
主题帖子积分
实习生, 积分 3, 距离下一级还需 47 积分
实习生, 积分 3, 距离下一级还需 47 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 3, 距离下一级还需 47 积分
实习生, 积分 3, 距离下一级还需 47 积分
同问,怎么解决的呢?
主题帖子积分
助理工程师, 积分 1383, 距离下一级还需 617 积分
助理工程师, 积分 1383, 距离下一级还需 617 积分
主题帖子积分
专家等级:结帖率:0%打赏:0.00受赏:7.00
主题帖子积分
助理工程师, 积分 1383, 距离下一级还需 617 积分
助理工程师, 积分 1383, 距离下一级还需 617 积分
通信的方式对不对?
主题帖子积分
助理工程师, 积分 1383, 距离下一级还需 617 积分
助理工程师, 积分 1383, 距离下一级还需 617 积分
主题帖子积分
专家等级:结帖率:0%打赏:0.00受赏:7.00
主题帖子积分
助理工程师, 积分 1383, 距离下一级还需 617 积分
助理工程师, 积分 1383, 距离下一级还需 617 积分
使用示波器测量IO的电平。
技术新星奖章
人才类勋章
时间类勋章
技术高手奖章
人才类勋章
涓涓之细流
发帖类勋章
时间类勋章stm32f407vg串口_stm32吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:26,450贴子:
stm32f407vg串口收藏
我配置了,总是无法通信,不知为甚
南京stm32培训,美国上市教育公司出品,15年嵌入式培训经验,不就业免费重学!达内stm32培训“先就业,后付款”全国103家培训中心,随时学习,有实力,有保障
今天我也遇到了
可以发送,但是数据不对,还在调试中
看看波特率和端口是否正确
能不能把你如何配置的拿出来看看
STM32F405xx/STM32F407xx手册里里写道USART1的Pin map: Tx-PA9;RX-PA10。参考IAP的示例,昨天搞了一晚上无论如何都没有输出,很是奇怪。一直以为初始化不对。今天早晨发现手册Page56中Table7. Alternate function mapping中USART1_TX/USART1_RX映射到PB6/PB7。然后做了如下的初始化,串口的引脚跳到PB6、PB7,果然有输出。那么既然管脚map上首推的映射是PA9/PA10那么为什么没有输出呢,而且用示波器测试一直为高电平?原来Discovery的试验板将PA9连接到usb的vbus供电上了。
登录百度帐号推荐应用}

我要回帖

更多关于 串口通信接收发送数据 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信