野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 19009|回复: 1

求看串口USART通讯接收问题!

[复制链接]
发表于 2019-7-10 17:42:03 | 显示全部楼层 |阅读模式
我的程序是一个串口屏向单片机发送数据,然后单片机根据内容响应开启了USART1、USART2
如果只是在接收中断里面写收到就马上转发出来,没问题
但是一旦判断就没反应。用IAR调试但是又只进一次中断,不知道什么原因!
下面为主要程序代码:
定义了一个结构体:
typedef struct
{
  u8 head;                       //接收自定义头  0xaa
  u8 data[15];                 //内容数组
  u8 data_pt;                 //用于数组  
  u8 end_byte;              //结束字符  0xdd
  u8 lock_flag;              //完成标志 1=完成,0=未完成
}ptr_stack;
extern ptr_stack rx_stack;
//------------------------------------------------------------------

//main.c文件的主要部分

main()
{
while(1)
    {
        if(rx_stack.lock_flag == 1)             //如果数据接受完成,进行下一步判断
        {
          if(rx_stack.data[1] == 0xbb)      //如果这个位的数组等于0xbb,那么进行下面的操作
            {
              u2_printf();                            //这个是一个通过USART2的内容输出  
              rx_stack.lock_flag = 0;          //将接收完成标志归0,意思就是解锁接收
              rx_stack.data_pt=0;             //归零
              rx_stack.end_byte=0;          //完成标志归零
               }
          if(rx_stack.data[1] == 0xcc)
            {
              normal_mode();                    //这个是另外一个通过USART1的内容输出
              rx_stack.lock_flag = 0;          //将接收完成标志归0,意思就是解锁接收
              rx_stack.data_pt=0;             //归零
              rx_stack.end_byte=0;          //完成标志归零
             }
        }
    }

}



//----------------------------------------------
//下面是Usart.c的重要部分
//配置肯定是没问题,中断等级USART1是0,0  : USART2是1,0
void USART1_IRQHandler(void)
{
  u8 rev_data;
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //判断读寄存器是否非空
      {
           if(rx_stack.lock_flag == 0) //如果串口没锁住,代表协议未满
                {
                       // rev_data = USART_ReceiveData(USART1);
                      rev_data =  USART1->DR;                                      //读数据,手持上说,读了数据自然就清除了标志,但是为了保险,还是再次手动清除

                       if(rev_data == 0xAA)                                                     //如果是头,则放入头里面
                        {
                             rx_stack.head = rev_data ;
                        }
                       else if(rev_data == 0xDD)                                                       //如果是结束,则放入结束里面
                        {
                             rx_stack.end_byte = rev_data ;
                         }
                      else
                       {
                          rx_stack.data[rx_stack.data_pt++] = rev_data;                  //如果既不是头,也不是尾就放入数据组里面
                        }
                      if((rx_stack.data_pt >= 5) && (rx_stack.end_byte == 0xDD))          //如果接受状态满,且结束位也被接收到,则锁住,直到数据被处理之后解锁
                        {
                            rx_stack.data_pt=0;
                            rx_stack.lock_flag = 1;
                         }
                 }
                USART_ClearFlag(USART1, USART_IT_RXNE);                                        //手工再清除接受中断标志   
         }
}





//--------------------------------------------------------
主要程序如上,用串口调试,
发送数据  AA CC CC 30 31 39 30 37 30 38 32 32 34 37 DD  
或者  AA DD DD 30 31 39 30 37 30 38 32 32 34 37 DD

都没有任何反应,
IAR也不熟,设置断点在  rev_data =  USART1->DR;  这个地方,发数据来的时候,中断会响应,单步执行完一次,就没有第二次了


回复

使用道具 举报

 楼主| 发表于 2019-7-10 18:05:45 | 显示全部楼层
更正一下,第二个发送写错了,是发送的   AA BB BB 30 31 39 30 37 30 38 32 32 34 37 DD
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-12-6 13:57 , Processed in 0.036791 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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