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

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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版