鄧小丁

摘要:手機裝好彩盒后需要對彩盒進行稱重,以防止多裝或少裝附件。通過軟件分析電子秤上傳的數據,提取出重量。然后對提取出的重量與標準重量進行比對,并將結果保存于服務器的數據庫上。
關鍵詞:串口;正則表達式;多線程;重量穩定;委托
中圖分類號: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