سلام
من برای 2 باسکول چنین برنامه ای طراحی کردم ولی متاسفانه با باسکول مورد نظر تو کار نکردم ولی میدونم که روش کار یکی است .
این برنامه ها از چهار مرحله تشکیل میشن .
- معرفی پورت
- فرستادن اطلاعات
- انتظار برای گرفتن اطلاعات از باسکول
- گرفتن اطلاعات و نمایش آنها
من برای هر کدوم از این مرحله ها یک Method نوشتم کهامیدوارم بتونه کمی موضوع رو برات روشن کنه و بهت ایده بده .
- معرفی پورت
/// <summary>
/// Initializes the scale.
/// </summary>
private SerialPort InitializeSerialPort(string portName)
{
SerialPort serialPort = new System.IO.Ports.SerialPort();
serialPort.PortName = portName;
serialPort.BaudRate = 9600;
serialPort.DataBits = 8;
serialPort.Parity = System.IO.Ports.Parity.None;
serialPort.Handshake = System.IO.Ports.Handshake.None;
serialPort.RtsEnable = true;
serialPort.Encoding = Encoding.ASCII;
return serialPort;
}
- فرستادن اطلاعات
توی این مرحله مهمترین چیز پیغام یا دستوری است که باید بصورت هگزادسیمال به باسکول بفرستی . مثلا برای اینکه من به باسکول دستور بدم که وزن را برایم بفرست بایداز این پیغام استفاده میکردم: #DR#0#1
تو هم باید توی کاتولگهای باسکول بگردی و پیغام رو پیدا کنی یا با شرکت تولید کننده تماس بگیر و ازشون بخواه که برات بفرستن .
بهرحال بعد از بدست آوردن پیغامی که لازم داری باید اونو تبدیل به هگزادسیمال کنی و به پورت بفرستی. معمولا یک پیغام از سه قست تشکیل میشه که پشت سر هم به پورت میفرستی .
- بایت اول واسه شروع دستورو فراخوانی باسکول
- بایتهای بعدی بستگی به باسکول داره و دستور مورد نظر است .
- بایت آخر برای خاتمه دستور.
مثلا بایت اول 0x02 , بایت آخر 0x03
من این پیغام رو بعد از تبدیل به هگزادسیمال به پورت میفرستم :
/// <summary>
/// Sends the message to port.
/// </summary>
/// <param name="serialPort">The serial port.</param>
private void SendMessageToPort(SerialPort serialPort)
{
if (!serialPort.IsOpen)
{
serialPort.Open();
}
string message = string.Format("0{0}#DR#0#");
String unicodeString = message;
Encoding ascii = Encoding.ASCII;
Byte[] encodedBytes = ascii.GetBytes(unicodeString);
serialPort.Write(new byte[] { 0x02 }, 0, 1);
serialPort.Write(encodedBytes, 0, encodedBytes.Length);
serialPort.Write(new byte[] { 0x03 }, 0, 1);
}
انتظار برای جواب باسکول
متدی که من برای انتظار جواب نوشتم ضمیمه کردم . ولی میتونی راحت کد رو متوجه بشی
گرفتن اطلاعات و نمایش آنها
باسکول یک پیغام کد شده رو برات میفرسته که میتونی اونو تفسیر کنی و از متغیرهای اون استفاده کنی . مثلا باسکول من این جواب رو میداد :
11#DR#0#01#DR#0#0#81#2009-10-14#08:17# 623#
و من اینجوری اونو تفسیر میکردم:
string reg = @"([0-9]\d )(.{15})(?<PrinterID>.{1})(.{1})(?<SaveState>.{1})
(.{1})(?<ScaleState>.{2})(.{1})(?<Date>.{10})(.{1} )(?<WeighTime>.{5})(.{1})(?<WeighID>.{5})(.{1})
(?<Weight>.{7})(?<Unit>.{4})(?<WeighKind>.{4})";
parser = new Regex(reg, RegexOptions.IgnorePatternWhitespace);
Match match = parser.Match(received);
weight = decimal.Parse(match.Result("${Weight}"), CultureInfo.InvariantCulture);
string dateWeightStr = match.Result("${Date}").Trim();
date = Convert.ToDateTime(dateWeightStr);
unit = match.Result("${Unit}").Trim();
match.Result("${PrinterID}").Trim());
weighTime = match.Result("${WeighTime}").Trim();
weighID = Convert.ToInt32( match.Result("${WeighID}").Trim());
weighKind = match.Result("${WeighKind}").Trim().Equals("B") ? WeighKind.Gross : WeighKind.Net;
امیدوارم تونسته باشم کمی کمکت کرده باشم