OpenEdv-开源电子网

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

串口接收时,利用原子哥的例程接收函数,不对接收字节个数判断就会出错,可理论上不应该出错

[复制链接]

3

主题

9

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2020-7-25
在线时间
4 小时
发表于 2020-7-30 18:49:11 | 显示全部楼层 |阅读模式
以下是原子哥的官方例程:
串口中断函数:
      
void USART3_IRQHandler(void)
{
   u8 res;
        if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
        {         
          res =USART_ReceiveData(USART3);
   // USART_SendData(USART3,res);
                if(Bluetooth_RX_CNT<200)
                {
                        Bluetooth_RX_BUF[Bluetooth_RX_CNT]=res
                        Bluetooth_RX_CNT++;                              
                }
        }                                                                                          
}


串口接收函数

void Bluetooth_Receive_Data(u8 *buf,u8 *len)
{
      
        u8 rxlen=Bluetooth_RX_CNT;
        u8 i=0;
        *len=0;                              
        delay_ms(1);               
        if(rxlen==Bluetooth_RX_CNT&&rxlen)
        {
                for(i=0;i<rxlen;i++)
                {
                        buf=Bluetooth_RX_BUF;      
                }               
                *len=Bluetooth_RX_CNT;      
   Bluetooth_RX_CNT=0;               
      
}

以上两个函数均为原子哥的例程,使用起来也没啥问题,最近遇到一个奇怪的问题:主函数中,接收到0x01,LED1亮,接收到0x02, LED0亮,如下


while(1)
{
Bluetooth_Receive_Data(data,&number);
  if(number!=0)
    {
      if(data[0]==0x01)LED1=0;
      if(data[0]==0x02) LED0=0;

   }

}

这样写程序可以执行,没有错误,但是如果不对if(number!=0)进行判断,直接写
while(1)
{
Bluetooth_Receive_Data(data,&number);

      if(data[0]==0x01)LED1=0;
      if(data[0]==0x02) LED0=0;
}
这种情况  输入0x01 LED1亮,,再输入0x02 LED0不亮,,不明白啥意思,理论上 if(number!=0)这个语句不行也没有问题的,,每次接收数据 都会重置的,不明白为什么

求大神指教,困扰好多天了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

28

主题

100

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2017-4-28
在线时间
44 小时
发表于 2020-7-30 20:08:54 | 显示全部楼层
1、你的程序不能编译通过吧!
2、void Bluetooth_Receive_Data(u8 *buf,u8 *len) 函数,你是准备把接收的长度赋值给,buf的地址? 还用FOR循环? 你好好写写这个函数。。太错了
回复 支持 反对

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2020-7-25
在线时间
4 小时
 楼主| 发表于 2020-7-31 08:40:21 | 显示全部楼层
兄弟 你看一下官方例程吧、、、程序都可以执行 为啥会编译不过呢、、那是官方例程没有问题哦。。。
回复 支持 反对

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2020-7-25
在线时间
4 小时
 楼主| 发表于 2020-7-31 08:43:21 | 显示全部楼层
白菜菜 发表于 2020-7-30 20:08
1、你的程序不能编译通过吧!
2、void Bluetooth_Receive_Data(u8 *buf,u8 *len) 函数,你是准备把接收的 ...

肯定没问题、、你没看过官方例程 你不知道。。地址for循环怎么有错??我接收定义的是数组,相当于数组++;这个程序都可以执行,没有问题、。。。如果不懂 建议看一下原子哥 的教材 STM32103   关于RS485接收  这一章
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-30 19:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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