OpenEdv-开源电子网

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

串口接收数据问题

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2016-12-1
在线时间
2 小时
发表于 2016-12-1 22:38:58 | 显示全部楼层 |阅读模式
1金钱
在战舰开发板的串口1上装一个接收数据的设备,将收到的数据通过串口1存储到一个缓冲区,然后在主函数中做一个判断,如果接收到了指定的数据(我指定的数据为:0xFD  0x75  0x55), 就做出自己定义的操作,
接收数据存储到缓冲区的函数如下:
static         uint8_t com1p = 0;
void USART1_IRQHandler(void)
{
       uint8_t value = 0;
       if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
         {
                  LED1=0;
                  ReceiveFlag=true;                 
                   USART_ClearITPendingBit(USART1,USART_IT_RXNE);
                 
                  value=USART_ReceiveData(USART1);
                  Com1Buf[com1p++]=value;
                  if(com1p==7) com1p=0;
                  USART_SendData(USART1,value);
                  //Loop until the end of transmission
                  value=0x0;
                  while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);        
         }
         ReceiveFlag=false;                 
}


主函数的判断函数如下:
if((Com1Buf[0]==0xFD)&&(Com1Buf[1]==0x75)&&(Com1Buf[2]==0x55))
                {
                   currentDataPoint.valuegate1=!(currentDataPoint.valuegate1);        
                       if(currentDataPoint.valuegate1==1)                        
                        printf("door lock open!\n");
                 else
                        printf("door lock close!\n");                        
    }

我将上面的判断代码放在主函数的一个死循环里面扫描,如果接收到指定数据,相应的操作就会被触发,但现在向设备发送信号,主函数并没有做出相应的操作,求解。





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

使用道具 举报

1

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2015-10-8
在线时间
32 小时
发表于 2016-12-2 01:33:30 | 显示全部楼层
如果 是连续发送的0xFD  0x75  0x55 字串,    你不能保证是依次接收到的.
比如发送的是 0xFD  0x75  0x55 0xFD  0x75  0x55 0xFD  0x75  0x55...
接收的可能是           0x75  0x55 0xFD  0x75  0x55 0xFD  0x75  0x55...
听懂了么 , 这样你的 接收字串 就是 0x75  0x55 0xFD
所以你的中断接收有问题.   应该在数组空的时候,  读取第一个字节进行判断  一定要0xfd 才进行接下来的继续接收
回复

使用道具 举报

21

主题

387

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1043
金钱
1043
注册时间
2016-9-8
在线时间
213 小时
发表于 2016-12-2 09:53:34 | 显示全部楼层
shop60994719.taobao.com
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2016-12-1
在线时间
2 小时
 楼主| 发表于 2016-12-3 12:47:34 | 显示全部楼层
lavion 发表于 2016-12-2 01:33
如果 是连续发送的0xFD  0x75  0x55 字串,    你不能保证是依次接收到的.
比如发送的是 0xFD  0x75  0x55  ...

您好,谢谢您的回复,您说的这问题我考虑过,我将在函数中设定了一个标志,如下:
static         uint8_t com1p = 0;
bool flag=false;
void USART1_IRQHandler(void)
{
         uint8_t value = 0;
   if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
         {
                  LED1=0;
      ReceiveFlag=true;                 
                   USART_ClearITPendingBit(USART1,USART_IT_RXNE);
                  value=USART_ReceiveData(USART1);
                  if(value==0xFD)
                                flag=true;
                        if(flag==true)
                  Com1Buf[com1p++]=value;
            if(com1p==7)
                        {
                                com1p=0;
                          flag=false;
                        }
            //printf("%d ",value);
               
                  USART_SendData(USART1,value);
                  //Loop until the end of transmission
            value=0x0;
                  while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);       
         }
        //printf("\n");
         ReceiveFlag=false;                 
}
但依然不行,值得研究的是,我只要在这个函数里面加一个printf语句,就可以实现我的操作,好像这个printf函数起到了一个激活的作用,您看呢?
回复

使用道具 举报

1

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2015-10-8
在线时间
32 小时
发表于 2016-12-3 18:41:30 | 显示全部楼层
你的编程思路完全有无.      中断 一定要 快进快出,  越快越好,     
怎么在你的中断里面,  还能while 的等待 ,  串口本来就慢发送.
你的COM1P 为什么 是7  而不是3.  
另外  你的串口中断清除 有问题,   1 不该放在中间位置   2 如果再中断中 又接收了新的字符呢(你的串口中断 特别耗时, 这期间接收字符 完全可能),  这个时候 中断挂起位  本来就该挂起, 为什么要清除?


你自己好好研究下,   答案一下告诉你, 也不见得好事.     字符串的接收  基本 不应该这么写
回复

使用道具 举报

5

主题

106

帖子

0

精华

高级会员

Rank: 4

积分
757
金钱
757
注册时间
2015-10-27
在线时间
180 小时
发表于 2016-12-3 20:56:07 | 显示全部楼层
这个地方是不是可以使用串口空闲中断呢?先把一帧数据完全接收,然后再判断。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-25 21:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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