OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3480|回复: 14

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

[复制链接]

4

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2017-1-10
在线时间
28 小时
发表于 2017-1-17 11:02:39 | 显示全部楼层 |阅读模式
5金钱
发送数据后无法接收到数据
如图所示
~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?\r"};
int flag;

unsigned char RxBuffer[];       

int main(void)
{
   int i=0;
   USART_ConfigForCom_TX();
         printf("send:\n");
   while(TxBuffer!='\0')
         {
            USART_SendData(USART1,TxBuffer[i++]);
                  printf("%c",TxBuffer[i-1]);
            while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);//每发送一次都要检查发送完成否
                  //printf("%c",TxBuffer[i-1]);
         }
         printf("\nreceive:\n");
         while(1)
   {         
             while(RxBuffer[flag]!='\0')
            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("串口初始化完成\r\n");

}
[/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]




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7546
金钱
7546
注册时间
2016-11-30
在线时间
642 小时
发表于 2017-1-17 12:30:24 | 显示全部楼层
i = 0;这句代码不能放中断里
回复

使用道具 举报

4

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2017-1-10
在线时间
28 小时
 楼主| 发表于 2017-1-17 13:05:15 | 显示全部楼层
lvkanger 发表于 2017-1-17 12:30
i = 0;这句代码不能放中断里

为什么啊?能解释的清楚一点吗,谢谢
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7546
金钱
7546
注册时间
2016-11-30
在线时间
642 小时
发表于 2017-1-17 13:27:40 | 显示全部楼层
zhihuan93 发表于 2017-1-17 13:05
为什么啊?能解释的清楚一点吗,谢谢

你的接收函数把所有数据都接收到buf[0]了
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7546
金钱
7546
注册时间
2016-11-30
在线时间
642 小时
发表于 2017-1-17 13:28:32 | 显示全部楼层
lvkanger 发表于 2017-1-17 13:27
你的接收函数把所有数据都接收到buf[0]了

所以你主函数只能打印出来一个0x0A,也就是换行
回复

使用道具 举报

4

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2017-1-10
在线时间
28 小时
 楼主| 发表于 2017-1-17 14:10:23 | 显示全部楼层
lvkanger 发表于 2017-1-17 13:28
所以你主函数只能打印出来一个0x0A,也就是换行

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

这个数组里写的是i++,怎么会都接收到buf[0]里呢?
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2018-7-18
在线时间
17 小时
发表于 2017-1-17 14:35:57 | 显示全部楼层
while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET) ;
应该是死在中断里了,RXNE一直不为0,while根本没有跳出去的机会
回复

使用道具 举报

5

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
368
金钱
368
注册时间
2015-9-7
在线时间
82 小时
发表于 2017-1-17 15:18:08 | 显示全部楼层
zhihuan93 发表于 2017-1-17 14:10
RxBuffer=USART_ReceiveData(USART1);               // 将接收到的数据放入缓冲数组里

这个数组里写 ...

串口数据寄存器只有一个字节空间,所以每次接收一个字节就会进一次中断,每次进中断你的i就被初始化为0,你的i++根本没用
回复

使用道具 举报

13

主题

84

帖子

0

精华

高级会员

Rank: 4

积分
765
金钱
765
注册时间
2016-1-20
在线时间
129 小时
发表于 2017-1-17 15:37:54 | 显示全部楼层
要想有效  在变量i前面加static关键字
回复

使用道具 举报

17

主题

587

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4467
金钱
4467
注册时间
2013-6-27
在线时间
565 小时
发表于 2017-1-17 15:43:19 | 显示全部楼层
i超过缓存大小时,程序差不多可以崩溃了,所以static定义还不够
让我们的思维驾驭在电的速度之上!
回复

使用道具 举报

17

主题

587

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4467
金钱
4467
注册时间
2013-6-27
在线时间
565 小时
发表于 2017-1-17 15:43:21 | 显示全部楼层
i超过缓存大小时,程序差不多可以崩溃了,所以static定义还不够
让我们的思维驾驭在电的速度之上!
回复

使用道具 举报

4

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2017-1-10
在线时间
28 小时
 楼主| 发表于 2017-1-17 15:47:57 | 显示全部楼层
himalauas 发表于 2017-1-17 14:35
while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET) ;
应该是死在中断里了,RXNE一直不为0,while根 ...

我在 在线调试的时候它可以跳出去
回复

使用道具 举报

4

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2017-1-10
在线时间
28 小时
 楼主| 发表于 2017-1-17 16:41:46 | 显示全部楼层
本帖最后由 zhihuan93 于 2017-1-17 16:44 编辑
DongInker 发表于 2017-1-17 15:43
i超过缓存大小时,程序差不多可以崩溃了,所以static定义还不够

接受的数据只有几字节,不是很大。
我把中断函数改成这样了,其中RxBuffercut是一个全局变量
[mw_shl_code=applescript,true]void USART1_IRQHandler(void)
{                  
   if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET)                  //确保是接收中断发生
   {
      while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET)        //当接收数据寄存器不为空时就不停地接收
       {
         RxBuffer[RxBuffercut++]=USART_ReceiveData(USART1);                                // 将接收到的数据放入缓冲数组里
      }
          USART_ClearITPendingBit(USART1,USART_IT_RXNE);                        //清接收中断标志位,否则退不出中断
   }
}
[/mw_shl_code]

main.c为:
[mw_shl_code=applescript,true]int main(void)
{
   int i=0,j=0;
   USART_ConfigForCom_TX();//串口配置
   printf("send:\n");
   while(TxBuffer!='\0')
         {
            USART_SendData(USART1,TxBuffer[i++]);
             printf("%c",TxBuffer[i-1]);
            while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);//每发送一次都要检查发送完成否
         }
   printf("\nreceive:\n");
   while(1)
   {
          for(j=0;j<=RxBuffercut;j++)
          {
                 printf("%d",RxBuffer[j]);
         }
     }
}[/mw_shl_code]

结果接收端收到了很多00000,不知道是问什么


回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7546
金钱
7546
注册时间
2016-11-30
在线时间
642 小时
发表于 2017-1-17 16:51:16 | 显示全部楼层
zhihuan93 发表于 2017-1-17 16:41
接受的数据只有几字节,不是很大。
我把中断函数改成这样了,其中RxBuffercut是一个全局变量
[mw_shl_c ...

RxBuffercut在哪里清零了?他一直在累加,那前边的数据肯定是0啦
回复

使用道具 举报

4

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2017-1-10
在线时间
28 小时
 楼主| 发表于 2017-1-18 11:40:29 | 显示全部楼层
lvkanger 发表于 2017-1-17 16:51
RxBuffercut在哪里清零了?他一直在累加,那前边的数据肯定是0啦

清零之后还是收不到数,你看看代码的思路有问题吗?或者给我提供一个思路,谢谢
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-6 19:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表