12239|4

4

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

stm32 USART应用:上位机发送一段字符串给stm32并接受返回相同字符串程序出现的问题 [复制链接]

最近学习stm32 USART,自己编了个小程序,经实验在主函数中发送字符或字符串,电脑接収没问题;但电脑经串口调试工具发送一字符时(由stm32接受并返回),却需要两次发送上位机才能接受到,也就是发送数是接受数的2倍,很是疑惑;同样上位机发送字符串时,接受到的字符串顺序颠倒,但内容是发出的内容,这个也有疑惑。请各路大神抽一点时间帮小弟看看,不胜感激!

int main(void)
{
RCC_Configration();
GPIO_Configration();
NVIC_Configration();
USART_Configuration();
while(1);
}
...
...
...

void send_char(unsigned char i)
{
USART_SendData(USART1, i); //发送一位数据
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);  //等待发送完毕
USART_ClearITPendingBit(USART1,USART_IT_TXE);
}

unsigned char receive_char(void)
{
  unsigned char i;
  i=USART_ReceiveData(USART1); //接受一个字节
  while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET); //等待接收完毕
  USART_ClearFlag(USART1,USART_FLAG_RXNE);
  return i;
}

void send_str(unsigned char *p)
  {

    while(*p!='\0')            //循环逐字输出,到结束字'\0'
      {send_char(*p);p++; }          //发送字符
  }


void USART1_IRQHandler(void)                             //串口1中断

{


    unsigned char RX_dat;                                                        //定义字符变量

    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)    //判断发生接收中断
    {
    RX_dat=receive_char();
    //USART_ClearITPendingBit(USART1,USART_IT_RXNE);        //清除中断标志
   
    send_char(RX_dat);
    }
此帖出自stm32/stm8论坛

最新回复

很多寄存器标志位都不是手动清的,即使你清了也没有意义。 例如发送缓冲区空标志位,只要是缓冲区为空,则置位,不空则清0,都是硬件来控制,相当于只读的。 接收非空标志位,里面有数据则置位,你把里面的数读出来则硬件就自动清0了。 具体细节是要看user's guide的,我也只能是粗略的给你说说。  详情 回复 发表于 2013-8-9 12:40
点赞 关注(1)
 

回复
举报

6040

帖子

203

TA的资源

版主

沙发
 
void send_char(unsigned char i)
{
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);  //等待发送完毕
USART_SendData(USART1, i); //发送一位数据
}


unsigned char receive_char(void)
{
  unsigned char i;
  i=USART_ReceiveData(USART1); //接受一个字节
  return i;
}

改成这样就差不多了。
好好看看手册吧,看你的程序,好像刚刚开始学习。
此帖出自stm32/stm8论坛

点评

非常感谢,看到你回复后我就马上修改了程序,证明很成功。不过现在我的问题来了:发送或接收字符后会置位相应位,如while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); //等待发送完毕 若首次发送成功  详情 回复 发表于 2013-8-9 12:13
 
 

回复

4

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

回复 沙发lcofjp 的帖子

非常感谢,看到你回复后我就马上修改了程序,证明很成功。不过现在我的问题来了:发送或接收字符后会置位相应位,如while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);  //等待发送完毕  若首次发送成功,若不手动复位该位,不影响再次发送?   再者我在中断中发送接收到的字符,首次进入中断后若不复位相应中断标志位,不影响第二次进入中断?    我是一位初学者,问得题目可能较幼稚,还请您耐心解答。
我现在主要看《STM32F10xxx固件库_3.01.pdf》,也就是熟悉函数的运用,但这里面太粗略,函数和寄存器关系没讲明白;《STM32中文参考手册》大致讲寄存器,但看后对应不到相应函数。我对寄存器的操作不是很敏感,还是习惯函数操作,总是模仿别人的初始化、配置之类,但这样可能照顾不到细节(这时可能将对51单片机的某些理解套用过来试试看),所以难以发现问题的症结。不知道您是怎样学习stm32的,给小弟指出一些好方法。
此帖出自stm32/stm8论坛

点评

很多寄存器标志位都不是手动清的,即使你清了也没有意义。 例如发送缓冲区空标志位,只要是缓冲区为空,则置位,不空则清0,都是硬件来控制,相当于只读的。 接收非空标志位,里面有数据则置位,你把里面的数读出  详情 回复 发表于 2013-8-9 12:40
 
 

回复

6040

帖子

203

TA的资源

版主

4
 

回复 板凳Mrye 的帖子

很多寄存器标志位都不是手动清的,即使你清了也没有意义。
例如发送缓冲区空标志位,只要是缓冲区为空,则置位,不空则清0,都是硬件来控制,相当于只读的。
接收非空标志位,里面有数据则置位,你把里面的数读出来则硬件就自动清0了。
具体细节是要看user's guide的,我也只能是粗略的给你说说。
此帖出自stm32/stm8论坛

点评

嗯,还是得好好看手册。有一点不明白 串口中断有标志位吗,我在中断中没有写清中断标志;也没有查到串口中断的相关资料,看别人这样用,我也就这样用了  详情 回复 发表于 2013-8-9 17:20
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(中级)

5
 

回复 4楼lcofjp 的帖子

嗯,还是得好好看手册。有一点不明白 串口中断有标志位吗,我在中断中没有写清中断标志;也没有查到串口中断的相关资料,看别人这样用,我也就这样用了
此帖出自stm32/stm8论坛
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表