你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F303RE 串口中断通信问题

[复制链接]
youyexinyu 提问时间:2015-7-13 11:41 /
STM32F303RE 串口接收中断处理:当从串口发数据时,MCU只能接收到一半数据,请教各位大神,这是怎么一回事?如图1

//中断处理程序
void USART2_IRQHandler(void)
{
   CLI();    //disable all interrupts
   /* checks whether the specified USART interrupt has occurred or not */
    if (USART_GetITStatus(USART2, USART_IT_RXNE)) {  
     /* clear the RXNE pending bit */  
      USART_RequestCmd(USART2, USART_Request_RXFRQ, ENABLE);
     //USART_SendData(USART2, USART_ReceiveData(USART2));
     HW_USART_SendOneChar(USART2, HW_USART_ReceOneChar(USART2));
  }
  SEI();    //enable all interrupts
}

当中断里直接用库函数USART_SendData(USART2, USART_ReceiveData(USART2))时接收正常

//串口程序
//115200 -8-1-0-0

#include "HW_USART.h"

static void RCC_Configuration(void);
static void NVIC_Configuration(void);
static void GPIO_Configuration(GPIO_TypeDef* port);

void HW_USART_Init(USART_TypeDef* usartnum, FunctionalState state)
{
    USART_InitTypeDef    USART_InitStructure;

   RCC_Configuration();
   
   NVIC_Configuration();

   GPIO_Configuration(Light_Run_Port);
    USART_InitStructure.USART_BaudRate = BaudRate;
    USART_InitStructure.USART_WordLength = WordLength;
    USART_InitStructure.USART_StopBits = StopBits;
    USART_InitStructure.USART_Parity = ParityChecking;
    USART_InitStructure.USART_HardwareFlowControl = FlowControl;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
   
  USART_DeInit(usartnum);
    USART_Init(usartnum, &USART_InitStructure);
    USART_ITConfig(usartnum, USART_IT_RXNE, state);                //enable RXNE interrupt
   USART_ClearFlag (USART2, (USART_FLAG_TXE | USART_FLAG_TC));    //clear TXE TC flag
    USART_Cmd(usartnum, state);
}
void RCC_Configuration(void)
{
    /* GPIOA Periph clock enable */
   RCC_AHBPeriphClockCmd(GPIOA, ENABLE);

   /* USART2 Periph clock enable */
    RCC_APB1PeriphClockCmd(USART2, ENABLE);
}
void NVIC_Configuration(void)
{
   NVIC_InitTypeDef    NVIC_InitStruct;

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    NVIC_InitStruct.NVIC_IRQChannel = USART2_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);
}
void GPIO_Configuration(GPIO_TypeDef* port)
{
    GPIO_InitTypeDef    GPIO_InitStructure;

   GPIO_InitStructure.GPIO_Pin = (USART_TXpin | USART_RXpin);    //RX TX
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;                  //Alternate function mode
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;             //High speed
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                //Output push-pull
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;                  //Pull-up
    GPIO_Init(port, &GPIO_InitStructure);

    /* select the pins to be used as Alternate function */
    GPIO_PinAFConfig(port, GPIO_PinSource2, GPIO_AF_7);
    GPIO_PinAFConfig(port, GPIO_PinSource3, GPIO_AF_7);
}
void HW_USART_SendOneChar(USART_TypeDef* usartnum, uint8_t data)
{
  USART_SendData(usartnum, data);

   /* wait until transmission is complete */  
    while (!(USART_GetFlagStatus(usartnum, USART_FLAG_TC))) {
      ;
  }  
}
void HW_USART_SendChars(USART_TypeDef* usartnum, uint16_t len, void *buff)
{
   uint16_t i;
    uint8_t *ptr = (uint8_t *)buff;
   
   for (i = 0; i < len; i++) {
       HW_USART_SendOneChar(usartnum, ptr[i]);
  }
}
void HW_USART_SendString(USART_TypeDef* usartnum, void *buff)
{
   uint8_t *ptr = (uint8_t *)buff;
   
   while (*ptr != '\0') {
      HW_USART_SendOneChar(usartnum, *ptr++);
   }
}
uint16_t HW_USART_ReceOneChar(USART_TypeDef* usartnum)
{
   /* Wait until data to be received */
    while (!(USART_GetFlagStatus(usartnum, USART_FLAG_RXNE))) {
      ;
  }
  return USART_ReceiveData(usartnum);
}
a.jpg
收藏 评论24 发布时间:2015-7-13 11:41

举报

24个回答
星辰一方 回答时间:2015-7-14 09:04:43
void HW_USART_SendOneChar(USART_TypeDef* usartnum, uint8_t data)
{
  USART_SendData(usartnum, data);

   /* wait until transmission is complete */  
    while (!(USART_GetFlagStatus(usartnum, USART_FLAG_TC))) {
      ;
  }  
}
void HW_USART_SendChars(USART_TypeDef* usartnum, uint16_t len, void *buff)
{
   uint16_t i;
    uint8_t *ptr = (uint8_t *)buff;
   
   for (i = 0; i < len; i++) {
       HW_USART_SendOneChar(usartnum, ptr[i]);
  }
}
void HW_USART_SendString(USART_TypeDef* usartnum, void *buff)
{
   uint8_t *ptr = (uint8_t *)buff;
   
   while (*ptr != '\0') {
      HW_USART_SendOneChar(usartnum, *ptr++);
   }
}
uint16_t HW_USART_ReceOneChar(USART_TypeDef* usartnum)
{
   /* Wait until data to be received */
    while (!(USART_GetFlagStatus(usartnum, USART_FLAG_RXNE))) {
      ;
  }
  return USART_ReceiveData(usartnum);
}


以上这几种发送在HAL库里都有对应的函数,可以试下,使用中断方式,应该没问题的
youyexinyu 回答时间:2015-7-13 15:22:17
安 发表于 2015-7-13 15:08
看样子是由于在发送的时候,丢掉了数据,应该是发生了溢出。下面的代码导致数据溢出
/* wait until transmi ...

你好,
在中断里用USART_SendData(USART2, USART_ReceiveData(USART2));是正常的;
但是用自己的就有问题,串口发一个字节要发两次,MCU才能收到;串口发一大串数据的话就只能收到一半。
while (!(USART_GetFlagStatus(usartnum, USART_FLAG_TC))) {
      ;
  }  这个是等待发送完成的,应该要加的吧。
星辰一方 回答时间:2015-7-14 09:02:38
楼主个人觉得你这有两个问题:
1、是没有理解中断调用的机制,USART2_IRQHandler(void)是一个句柄,个人认为不应该把串口发送放在句柄里执行,应该找到回调函数放到回调函数里进行收发(发送完成或接收完成回调函数)。
2、为什么HAL库里有串口发送函数,封装好的,你不用,你还要自己写串口发送呢?
stary666 回答时间:2015-7-13 12:14:22
看看,,,,,,,,,,,,sofa
mark0668 回答时间:2015-7-13 13:21:14
看看了...
左岸右岸 回答时间:2015-7-13 13:38:47
水平不够,看不出来,帮顶吧
废鱼 回答时间:2015-7-13 15:08:19
看样子是由于在发送的时候,丢掉了数据,应该是发生了溢出。下面的代码导致数据溢出
/* wait until transmission is complete */  
    while (!(USART_GetFlagStatus(usartnum, USART_FLAG_TC))) {
      ;
  }  
creep 回答时间:2015-7-13 15:26:22
youyexinyu 发表于 2015-7-13 15:22
你好,
在中断里用USART_SendData(USART2, USART_ReceiveData(USART2));是正常的;
但是用自己的就有问题 ...

换成下面的判断函数试试
  1. while(USART_GetFlagStatus(usartnum,USART_FLAG_TXE)!=SET);
复制代码
youyexinyu 回答时间:2015-7-13 15:35:22
creep 发表于 2015-7-13 15:26
换成下面的判断函数试试

还是一样 呵呵
废鱼 回答时间:2015-7-13 16:02:15
把波特率调低点试试。9600
youyexinyu 回答时间:2015-7-13 16:09:08
安 发表于 2015-7-13 16:02
把波特率调低点试试。9600

效果一样!真奇怪
废鱼 回答时间:2015-7-13 16:28:43
还是溢出了。你在外部判断接受完以后,再一块输出吧
youyexinyu 回答时间:2015-7-13 16:43:45
安 发表于 2015-7-13 16:28
还是溢出了。你在外部判断接受完以后,再一块输出吧

邮箱 我把代码发给你 你帮忙试一下
ningzb 回答时间:2015-7-13 16:51:50
应该是接受处理不及时,数据溢出了,中断处理函数不要做太复杂,越短越好,接受完,再外面处理
JackieLaura 回答时间:2015-7-13 17:00:11
串口调试助手的波特率跳到57600接收试试看。。
youyexinyu 回答时间:2015-7-13 17:33:26
JackieLaura 发表于 2015-7-13 17:00
串口调试助手的波特率跳到57600接收试试看。。

呵呵 不是配置的原因 应该是程序的问题吧
12下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版