用户登录  |  用户注册
首 页商业源码原创产品编程论坛
当前位置:PB创新网文章中心解决方案电子通信

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

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2009-01-10 22:48:20
这是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协议进行分解,很好地实现了总线驱动。实践证明该驱动程序稳定、可靠,大大降低了上层界面开发的难度,提高了系统的可维护性,节约了成本。



上一页  [1] [2] 

Tags:

作者:佚名
  • 好的评价 如果您觉得此文章好,就请您
      0%(0)
  • 差的评价 如果您觉得此文章差,就请您
      0%(0)

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
PB创新网ourmis.com】Copyright © 2000-2009 . All Rights Reserved .
页面执行时间:16,984.38000 毫秒
Email:ourmis@126.com QQ:2322888 蜀ICP备05006790号