4023|8

2781

帖子

419

TA的资源

五彩晶圆(中级)

楼主
 

430 串口优先级问题 [复制链接]

采用430 5438A来作为CPU,使用了它的4个串口来控制不同的仪器
是不是因为串口中断优先级都一样,所以一旦产生,就执行一个动作,而另外一个动作我不知道怎么去延后执行,所以就没掉了
在实验过程中,有个问题很严重,就是如果同时有俩个串口需要响应的话,只能执行其中1个串口的动作,另外一个串口的动作就不能执行,而且这个指令也消失了,有什么办法能解决这个问题么?


这是一位网友QQ上问我的问题。求解

最新回复

我想问下数据怎么存储,然后延后执行,我目前的程序是接收到一个指令,然后把数据存储起来,中断标志置1,就接着去执行这个指令了,如果在执行的时候,有另一个指令过来,又去接收这个指令的数据,会不会把原本的数据给覆盖掉?因为接收数据存储我都是同一个数组存的。此外还有延后执行怎么延后法?  详情 回复 发表于 2013-5-31 15:52
 
点赞 关注
个人签名

回复
举报

7815

帖子

57

TA的资源

裸片初长成(中级)

沙发
 
4个串口,4个中断,即使不设置,它本身也必然有一个默认的处理级别。

另外,所谓 不能执行,指令也消失的说法很奇怪。

延后执行,先把接收到的数据存起来,然后加一个标志,就可以延后执行了。

点评

我想问下数据怎么存储,然后延后执行,我目前的程序是接收到一个指令,然后把数据存储起来,中断标志置1,就接着去执行这个指令了,如果在执行的时候,有另一个指令过来,又去接收这个指令的数据,会不会把原本的数  详情 回复 发表于 2013-5-31 15:52
 
 

回复

114

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
谢谢,是这样子的,比如说通讯协议是包头+指令地址+数据长度+数据+包尾,例如C0 04 01 02 C0
在调试中,上位机单个指令发下去,都能够进行操作,但是如果发的是俩个指令,如
C0 04 01 02 C0 C0 02 05 11 22 33 44 55 C0这样的俩个动作,可能串口1程序中断判断第一个数据接收玩了,然后就去执行第一个指令,第二个指令就不执行了,我想问下这样的延后执行怎么在下位机软件里编写?
 
 
 

回复

114

帖子

0

TA的资源

一粒金砂(高级)

4
 
/******************************************
UART0接收中断函数
PC传给下位机数据包
******************************************/

#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)

{
   unsigned char Temp0=0;
   Temp0=UCA0RXBUF;
   if((preinput0 == SLIP_ESC)&&(Temp0 == (SLIP_ESC+1)))
      {
         RX0Buffer[datalen0++] = SLIP_END;//收到0xDB 0XDC 转换为 (SLIP_END)0xC0        
      }          
         else if((preinput0 == SLIP_ESC)&&(Temp0 == (SLIP_ESC+2)))
           {
              RX0Buffer[datalen0++] = SLIP_ESC;   //收到0xDB 0XDD 转换为 (SLIP_ESC)0XDB
           }
              else if(Temp0 == SLIP_END)         //帧尾
                {
                   if(datalen0 >= 2)
                     {       
                        com0_receive_frame=1;           
                        com0_datalen=datalen0;
                        datalen0=0;
                  
                     }
                   }
                   else if(Temp0!=SLIP_ESC)
                     {
                    
                        RX0Buffer[datalen0++]=Temp0;
                        
                     }   
                preinput0=Temp0;
}

这段是我串口1中断的程序。
 
 
 

回复

114

帖子

0

TA的资源

一粒金砂(高级)

5
 
unsigned char relay_status = 0;//继电器状态
   WDTCTL=WDTPW+WDTHOLD;
   Clock_Init();
   UART0_Init();
   UART1_Init();
   UART2_Init();
   UART3_Init();
   reley_init();
   __bis_SR_register(GIE);
   //__no_operation();

  while(1)
  {
        while(com0_receive_frame)         //串口0数据接收完成
        {
           switch (RX0Buffer[0])  
              {  
                  case 0x00:
                              
                  break;
                  case 0X01:                //串口1 Licor-7000
                  SendUart1(&RX0Buffer[2],RX0Buffer[1]);                               
                  break;
                  case 0X02:                //串口2 注射泵
                  SendUart2(&RX0Buffer[2],RX0Buffer[1]);
                  break;  
                  case 0X03:                //串口3 质量流量控制器
                  SendUart3(&RX0Buffer[2],RX0Buffer[1]);
                  break;
                  case 0X04:                //继电器
                  set_reley_status(RX0Buffer[2]);
                  relay_status = get_reley_status();
                  Send_Frame(0x04,&relay_status,1);
                  break;
                  default:
                  break;
              }
           com0_receive_frame=0;
        memset((void *)RX0Buffer,0,RECEIVE_QUEUE_LENGTH); //清0
                       
        }
这个是主程序。
 
 
 

回复

400

帖子

0

TA的资源

五彩晶圆(中级)

6
 
从程序流程上看没什么特别大的问题.
你所说的执行完一个串口的命令,另一个串口的命令就丢失了是因为你所有的串口接收到的数据都存放在同一个缓冲里面.执行完命令后缓冲被清零了。如果你要处理4个不同的串口,建议你用不同的缓存接收命令,分别处理。
 
 
 

回复

400

帖子

0

TA的资源

五彩晶圆(中级)

7
 
这个问题和串口优先级没有任何关系。

点评

那也就是说,实际上数据是存储进去的,但是执行的时候却只执行第一个指令后就清除了数据,后面一个指令就这样被清除了?  详情 回复 发表于 2013-5-30 09:19
 
 
 

回复

114

帖子

0

TA的资源

一粒金砂(高级)

8
 

回复 7楼 Triton.zhang 的帖子

那也就是说,实际上数据是存储进去的,但是执行的时候却只执行第一个指令后就清除了数据,后面一个指令就这样被清除了?
 
 
 

回复

114

帖子

0

TA的资源

一粒金砂(高级)

9
 

回复 沙发 辛昕 的帖子

我想问下数据怎么存储,然后延后执行,我目前的程序是接收到一个指令,然后把数据存储起来,中断标志置1,就接着去执行这个指令了,如果在执行的时候,有另一个指令过来,又去接收这个指令的数据,会不会把原本的数据给覆盖掉?因为接收数据存储我都是同一个数组存的。此外还有延后执行怎么延后法?
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表