基于MDB/ICP协议的自动售卖系统的主控制器 - 中国一卡通网
用户名密码 [免费注册] [找回密码] 推广技巧 发布求购 建商铺  发产品  会员体制比较  
 

基于MDB/ICP协议的自动售卖系统的主控制器

来源:中国一卡通网  作者:不详  发布时间:2012-05-30 08:45:18  字体:[ ]

关键字:自动售卖系统  MDB/ICP协议  控制器  

摘   要:  本文介绍了欧洲售机制造者协会(EVMMA)制定的MDB/ICP总线协议。该协议简洁明了,功能强大,可扩展性强,并且对外挂外设备数目没有限制,是理想的自动售卖系统内部总线协议。本文从主控制器的角度给出了对MDB/ICP总线进行操作控制的硬件和软件实现。


  (2)字节的传送 

  这里需要注意的是:发送数据时要根据需要设置方式位,而接收数据时要返回方式位的值,以判断是否收完所有数据。

  // 传送字节

  void TransmitByte(uchar byte,bit mode)

  //形参:byte——准备发送的字节

  // mode——预备要设置的方式位

  {

  TB8=mode; //设置方式位

  SBUF = byte; //发送字节

  While(!TI); //等待发送完毕

  TI=0;

  }

  //接收字节

  #pragma disable

  uchar ReceiveByte(uchar *byte,uchar *bMode)

  //形参:*byte——返回接收到的字节值

  // *bMode——返回接收到的字节的方式位

  //返回值:0—超时,1—成功接收

  {

  TMOD &=0xf0;

  TMOD |=0x01; //设置定时器0为方式1(16位)

  TH0=T_RESPONSE;
  
  TL0=0x00; //设置超时门限

  TF0=0;

  TR0=1; //定时器0使能

  While (!RI && !TF0)

  ; //等待接收字节直至超时

  TF0=0;

  if(RI){ //已接收字节

  RI=0;

  *byte=SBUF; //返回字节值

  *bMode=RB8; //返回方式位

  return 1;

  }else{ //超时

  RI=0;

  return 0;

  }

  } 

  (3)数据块的传送

  这部分与下面的会话部分放在一个函数体内实现。

  (4)会话

  #s嵌入http://www.baidu.com/百度$pp百度ZHDfbaiducukd9d


  #s嵌入http://www.baidu.com/百度$pp百度ZHDfbaiducukd9d
  这是MDB会话控制的核心部分。根据需要传送数据包,计算校验字节,控制方式位,在时序允许的响应时间内接爱外设返回的数据,做出ACK或NAK等反应。并且按照MDB/ICP标准中堆荐的方式处理异常情况,当接受数据超时或校验和错时,重复发送命令多次,以增强容错性能。将接收到的数据返回给调用乾,并返回结果码。源程序如下:

  //与外设会话,在调用之前确认译码器选通MDB总线

  uchar Session(uchar add,uchar dat[],uchar count)

  //形参:add——VMC发送的地址指令字节

  // dat[]——VMC发送的数据块

  // count——数据块的大小

  //返回值:0——外设应答ACK

  //非0且小于0x80——外设应答的数据块的大小

  //大于等于0x80——会话中出错

  //外设应答的数据块存放在全局数组uchar recBuff[]

  {

  uchar data check,i,j,err;

  uchar data mode;

  for(j=0;j<5;j++){ //最多重复发送命令5次

  check=0;

  err=0;

  TransmitByte(add,1); //发送地址字节

  Check +=add; //计算CHK

  For(i=0;i<count,i++){ //发送数据字节

  TransmitByte(dat,0);

  check +=dat; 

  }

  TransmitByte(check,0); //发送CHK

  for (i=0,check=0,mode=0;

  !mode && i<MAX_BLOCK_SIZE && !err;

  i++)

  {//反复接收字节直到方式位为1或出错

  //接收到的数据存在全局数组recBuff[]里

  if(!ReceiveByte(recBuff+i,&mode))

  //超时。外设可用超时表示NAK

  err=i?ERR_TIME_OUT:NAK;

  else if (i= =0 && recBuff= =NAK && mode)

  //收到NAK

  err = NAK;

  else if (!mode)

  //方式位为0表示还有数据

  check +=recBuff;

  } //for i

  if(!err){ //未发生错误

  if (!mode){

  //收完36个字节还未结束

  TransmitByte(NAK,0);

  err=ERR_NO_MODE_BIT;

  }else if (i>1) {

  //收到数据块

  if(check !=recBuff[i-1]){ //校验和错

  TransmitByte(NAK,0);

  err=ERR_CHECKSUM;

  } else{

  //一切正常,发送ACK后跳出循环

  TransmitByte(ACK,0);

  break;

  }

  } else

  //收到外设传来的ACK

  break;

  }//if(!err)

  Wait(T_RESPONSE); //防止与外设数据冲突

  }//for j

  //返回接收到的数据块大小或出错代码

  return err?err:(i-1);

  }

  本文使用DS5002FP实现了对MDB总线的控制与访问。通过将MDB/ICP协议进行分解,很好地实现了总线驱动。实践证明该驱动程序稳定、可靠,大大降低了上层界面开发的难度,提高了系统的可维护性,节约了成本。

更多

新闻投稿合作邮箱:yktchina-admin@163.com    字体[ ] [收藏] [进入论坛]

推荐文章

论坛热帖