两个stm32通过串口发送接收数据的问题

2019-10-15 06:35发布

发送数据后无法接收到数据
如图所示
~LT9J0D1(QS$F3NW~RW{)$Y.png


下面是代码(非原创)
main.c

[mw_shl_code=c,true]#include <stm32f10x.h>
#include <USART_ConfigForCom_TX.h>
#include <stdio.h>

uint8_t TxBuffer[] = {0x41, 0x54, 0x2B, 0x42, 0x41, 0x55, 0x44, 0x3F, 0x0D, 0x0A};
//uint8_t TxBuffer[] = {"AT+BAUD? "};
int flag;

unsigned char RxBuffer[];       

int main(void)
{
   int i=0;
   USART_ConfigForCom_TX();
         printf("send: ");
   while(TxBuffer!='')
         {
            USART_SendData(USART1,TxBuffer[i++]);
                  printf("%c",TxBuffer[i-1]);
            while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);//每发送一次都要检查发送完成否
                  //printf("%c",TxBuffer[i-1]);
         }
         printf(" receive: ");
         while(1)
   {         
             while(RxBuffer[flag]!='')
            printf("%c",RxBuffer[flag++]);
   }
}[/mw_shl_code]


串口配置
[mw_shl_code=c,true]void USART_ConfigForCom_TX(void)
{
   //定义GPIO,,NVIC,USART结构体
   GPIO_InitTypeDef GPIO_InitStructure;
   USART_InitTypeDef USART_InitStructure;
         NVIC_InitTypeDef        NVIC_InitStructure;

   //开PA口复用时钟,初始化系统时钟
   SystemInit();
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
   //配置PA9即USART1_TX_
   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
   GPIO_Init(GPIOA,&GPIO_InitStructure);
   //配置PA10即USART1_RX
   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
   GPIO_Init(GPIOA,&GPIO_InitStructure);
       
  //进行USART1的中断配置
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
   NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                  //优先级为第0级
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);

       
   //配置USART1
   USART_InitStructure.USART_BaudRate=9600;
   USART_InitStructure.USART_WordLength=USART_WordLength_8b;
   USART_InitStructure.USART_StopBits=USART_StopBits_1;
   USART_InitStructure.USART_Parity=USART_Parity_No;
   USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
   USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
   USART_Init(USART1,&USART_InitStructure);
         
         //开USART1中断触发方式为接收中断
   USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//不能开IT-TXE中断使能,因为初始化时也会有TXE置位,因为此时发送数据寄存器为空
   
         USART_Cmd(USART1,ENABLE);
   USART_ClearFlag(USART1,USART_FLAG_TC);
   printf("串口初始化完成 ");

}
[/mw_shl_code]


接收中断:
[mw_shl_code=c,true]void USART1_IRQHandler(void)
{
   int i=0;                                                //中断内读取字符串组用
   flag=0;                                          //主函数中打印字符串组用,每进一次中断就清零
       
   if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET)                  //确保是接收中断发生
   {
      while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET)        //当接收数据寄存器不为空时就不停地接收
          {
         RxBuffer[i++]=USART_ReceiveData(USART1);                                // 将接收到的数据放入缓冲数组里
      }
          USART_ClearITPendingBit(USART1,USART_IT_RXNE);                        //清接收中断标志位,不然退不出中断
   }
}[/mw_shl_code]




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
lvkanger
1楼-- · 2019-10-15 10:51
i = 0;这句代码不能放中断里
zhihuan93
2楼-- · 2019-10-15 10:53
 精彩回答 2  元偷偷看……
lvkanger
3楼-- · 2019-10-15 14:08
zhihuan93 发表于 2017-1-17 13:05
为什么啊?能解释的清楚一点吗,谢谢

你的接收函数把所有数据都接收到buf[0]了
lvkanger
4楼-- · 2019-10-15 15:46
lvkanger 发表于 2017-1-17 13:27
你的接收函数把所有数据都接收到buf[0]了

所以你主函数只能打印出来一个0x0A,也就是换行
zhihuan93
5楼-- · 2019-10-15 17:07
lvkanger 发表于 2017-1-17 13:28
所以你主函数只能打印出来一个0x0A,也就是换行

RxBuffer[i++]=USART_ReceiveData(USART1);               // 将接收到的数据放入缓冲数组里

这个数组里写的是i++,怎么会都接收到buf[0]里呢?
himalauas
6楼-- · 2019-10-15 18:21
while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET) ;
应该是死在中断里了,RXNE一直不为0,while根本没有跳出去的机会

一周热门 更多>