面向对象思想大挑战???实际问题,大家说说你的第一想法(300分)

  • 主题发起人 主题发起人 xuegaoyili
  • 开始时间 开始时间
X

xuegaoyili

Unregistered / Unconfirmed
GUEST, unregistred user!
现有一系统要用pc和单片机进行一对多通讯,双方都可以主动发送指令。指令格式是
我们自定的一种格式。要求双方都能主动进行发送,各方在自己主动发送完指令后等对方
回发一个应答指令,如果在一定时间(200ms)内没有得到应答,主动发送方要能够进行
从发,从发5次后还没应答就停止。每个从机都有自己的固定地址。发送的指令上也有地
址头,长度,指令字,参数。而且双方在接到对方的指令后不紧要回应答,一般指令还
会有对应的指令发回去(例:从机发"从机上电",PC机收到后先发"主机应答",紧接着就
发"时钟通报"。接到从机的"从机应答"后这次会话结束。)
现在的问题:我想用面向对象的方法设计一个类或记录结构去描述从机,也就是在PC机看
来每一个从机都是一个对象。我先想了一个,做为抛砖,有玉的尽管抛。。。。
TWashControler = record
subEnabled: integer;
////控制器是否有效设置,0为有效,1为无效,为1则不进行操作
SubAddress: byte;
////控制器地址,8位;
SubType: string;
////控制器类型:1是洗浴,2是查询,3是售卡
SubState: integer;
////控制器状态,0为未知,1为正常
HasCard: integer;
////控制器当前是否有卡,0为无卡,1为有卡;
CardNum: array[1..5] of byte;
////这里是二进制卡号数组,5字节
CardID: string;
///////////////////这里是字符串形式的卡号
startime: TDateTime;
/////当前卡使用的开始时间;
endtime:TDateTime;//////当前卡结算时间
lastamount: integer;
/////上一次结算的钱数
allamount: integer;
//////一天的总钱数
washer: integer;
////////一天中本控制器的使用人数;
lastsend: integer;
//////用于判断下面的指令要不要发送,1表示发送,0表示已经发过了
lastcommand: TMainCommand;
/////已发送成功但没有得到控制器应答的最后一条指令;
autosendagain: integer;
////用于判断是否进行定时重发,为1表示要检测noanswertime,大于指定(500ms)就自动再发一次,更新noanswertime
noanswertime: longint;
////最后发送的指令的发送毫秒级时间,用于下次检测是否要重发。用下次得到的值-这个值》规定值就重发
sendcount: integer;
////最后发送成功的指令的发送次数当发送10次无应答后,设控制器无效:
upcommand: TMainCommand;
/////从机控制器发给服务器的最新一条指令
end;
 
你那个好象是收银系统
 
增加了单片机对指令的回应而已
 
拜托:说说你遇到这种东西 要怎么建立 这个记录结构呀。。
 
如果采用对象方式,你的设计有问题。把同类属性放在一个类里面,各个类来打交道。
 
这样的结构可以了啊
 
可以加上数据到达的事件,
以及要标示客户机的状态:
1。空闲,2。数据到达,3。等待回应
 
因为这个数组我要在多个线程中用到,所以事件加上不知道它的响应顺序。
有谁知道spcomm控件的onreceivedata事件和onreceiveerror事件哪个在前,哪个在后。
如何在接收错误时丢弃接收的数据
再有就是请各位写写例子呀
 
学习学习
 
不用丢弃,忽略即可,
发送数据最好采用,收到即应答的方式,保证数据的可靠性
例如,每发出的数据包,都必须收到对方收到的回应数据包,
如果没有收到,则在短时间内重发,
对双方都是这样
其实,是不是面向对象并不是重要的,
面向对象仅仅是分析问题的一种方法,
最主要是可靠性和效率
 
前面的应用属性没什么说的,后面的属性设计成状态机就可以
 
面向对象!?
 
to 天空还下着沙,
我知道自己的不是面向对象的.所以才放在这里让有这方面知识的给试着封装成
一个类什么的.只要写出大骨架就行了....为什么没有人愿意留下"墨宝"
 
对你的需求不清楚
 
个人认为,这样设计存在问题,这么大的对象不太好控制,说说具体需求,重新细分一下
 
to bluesaga:
具体的需求主要是想用类来模拟一个能接受远程指令,根据指令能反回对应指令的一个
终端对象。细节上有:主、从机都有个应答指令,该指令要求在收到一个格式正确的指令后
进行回发。比如主机收到从机一条XX指令,主机首先要回发一个"主机应答"指令。让从机知道主机已经收到它发的指令,然后主机在分析完这条指令后一般会生成一条新指令。再把这条新指令回发给对应的从机,再等到从机发的"从机应答"这一通讯过程就算结束。其中收到主、从应答指令是不用再回发从、主机应答的。再有就是如果主机发了一条非应答指令后,再500ms内没有收到从机的应答指令,主机应该把上次发的指令再发一次(有些指令是计算出来的。所以要求发完后在没收到应答之前类应能保存这条指令)。当发送5次后都没应答。主机就应设置一个标志表明通讯有错。从机也是一样。其他的一些变量主要是记录各从机的一些状态的。倒不是很难。难就难在通讯这一部分如何能做成方法封装到类里。
 
看来只能这样了
 
后退
顶部