一步一步教你做LIS接口教程(四)

前面说了那么多的ASTM的协议规范的东西,有人会讲,你说那么多有个毛用,即便是我了解了那些框架,我也不知道怎么转化为代码啊,但是如果你不了解这些框架,那么你连转化为框架的机会都没有。

以前总是纠结写的代码编译出来的东西,应该叫程序还是叫系统?叫系统虽然会有些唬人,但是确实是最准确的表达,现实的生态往往并不是线性逻辑那么简单,而是一个相互连接,相互影响的系统,因此系统架构架构就显得比较重要。但是如果你无法一窥全貌,想搞出一个比较好的架构就非常困难了。

首先来看看ASTME1381-02,即底层的传输框架要怎么做吧。

如果你不了解c#串口通信,不了解ASTME1381-02,请出门左转去看吵吵以前发的文章吧。

那么如果我们构建一个ASTME138102的类,我们需要解决一些什么难点呢?

1.传输状态。传输状态应该有3个,空闲、发送、接收。当空闲状态时候,LIS接口可以接收数据,并转到接收状态,否则将回复[NAK],不接受IPU的传输请求。

2.数据接收。数据接收可以通过serialPort控件中的dataReceived事件来接收数据,将所有的数据都接收后,直到遇到[EOT]信号,然后定义一个新的事件allDataReceived,接收完数据就调用这个事件!至于接收到的数据再该怎么分析,这是表现层的事情了,应该由ASTME139497去解决了。

3.数据发送。数据发送是个最麻烦的地方因为涉及到超时和重复发送的问题。

当LIS接口给IPU发送了[ENQ]信号时候,它如果不回复,那么15秒后,就应该返回超时的错误,这个要怎么做?吵吵考虑了半天,搜索了N多的网页找到了thread.join()这个函数,这个函数有什么用呢,官方解释就是阻塞直到进程或者时间结束。

1 public bool BeginTransfer()
2   {
3  
4     receiveACK = false;
5     this.SendENQ;
6     Thread thread = new Thread(new ThreadStart(ReceiveACK));
7     thread.IsBackground = true; // 作为后台线程处理
8     thread.Start();
9  
10     // 等待如下的时间
11     thread.Join(_timeout_milliseconds);
12  
13     if (receiveACK == true)
14     {
15  
16       thread.Abort();
17       return true;
18     }
19     else
20    {
21       thread.Abort();
22       return false;
23     }
24 }
25  
26 protected void ReceiveACK()
27   {
28     bool bLoop=true;
29     while(bLoop)
30    {
31         //读取serialport.read()直到读取到了ACK:
32         bLoop=false;
33         receiveACK=ture;
34     }
35   }

至于如果收到的是NAK,你再重新发一次,直到6次,你才罢休,发送[EOT]结束传输,这个要怎么做,聪明如你,还要我讲么?

4、校验和,校验和要怎么做?将Text的每个字节相加除以256取余数,然后高四位为[chk1],第四位为[chk2]。

怎么取出来高四位和低四位呢,用到两个运算符,右移运算符>>,和逻辑与&,假设这个字节叫byte,那么:

高四位就是: (byte & 0xf0) >> 4;
低四位就是: byte & 0x0f

注:Ox0f就是00001111,而0xf0就是11110000,至于&是个啥,你自己看着办吧。

好了,主要的难点问题,吵吵都帮你解决了,现在你有信心可以分装出一个类来了么?

神马?你没有学过c#,不知道该怎么办?吵吵爱莫能助。

神马?你还想要已经封装好的?入群吧。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值