FA1204电子天平与PC机间的串口通信程序设计
基于SerialPort类实现PC机与电子天平间的串口通信
在利用电子天平进行化工实验时,往往需要通过手动记录和计算实验结果,但受到外部的客观环境因素和实验者的主观因素影响,往往会导致误判、误读、误记等情况的发生。本文以此为出发点,基于EIA-RS-232串行通信接口标准,利用Microsoft .NET平台提供的SerialPort控件和USB转RS232连接线,编程实现电子天平和PC机的数据通信,从而协助实验者完成实验结果数值的精准判读、精准记录,降低失误率、提高目标值的计算效率。
1、FA1204电子天平
FA1204电子天平是基于“电子磁力平衡原理”设计制造的,属于FA/JA系列多功能电子天平家族,采用高精度电磁力平衡传感器,精度可达万分之一,最大、最小称量区间为:10mg-120g,外形结构如图1所示。内装有RS-232接口,可与打印机、计算机等外部设备相连,如图2所示。
1.1、FA1204串口通信的基本参数
串口通信的基本参数一般包括:波特率、数据位、起始位、停止位和奇偶检验位。FA1204所属的FA/JA系列电子天平家族采用的串口波特率默认为1200BPS;数据格式为10位,其中1个起始位(0)、8个数据位(采用ASCII码表示,低位在前,高位在后);1个停止位(1);无奇偶校验位。
1.2、FA1204数据帧解析
FA1204电子天平在串口通信过程中每一帧的数据格式遵循如图3所示的标准。
在PC机和FA1204电子天平通过RS-232连接线进行串口通信时,默认以1200BPS的波特率进行数据传输。在传输过程中,每一个数据帧共包含如图3所示的16个字节位,每一个字节位上存放有一个具有特定含义的16进制整数,该整数实质上是遵循ASCII标准的ASCII码值。
在具体应用时,需要根据上述数据帧规范将每一个数据帧中包含的每一个字节位上的16进制数值进行解译操作,将其转换为对应的ASCII字符,从而获取到能够使用户理解、方便使用的数据。
如下表1对图3所示的数据帧规范进行了补充说明。
例如,某一数据帧包含的16个字节的16进制数据内容为:“4B 20 2A 2B 20 20 30 2E 38 36 39 38 20 67 0D 0A”,那么可将其解析为如表2所示的内容,即:此次测量结果为0.8698g。
2、串口通信媒介RS-232 DB9连接线
RS-232标准(协议)全称为EIA-RS-232标准,是常用的、也是与通信行业中应用最广泛的串行通信接口标准之一,适用于传输速率在0-20000bps范围内的通信。利用RS-232串行通信接口可实现PC机与PC机、PC机与其它电子设备之间的通信。
对应的RS-232接口连接线可分为DB-9和DB-25两种类型。其中在工业控制中的RS-232口一般只使用RXD、TXD、GND三条线,FA1204电子天平采用DB-9类型连接线,具体的串口连线如图4所示(可参看附图2:USB转RS232连接线)。
3、Microsoft .Net提供的串口通信控件SerialPort
.Net Framework(框架)简称.NET,是微软公司为开发应用程序创建的平台。该平台提供了包含串口通信控件SerialPort在内的诸多控件,借助该控件可以通过编程实现PC机与FA1204电子天平之间的数据帧传输与内容解析,以便于快速进行化学实验的数据记录与结果计算,达到提高实验效率的目的。关于该控件的基本属性、方法、事件等内容在此不再进行赘述。
4、FA1204电子天平与PC机之间串口通信流程与代码设计
4.1、通信流程设计
本文采用专门用于.NET的C#编程语言完成代码编写与系统实现。基本流程图设计如图5所示。
4.2、通信代码基本设计与实现
4.2.1、串口通信参数设置及其串口的打开
要注意的是:不同的电子仪器所对应的串口通信参数不同,可通过查询产品说明书进行查看。FA1204电子天平串口通信的基本参数的基本情况在"1.1、FA1204串口通信的基本参数介绍"已经进行过简要介绍,在此不再进行赘述,示例代码如下:
//打开串口
public static void openSerialPort(SerialPort serialport,
string portName,//端口名称
int baudRate=1200,//波特率
int dataBits=8,//数据位
StopBits stopBits=StopBits.One,//停止位
Parity parity=Parity.None,//奇偶校验位
int readtimeout=1000
)
{
//设置串口参数
serialport.PortName = portName;
serialport.BaudRate = baudRate;
serialport.DataBits = dataBits;
serialport.StopBits = stopBits;
serialport.Parity = parity;
serialport.ReadTimeout = readtimeout;
//打开串口
serialport.Open();
//打开/关闭窗口
if (!serialport.IsOpen)
{
MessageBox.Show("通信串口打开失败!","Tips");
}
else {
MessageBox.Show("通信串口打开成功!","Tips");
}
}
4.2.2、串口通信中数据帧的解析
要注意的是:不同的电子仪器所对应的数据帧编码格式不同,可通过查询产品说明书进行查看。FA1204电子天平数据帧的编码格式在“1.2、FA1204数据帧解析”中已经介绍过,在此不再进行赘述,示例代码如下:
/// <summary>
/// 从byte[]——字节数组中解析出称量结果,并通过引用传递设置称量单位
/// </summary>
/// <param name="buffer">从缓冲区中读取到的、包含16进制数值的字节数组</param>
/// <param name="unit">测量所使用的单位(g与kg)解析</param>
/// <returns>测量结果值</returns>
public static decimal getRealWeightByBuffer(byte[] buffer, ref string unit)
{
try
{
//解析称量结果
//1-获取数值信息[48-57]
string str = "";
for (int i = 0; i < buffer.Length; i++)
{
if (buffer[i] >= 48 && buffer[i] <= 57 ||
buffer[i] == 46)
str += ((char)buffer[i]);//转为ASCII字符
if (buffer[i] == 103 || buffer[i] == 107)
unit += ((char)buffer[i]);
}
return Convert.ToDecimal(str);
}
catch (Exception e)
{
MessageBox.Show(e.Message);
return 0.0M;
}
}
4.3、串口通信过程中的实验数据值判读问题
4.3.1、问题描述
在SerialPort通信串口实例的打开后,电子天平持续向PC机传送数据帧,从中可以解析、获取连续变化的测量数据值,因此,就需要从连续接收到的大量数据中筛选出有效的、真实的测量结果值,并将其添加到控件中显示。
4.3.2、解决方案设计
设一次测量过程中(忽略外界故意施加重力的影响),电子天平显示屏上的读数变化序列为{X1,X2,X3,X4,......Xn},其中n>1且为整数,Xn表示第n次测量时,电子天平上显示屏上的读数。经过实际检验可知,在使用电子天平测量物质时,Xn与n之间成S型曲线变化,整体呈单调递增变化。
可设测量物质时,相邻两次测量值Xn-1和Xn之间的微小变化量ΔX=Xn-Xn-1(此时,Xn>Xn-1,且Xn≠0,Xn-1≠0)。连续计算两个不为零的测量结果之间的差值,如果连续K(K>1)个Δ都等于0(或无限趋近于0),即认为该值为最终的有效测量结果。即可将改值作为有效值添加到控件中进行显示。
4.3.3、代码设计与编写
如下为SerialPort接收数据事件和提取有效数据的示例代码:
private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Thread.Sleep(150); //(毫秒)等待一定时间,确保数据的完整性 int len
int len = this.MySerialPort.BytesToRead;//16个字节
decimal weight = 0.0M;
string unit="";
string receivedata = string.Empty;
//通过判断字符长度来确定是否接收数据
if (len != 0)
{
byte[] buff = new byte[len];
this.MySerialPort.Read(buff, 0, len);
for (int i = 0; i < buff.Length; i++)
{
receivedata += buff[i] + " ";
}
//解析byte[]数组含义(长度限制:16-32)
if(buff.Length>=16&&buff.Length<32){
weight = SerialPortUtils.getRealWeightByBuffer(buff,ref unit);
if (weight == 0)
{
//如果测量值减小为零,表示新一轮的称重测量,将临时List、目标list置空
this.templist.Clear();
this.list.Clear();
}
this.lastKeyValue = new KeyValuePair<decimal, string>(weight, unit);
this.templist.Add(this.lastKeyValue);
//检验是否获得测量结果
KeyValuePair<decimal, string> kv = getResKeyValuePair(this.templist, this.lastKeyValue);
if (kv.Key != 0)
{
this.list.Clear();//清除上次记录的测量结果
this.list.Add(kv);
}
}
}
}
/// <summary>
/// 获取测量结果-单位-KeyValue键值对
/// </summary>
/// <param name="list">存放有效键值对的集合</param>
/// <param name="curKeyValuePair">当前键值对实例</param>
/// <returns>有效的键值对实例</returns>
private KeyValuePair<decimal, string> getResKeyValuePair(List<KeyValuePair<decimal, string>> list, KeyValuePair<decimal, string> curKeyValuePair)
{
int count = 0;//计数器
KeyValuePair<decimal, string> last;
for (int i = 0; i < list.Count; i++)
{
if (count >= 10)//如果计数器≥10,就终止循环,并返回目标值作为结果
return curKeyValuePair;
if (count == 0 && list[i].Equals(curKeyValuePair))
{//首次比较,相等开始计数
count++;
last = list[i];
}
else if (list[i].Equals(curKeyValuePair) && curKeyValuePair.Equals(curKeyValuePair))
{
count++;//非首次比较,要满足:当前元素和目标值相等&&上一个元素和目标值相等
}
else
{
count = 0;//都不满足,则将计数器重置为零
list.Clear();//同时清空数据集,提高比较效率
}
}
return new KeyValuePair<decimal, string>(0.0M, "g");//找不到就返回0.0g
}
5、结束语
本文利用 .NET 中的 SerialPort控件实现了 PC机与电子天平之间的串口通信,从而实现PC机与FA1204电子天平之间的数据帧传输与内容解析,以便于快速进行电子天平上实验结果判读、数据记录与结果计算和持久化保存,达到提高实验效率的目的。
*参考文献:
[1]王健.基于VB的电子秤通信实例[J].电脑编程技巧与维护,2010(22):105-107.
[2]刘岩,汪剑云,吴北平,李兵,聂小波,肖昶.基于VB.NET的GPS接收机串口通信的实现[J].地理空间信息,2012,10(02):47-49+180.
[3]刘马飞.C#串口高效可靠的接收方案设计[J].物联网技术,2018,8(08):23-25.
[4]FA/JA系列精密电子天平使用说明书.
*附:
本文地址:https://blog.csdn.net/weixin_43524214/article/details/109247632