OpenEdv-开源电子网

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

STM32 USART复位后第一次接收数据时丢失一个字节

[复制链接]

52

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2012-4-26
在线时间
17 小时
发表于 2013-3-19 08:35:01 | 显示全部楼层 |阅读模式
USART使用中断接收,复位后第一次用上位机发送一帧数据,USART接收到会丢失第一个字节,
USART第一次发送丢失第一个字节是因为需先读SR, 第一次接收丢失第一个字节是为什么啊
努力?奋斗
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2013-3-19 10:09:57 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

52

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2012-4-26
在线时间
17 小时
 楼主| 发表于 2013-3-19 10:22:00 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
下入板子中进行仿真,单步运行,用串口发数据,无法看到进中断。
我对仿真的使用不是很熟练啊
努力?奋斗
回复 支持 反对

使用道具 举报

头像被屏蔽

243

主题

429

帖子

0

精华

禁止发言

积分
1067
金钱
1067
注册时间
2011-12-23
在线时间
17 小时
发表于 2013-3-19 11:12:39 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

52

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2012-4-26
在线时间
17 小时
 楼主| 发表于 2013-3-19 11:17:34 | 显示全部楼层
回复【4楼】panpan312:
---------------------------------
我是上位机发送数据帧,我用中断接收,第一个字节总是接收不到
努力?奋斗
回复 支持 反对

使用道具 举报

头像被屏蔽

243

主题

429

帖子

0

精华

禁止发言

积分
1067
金钱
1067
注册时间
2011-12-23
在线时间
17 小时
发表于 2013-3-19 11:30:18 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

52

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2012-4-26
在线时间
17 小时
 楼主| 发表于 2013-3-19 13:35:29 | 显示全部楼层
回复【6楼】panpan312:
---------------------------------
我收到数据帧 使用的是USART_DMA发送出去,是不是这里丢失了数据
努力?奋斗
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2196
金钱
2196
注册时间
2012-2-8
在线时间
35 小时
发表于 2013-3-19 13:36:25 | 显示全部楼层
看看平常USART所有寄存器的状态和第一次接收还没到来之前的状态有什么区别.
https://github.com/roxma
回复 支持 反对

使用道具 举报

52

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2012-4-26
在线时间
17 小时
 楼主| 发表于 2013-3-25 11:59:31 | 显示全部楼层
用USART接收中断接收一帧数据,帧长为18,中断函数如下:
void USART1_IRQHandler(void)
 {
   if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  
    {
      USART_ClearFlag(USART1,USART_IT_RXNE); 
    /* Read one byte from the receive data register */
      RxData[RxDatCoun++]=USART_ReceiveData(USART1);    
  
    if(RxDatCoun==DatSize)    //判断是不是接收到18个数据
     {
       RxDatCoun =0;
       DMA_CH4Cog((uint32_t)RxData,DatSize);   //配置DMA
       Enable_DMACH4(DatSize); //开启一起DMA传输
    }
 
    }
     
 }

 重新上电后发送这样一帧十六进制数据            07 AA 00 FF 00 01 00 01 B5 00 07 DD 03 11 09 1D 20 9B
第一次发送没有数据输出,第二次发送输出如下 90 0D FF 00 01 00 01 B5 00 07 DD 03 11 09 1D 20 9B 07    
第三次发送输出如下数据:                            AA 9B 07 AA 00 FF 00 01 00 01 B5 00 07 DD 03 11 09 1D 

 重新上电后发送这样一帧十六进制数据            FF AA 00 FF 00 01 00 01 B5 00 07 DD 03 11 09 1D 20 9B
第一次发送没有数据输出,第二次发送输出如下 AA 00 FF 00 01 00 01 B5 00 07 DD 03 11 09 1D 20 9B FF
第三次发送输出如下数据:                            AA 9B FF AA 00 FF 00 01 00 01 B5 00 07 DD 03 11 09 1D

努力?奋斗
回复 支持 反对

使用道具 举报

52

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2012-4-26
在线时间
17 小时
 楼主| 发表于 2013-3-25 16:31:21 | 显示全部楼层
原子哥啊  帮忙看看
努力?奋斗
回复 支持 反对

使用道具 举报

52

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2012-4-26
在线时间
17 小时
 楼主| 发表于 2013-3-25 17:12:59 | 显示全部楼层
void USART1_IRQHandler(void)
{
  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  {
    /* Read one byte from the receive data register */
    RxBuffer1 [RxCounter1] = USART_ReceiveData(USART1);
    //USART_ClearITPendingBit(USART1, USART_IT_RXNE);
USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
    USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);

  }
  
  if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
  {   
    /* Write one byte to the transmit data register */
    USART_SendData(USART1, RxBuffer1[RxCounter1]); 
    USART_ClearITPendingBit(USART1, USART_IT_TC);                   
    USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
//TxBuffer=USART1->DR;
// printf("RxBuffer[%d]= %d\n",RxCounter,RxBuffer[RxCounter]);
RxCounter1++;
if(RxCounter1==5000)
{
 RxCounter1=0;
}    
  }
}

将中断函数改为如上:
第一次上电发送一帧数据,如果第一字节为0Xff,第一次输出帧丢失第一字节OXFF,后面的字节都正确。在发送一次输出就正确也不丢数据
如果第一次上电发送一帧十六进制数据01 88 96 11,第一次输出40 CC 16 FC ,再发送一次输出正确数据01 88 96 11。
就是每次重新上电就有这种情况,软件复位都没这情况发生。
努力?奋斗
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2013-3-25 20:58:46 | 显示全部楼层
串口发送部分代码在哪里?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

52

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2012-4-26
在线时间
17 小时
 楼主| 发表于 2013-3-26 08:16:24 | 显示全部楼层
回复【12楼】正点原子:
---------------------------------
发送就用上面的发送中断啊!
我还试过用DMA     DMA_CH4Cog((uint32_t)RxData,DatSize); //配置DMA
 Enable_DMACH4(DatSize);                         //开启一次DMA传输

具体代码如下:
//USART1发送的DMA配置
void DMA_CH4Cog(uint32_t cmar,u16 cndtr)
 {
   
   DMA_InitTypeDef DMA_InitStructure;
 
   /* USARTy_Tx_DMA_Channel (triggered by USARTy Tx event) Config */
   DMA_DeInit(DMA1_Channel4);
   DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART1->DR;
   DMA_InitStructure.DMA_MemoryBaseAddr =(uint32_t)cmar;
   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
   DMA_InitStructure.DMA_BufferSize =cndtr;
   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
   DMA_InitStructure.DMA_MemoryDataSize =DMA_MemoryDataSize_Byte;
   DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
   DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
   DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
   DMA_Init(DMA1_Channel4, &DMA_InitStructure);
   
  // DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);
  
 }




//开启一次USART1 DMA传输
void Enable_DMACH4(u16 cndtr)
 {
    USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
   DMA_Cmd(DMA1_Channel4, DISABLE );  //关闭USART1 TX DMA1 所指示的通道 
   DMA1_Channel4->CNDTR=cndtr;    
   DMA_Cmd(DMA1_Channel4, ENABLE);  //使能USART1 TX DMA1 所指示的通道 
  
while(1)
 {
  if(DMA_GetFlagStatus(DMA1_FLAG_TC4) == SET)
 { 
   DMA_ClearFlag(DMA1_FLAG_TC4);
   break;
 } 
}
 }
努力?奋斗
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2013-3-26 09:22:06 | 显示全部楼层
用的DMA发送哦,
在你串口初始化的最后,加入:
while((USART1->SR&0X40)==0);
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

52

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2012-4-26
在线时间
17 小时
 楼主| 发表于 2013-3-26 10:11:44 | 显示全部楼层
回复【14楼】正点原子:
---------------------------------
我加了之后还是没解决问题,上电第一次接收的数据有误
努力?奋斗
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2013-3-26 10:26:51 | 显示全部楼层
for(fscs=0;fscs<5;fscs++) 

while((USART1->SR&0X40)==0);//等待发送结束 

USART1->DR=tx_buffer[fscs]; 
}
这样也不行?
回复 支持 反对

使用道具 举报

头像被屏蔽

243

主题

429

帖子

0

精华

禁止发言

积分
1067
金钱
1067
注册时间
2011-12-23
在线时间
17 小时
发表于 2013-3-26 10:31:42 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

52

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2012-4-26
在线时间
17 小时
 楼主| 发表于 2013-3-26 10:38:57 | 显示全部楼层
回复【16楼】wwjdwy:
---------------------------------
还是不对,不是发送时第一数据被覆盖的问题,
我觉得是接收问题,就第一次上电第一次接收有问题
努力?奋斗
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2013-3-26 11:07:52 | 显示全部楼层
回复【18楼】原味_郭:
---------------------------------
和电脑通信试试,看看是发送问题,还是接受问题。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

52

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2012-4-26
在线时间
17 小时
 楼主| 发表于 2013-3-26 13:52:08 | 显示全部楼层
回复【19楼】正点原子:
---------------------------------
和电脑通信,用串口调试助手给STM32发送数据,STM32将收到的数据在返回电脑上。
当第一次上电发送0XFF,用仿真看USART1->DR中没有数据,第二次发送任意数据,USART1->DR中为发送的数据。
断电后上电发送0X12,用仿真看USART1->DR中为0XE2,串口输出0XE2,第二次发送任意数据,USART1->DR中为发送的数据。

我觉得是接收问题
努力?奋斗
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2013-3-26 16:19:48 | 显示全部楼层
回复【20楼】原味_郭:
---------------------------------
上电仿真,你能保证没有已经执行过一次了么?
因为上电是很快速的一个过程,而你仿真器去连接,则是需要多一点时间的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

52

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2012-4-26
在线时间
17 小时
 楼主| 发表于 2013-3-27 13:09:25 | 显示全部楼层
重新换了块板好啦,难道是STM32芯片问题?
努力?奋斗
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2013-4-22
在线时间
0 小时
发表于 2013-4-22 14:58:11 | 显示全部楼层
在发送之前  定义USART_ClearFlag(USART1,USART_Flag_TC);  这样就可以解决了
好好学习 最好自己
回复 支持 反对

使用道具 举报

52

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2012-4-26
在线时间
17 小时
 楼主| 发表于 2013-4-26 16:48:12 | 显示全部楼层
回复【23楼】小Q:
---------------------------------
发送时防止第一个字节丢失加USART_ClearFlag(USART1,USART_Flag_TC); 
可是我是接收时第一个字节错误或丢失,而且是只有一块板的USART1是这问题,USART2和USART3都正常
努力?奋斗
回复 支持 反对

使用道具 举报

154

主题

289

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1067
金钱
1067
注册时间
2015-4-13
在线时间
189 小时
发表于 2016-11-9 20:24:20 | 显示全部楼层
楼主是怎么解决的,我也发现就串口一有这样的问题,每次复位后收到第一个字节是丢失的,其它USART就没有这个问题的
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-1-21
在线时间
1 小时
发表于 2019-7-19 11:55:33 | 显示全部楼层
我也遇到了这个问题。用的F030K6,就一个uart1,这不没法用了吗?
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-1-21
在线时间
1 小时
发表于 2019-7-19 13:29:47 | 显示全部楼层
jeraw 发表于 2016-11-9 20:24
楼主是怎么解决的,我也发现就串口一有这样的问题,每次复位后收到第一个字节是丢失的,其它USART就没有这 ...

咋解决的啊兄弟?
我用的芯片只有一个串口,。。。
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-1-21
在线时间
1 小时
发表于 2019-7-19 13:30:29 | 显示全部楼层
原味_郭 发表于 2013-4-26 16:48
回复【23楼】小Q:
---------------------------------
发送时防止第一个字节丢失加USART_ClearFlag(USART1 ...

遇到了一样的问题。
特来讨教。
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-7-19
在线时间
4 小时
发表于 2019-7-19 13:53:56 | 显示全部楼层
爱飞 发表于 2019-7-19 13:30
遇到了一样的问题。
特来讨教。

加一句 USART1->SR
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-1-21
在线时间
1 小时
发表于 2019-7-19 15:51:34 | 显示全部楼层

搞定了,不过跟这个没关系。
回复 支持 反对

使用道具 举报

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2020-11-12
在线时间
11 小时
发表于 2022-7-6 10:15:08 | 显示全部楼层
爱飞 发表于 2019-7-19 15:51
搞定了,不过跟这个没关系。

兄弟 跟你遇到了一样的问题  能否请教下当时是怎么解决的  感谢
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 18:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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