吵吵   2014-07-05  阅读:2,627

前面说了那么多的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()这个函数,这个函数有什么用呢,官方解释就是阻塞直到进程或者时间结束。

public bool BeginTransfer()
  {
    
    receiveACK = false;
    this.SendENQ;
    Thread thread = new Thread(new ThreadStart(ReceiveACK));
    thread.IsBackground = true; // 作为后台线程处理
    thread.Start();

    // 等待如下的时间
    thread.Join(_timeout_milliseconds);

    if (receiveACK == true)
    {
     
      thread.Abort();
      return true;
    }
    else
   {
      thread.Abort();
      return false;
    }
}

protected void ReceiveACK()
  {
    bool bLoop=true;
    while(bLoop)
   {
        //读取serialport.read()直到读取到了ACK:
        bLoop=false;
        receiveACK=ture;
    }
  }

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

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

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

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

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

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

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

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

吵吵微信朋友圈,请付款实名加入:

吵吵 吵吵

3条回应:“一步一步教你做LIS接口教程(四)”

  1. 彩虹之家说道:

    让我大开眼界 啊!

  2. 恩恩,学习到了

  3. 亚马逊开店说道:

    [心] 学习了,给朋友看看

发表评论

电子邮件地址不会被公开。 必填项已用*标注