前面说了那么多的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() |
6 | Thread thread = new Thread( new ThreadStart(ReceiveACK)); |
7 | thread.IsBackground = true ; |
11 | thread.Join(_timeout_milliseconds); |
13 | if (receiveACK == true ) |
26 | protected void ReceiveACK() |
至于如果收到的是NAK,你再重新发一次,直到6次,你才罢休,发送[EOT]结束传输,这个要怎么做,聪明如你,还要我讲么?
4、校验和,校验和要怎么做?将Text的每个字节相加除以256取余数,然后高四位为[chk1],第四位为[chk2]。
怎么取出来高四位和低四位呢,用到两个运算符,右移运算符>>,和逻辑与&,假设这个字节叫byte,那么:
高四位就是: (byte & 0xf0) >> 4;
低四位就是: byte & 0x0f
注:Ox0f就是00001111,而0xf0就是11110000,至于&是个啥,你自己看着办吧。
好了,主要的难点问题,吵吵都帮你解决了,现在你有信心可以分装出一个类来了么?
神马?你没有学过c#,不知道该怎么办?吵吵爱莫能助。
神马?你还想要已经封装好的?入群吧。