基于C#开发的手机彩盒称重软件

2019-05-14 08:25邓小丁
数字技术与应用 2019年2期
关键词:多线程委托串口

邓小丁

摘要:手机装好彩盒后需要对彩盒进行称重,以防止多装或少装附件。通过软件分析电子秤上传的数据,提取出重量。然后对提取出的重量与标准重量进行比对,并将结果保存于服务器的数据库上。

关键词:串口;正则表达式;多线程;重量稳定;委托

中图分类号:TH715.1 文献标识码:A 文章编号:1007-9416(2019)02-0181-01

0 引言

手机在制造的过程中,需要装手机及充电器、耳机、说明书等附件一起装入彩盒内。为了检查有没有多装或少装附件,我们一般采用对彩盒进行称重来判断。当多装附件时,一般重量会超过标准重量;当少装附件时,一般重量会低于标准重。目前行业中很多企业还是采用人工称重、人工判断,这样容易误判断且没有数据记录。笔者主要针对这情况开发了手机彩盒自动称重并且记录数据的软件。

1 软件实现

1.1 基本功能实现

电子秤一般采用串口向电脑上传数据,c#中有SerialPort这个串口控件。在使用时,先初始化串口。通过SerialPort1.PortName、SerialPort1.BaudRate等设置好参数。

串口的数据接收采用事件SerialPort1.DataReceived自动触发接收。由于电子秤上传的数据可能是连续的、多数据的上传,所以会一直触发接收数据,可能会造成与主程序运行冲突。因此,在数据接收的时候,我们采用多线程技术,使得数据接收与主程序可以并行执行。

private void SerialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)

{

Thread DataReceived_Thread = new Thread(new ThreadStart(DataReceived)); //新建线程

DataReceived_Thread.Start(); //启动线程

}

下面是接收数据函数,调用SerialPort1.Read就可以读取出串口上传的数据。接收代码例子如下:

private void Sp_DataReceived()

{

byte[] buffer= new Byte[SerialPort1.ReadBufferSize + 1];

int count=SerialPort1.Read(buffer,0,SerialPort1.ReadBufferSize);

if(count>1)

{

CommResult =CommResult + System.Text.Encoding.ASCII.GetString(buffer, 0, count);

}

}

接收到电子秤上传的数据后,我们需要从这些数据里面提取出重量。我们用正则表达式提取。例如:G.W. :+ 0.76 kg U.W. :+ 0.00000 g/pcs Total: + 0pcs G.W. :+ 0.89 kg U.W. :+0.00010 g/pcs Total: + 2pcs。从中可以看到我们需要的是G.W. :+ 0.76 kg G.W. :+ 0.89 kg 這几个数据就是重量。我们在采用正则表达式前可以先把一些特殊的字符去掉,比如空格和回车。这样方便匹配不同数据格式的电子秤。

MatchCollection mat  = Regex.Matches(CommResult, @"\+\d{0,}\.(\d{0,})(kg)");

Console.WriteLine(CommResult);

Console.WriteLine(@"The Expression: \+\d{0,}\.(\d{0,})(kg)");

if (mat.Count >= 1)

{

weight= mat[mat.Count - 1].ToString(); //提取最后一次上传的重量

weight=weight.Replace("+","");  //去掉重量前的+号

weight=weight.Replace("kg",""); //去掉重量后的kg

Console.WriteLine(weight);

}

程序运行结果如图1:

这里的正则表达式"\+\d{0,}\.(\d{0,})(kg)"的意思是提取以+号开头,kg结尾,中间为数字加小数点的数据。其他格式的数据修改正则表达式就可以。

1.2 软件可靠性能的实现

在称重过程中,一般电子秤显示的重量是从0开始慢慢增加,甚至超过彩盒本身的重量,然后重量再慢慢稳定下来。所以程序还需要去判断最终稳定下来的重量,这个重量才是彩盒真实的重量。所以优化算法,采用的方法是每次提取的重量缓存起来,然后和上次提取的重量进行比较,如果相差的值在门限范围(Accuracy)内,比如在电子秤精度范围内,认为这是一次稳定值。然后累计这个稳定值,当稳定值超过设定次数(Num),比如5次,认为这是最终的重量。因为不同电子秤它重量稳定的时间不一样,所以这个稳定次数可以自己设置。稳定次数设置越大,软件读取重量的时间就会越长,所以需要根据实际的电子秤进行调节,以减少读取时间。

最后,在线程里面将重量显示在控件上weightout.text= weight.ToString()这个代码会有问题。因为不能在线程里面去操作主线程上的控件,需要采用委托。修改如下:

public delegate void SetText(string txt); '聲明委托类型

var settxt = new SetText(DisplayWeight);

settxt(weight.ToString());

private void DisplayWeight(string txt)

{

weightout.Text=txt;

}

2 软件总结

该程序采用串口控件SerialPort来读取电子秤上传的数据,并用正则表达式提取重量。将正则表达式保存在配置文件,使用者可以方便的修改正则表达式,从而使软件适配所有的电子秤。利用多线程和委托,使得读取电子秤数据和主程序可以并行运行,方便程序设计。通过算法优化,可以防止读取不稳定的重量,减少程序的误读。该软件已经在一些企业中使用,可以兼容各种型号的电子秤,重量读取精度高且稳定。

参考文献

[1] 李春葆,曾平,喻丹丹.C#程序设计教程(第3版)[M].清华大学出版社,2015.

[2] 魏汪洋,靳鲲鹏.C#从入门到精通[M].化学工业出版社,2011.

The Weighing Soft of Phone Box Based on C#

DENG Xiao-ding

(Heyuan Polytechnic,Heyuan Guangdong   517000)

Abstract:After the mobile phone packs in the box,it is necessary to weigh to prevent the more or less accessories.Analysis of the data uploaded by electronic scales through software,weight is extracted.Then the extracted weight is compared with the standard weight,and the result are saved in the server database.

Key words:serial port;regular expression;Multithreading;weight stability;delegate

猜你喜欢
多线程委托串口
浅谈AB PLC串口跟RFID传感器的通讯应用
Java并发工具包对并发编程的优化
USB接口的多串口数据并行接收方法探索
基于蓝牙串口适配器的GPS接收机与AutoCAD的实时无线通信
治理现代化:委托制下的权力清单制
招标代理中的授权委托——以案说法
基于并行控制的FPGA多串口拓展实现