OpenEdv-开源电子网

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

串口通信问题,用的串口接收函数是原子哥写的官方例程,接收时候如果不对接收数据个数判断会出错,好奇怪,求指教;

[复制链接]

3

主题

9

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2020-7-25
在线时间
4 小时
发表于 2020-7-25 21:22:32 | 显示全部楼层 |阅读模式
以下是原子哥的官方例程:
串口中断函数:
       
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[i]=Bluetooth_RX_BUF[i];       
                }               
                *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[1]=0x02) LED0=0;

   }

}

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

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

求大神指教,困扰好多天了



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

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2020-7-25
在线时间
4 小时
 楼主| 发表于 2020-7-27 11:29:45 来自手机 | 显示全部楼层
文中写错了一个语句  是dat[0]=0x01.data
回复 支持 反对

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2020-7-25
在线时间
4 小时
 楼主| 发表于 2020-7-27 11:31:29 来自手机 | 显示全部楼层
dat[0]=0x01   ;         data[0]=0x02;  手抖打错了,,但是不对number进行判断,LED0还是无法点亮,啥意思
回复 支持 反对

使用道具 举报

2

主题

459

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4498
金钱
4498
注册时间
2018-5-14
在线时间
962 小时
发表于 2020-7-27 12:27:31 | 显示全部楼层

回帖奖励 +1 金钱

首先 if(Data[0]=0x01)是赋值操作,if判断的是Data[0]=0x01这一步操作是否完成。
回复 支持 反对

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2020-7-25
在线时间
4 小时
 楼主| 发表于 2020-7-28 11:36:41 | 显示全部楼层
姚先起 发表于 2020-7-27 12:27
首先 if(Data[0]=0x01)是赋值操作,if判断的是Data[0]=0x01这一步操作是否完成。

不好意思 书写错误,我的程序写的是

while(1)
{
Bluetooth_Receive_Data(data,&number);
if(number!=0)
{

   if(data[0]==0x01)LED1=0;
      if(data[0]==0x02) LED0=0;
}
   
}

如果不对number进行判断 就会出错,,不执行第二个语句,不明白为什么
while(1)
{
Bluetooth_Receive_Data(data,&number);

      if(data[0]==0x01)LED1=0;
      if(data[0]==0x02) LED0=0;
}

回复 支持 反对

使用道具 举报

2

主题

459

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4498
金钱
4498
注册时间
2018-5-14
在线时间
962 小时
发表于 2020-7-28 12:20:15 | 显示全部楼层
tuxiaoli110 发表于 2020-7-28 11:36
不好意思 书写错误,我的程序写的是

while(1)

没看出来问题,你可以试试把编译器的优化关掉看一下
回复 支持 反对

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2020-7-25
在线时间
4 小时
 楼主| 发表于 2020-7-30 09:13:51 来自手机 | 显示全部楼层
还有兄弟知道呀,,麻烦给解释解释呀,自己定一下
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 04:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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