前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C# 地磅串口编程

C# 地磅串口编程

作者头像
跟着阿笨一起玩NET
发布2018-09-20 15:29:28
2.8K0
发布2018-09-20 15:29:28
举报
文章被收录于专栏:跟着阿笨一起玩NET

现实生活中,我们会经常遇到一些串口的设备,例如:IC卡、RFID等;

然后最近有一个项目用到了地磅,这里也是通过串口通讯方式进行数据交互,说实话,地磅这东西,实在有点不方便。

然而,串口的编程,不得不说下串口的DCB(Device Control Block)结构,做过串口编程的人应该都知道,而我这里也只是记录下自己学过的东西,高手路过的请勿吐槽。

一般串口编程都是通过C/C++ 来通信,然后.Net 也封装了SerialPort的控件,但是这里还是简单介绍下:

首先,看看DCB的结构:

代码语言:javascript
复制
 1         //Device Control Block
 2         [StructLayout(LayoutKind.Sequential)]
 3         private struct DCB
 4         {
 5             //taken from c struct in platform sdk 
 6             public int DCBlength;           // DCB结构的长度(以字节为单位)
 7             public int BaudRate;            // 波特率设置
 8             public int fBinary;             // 二进制模式。(必须为1 )
 9             public int fParity;             // TRUE时, 支持奇偶检验
10             public int fOutxCtsFlow;        // TRUE时,支持CTS流控制。 当CTS为OFF时,停止发送。
11             public int fOutxDsrFlow;        // TRUE时,支持DSR流控制。 当DSR为OFF时,停止发送。
12             public int fDtrControl;         // DTR设置。 (置高/置低...)   
13             public int fDsrSensitivity;     // TRUE时,当DSR为OFF,则接收端忽略所有字符 
14             public int fTXContinueOnXoff;   // TRUE时,不管接收端是否Xoff, 本方发送端持续发送。为False 时,则当接收端buffer 达到XoffLim时,发送端发送完Xoff字符后,就停止发送。
15             public int fOutX;               // 发送端支持Xon/Xoff 
16             public int fInX;                // 接收端支持Xon/Xoff
17             public int fErrorChar;          // TRUE时,若fParity为TRUE, 则用ErrorChar替换Parity Check错误的字符。
18             public int fNull;               // TRUE时,接收时去掉空字节(0x0) 
19             public int fRtsControl;         // RTS设置。 (置高/置低...)   
20             public int fAbortOnError;       // TRUE时,发生错误时停止读写操作。
21             public int fDummy2;             // 保留 
22             public ushort wReserved;        // 保留
23             public ushort XonLim;           // 当接收Buffer中的字符减少小XonLim规定的字符数, 就发送Xon字符,让对方继续发送。
24             public ushort XoffLim;          // 接收Buffer达到XoffLim规定的字符数, 就发送Xoff字符, 让对方停止发送。
25             public byte ByteSize;           // 数据位设置
26             public byte Parity;             // 奇偶检验位的设置:0-4=no,odd,even,mark,space
27             public byte StopBits;           // 停止位的设置:0,1,2 = 1, 1.5, 2
28             public char XonChar;            // Xon 字符
29             public char XoffChar;           // Xoff 字符 
30             public char ErrorChar;          // Parity Check 错误时,替换的字符 
31             public char EofChar;            // EOF替代字符 
32             public char EvtChar;            // 事件触发字符
33             public ushort wReserved1;       // 保留
34         }

对于串口的封装,这里有个串口通信类可以用:

http://www.cnblogs.com/tuyile006/archive/2006/09/25/514327.html

然后在打开串口时,需要设置相关的波特率、数据位与校验位:

注意:这里的数据需要通过与 地磅的生产商 取得相应的规格。

然后在串口的选择这里,可以通过程序读取计算机上的硬件设备:

代码语言:javascript
复制
 1 //需要引用组件:Microsoft.VisualBasic.Devices;
 2 private void ParameterConfig_Load(object sender, EventArgs e)
 3 {
 4     cbbCom.Items.Clear();
 5     Microsoft.VisualBasic.Devices.Computer pc = new Microsoft.VisualBasic.Devices.Computer();
 6     foreach (string s in pc.Ports.SerialPortNames)  //遍历本机所有串口
 7     {
 8         this.cbbCom.Items.Add(s); 
 9     }
10     SetValue();
11 }

通过通信类mycom对串口、波特率、数据位、校验位的赋值:

代码语言:javascript
复制
1 ComHelper mycom = new ComHelper();
2 mycom.PortNum = config.Port; //串口;
3 mycom.BaudRate = config.BaudRate; // 波特率;
4 mycom.ByteSize = Convert.ToByte(config.ByteSize); //数据位;
5 mycom.Parity = Convert.ToByte(config.Parity); //校验位;

再读取串口返回的数据:

代码语言:javascript
复制
 1 //1.读取串口数据
 2 byte[] getBytes = mycom.Read(NumsBytes);
 3 
 4 //2。获取16进制字符串
 5 receData = HexConvert.ByteToString(getBytes);
 6 
 7 //3.处理串口连续输出字符串
 8 if (receData.Length > 0)
 9 {
10     OutPutHelper helper = new OutPutHelper();
11     result = helper.getWeight(receData).ToString();
12 
13     //4.其他处理...
14 
15 }

这里获取到的十六进制数:02 72 60 20 30 30 30 36 37 30 30 30 30 30 30 30 0D 4E

说明下,这里的地磅串口输出格式是:

其中: 1.<STX>ASCⅡ起始符.(0 2H) 2.状态字 A、B、C. 3.显示重量,可能是毛重也可能是净重,6位不带符号和小数点的数字. 4.皮重值,6位不带字符和小数点的数字. 5.<CR>ASCⅡ字符(0 DH).

所以,我们只需要从 第5位 开始到 第10位的 数据,即:30 30 30 36 37 30

通过解释后,得到的重量为:670.

如果没有东西过磅的情况下,取到的数据是:30 30 30 30 30 30 

即是:0. 

由于地磅是大磅,不计小数点,所以可以忽略小数点的情况。

 ————————————————————————————————————————————

其实这里通过SerialPort控件来实现串口编程会快捷点,而相关的使用方法,网上很多地方可以找到。

只是首次遇到串口编程的问题,想了解相关内容……

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2012-09-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档