.NET Logo
Welcome Guest Search | Active Topics | Members | Log In | Register

ช่วยเครื่องการรับน้ำหนักจากเครื่องชั่งทีครับ Options · View
itzone
Posted: Wednesday, February 27, 2008 6:26:15 AM
Rank: มือฝึกหัด
Groups: Member

Joined: 2/27/2008
Posts: 2

 

 

 

คือผมต้องเขียนโปรแกรมในการรับน้ำหนักจากเครื่องชั่ง ผ่าน RS232 ไม่รู้ว่าผมจะทำยังไงดีครับ เลยไปโหลดโค้ดคนอื่นเขามาดัดแปลงแล้วได้ดังนี้ครับ

 

public partial class Form1 : Form {    private SerialPort port = new SerialPort();    public Form1() {new SerialDataReceivedEventHandler(port_DataReceived);    private void button1_Click(object sender, EventArgs e) {        if (port.IsOpen) port.Close();Parity.None;StopBits.One;"COM4";    private void port_DataReceived(object sender,SerialDataReceivedEventArgs e) {        // Event for receiving data

 

        // Read the buffer to text box.

        Log(port.ReadExisting());

    }
 

 

        richTextBox1.Invoke(

        richTextBox1.AppendText(msg);

        richTextBox1.ScrollToCaret();

    }));

    }

}
    private void Log(string msg) {new EventHandler(delegate {

 

 

        InitializeComponent();

        port.DataReceived +=

    }
 

 

 

        port.BaudRate = 2400;

        port.DataBits = 8;

        port.Parity =

        port.StopBits =

        port.PortName =

        port.Open();

    }
 

 

 

 

 

ซึ่งมันได้มายังไงผมก็ยังไม่เข้าใจครับ (ช่วยอธิบายหน่อยนะครับ) ซึ่งปัญหาของผมคือ ผมอยากให้มันค่ามันเข้ามาแสดงแบบค่าเดียว เช่น 6240 แบบว่าไม่ต้องแสดงต่อกันยาวลงมาแบบนี้ครับ คือถ้าค่ามันเป็นค่าอื่นเช่น 6200,6190 ก็ให้มันแสดงที่ TextBox เปลี่ยนไปเปลี่ยนมาโดยไม่ให้มันเรียงกันยาวแบบนี้ครับ และถ้าผมอยากจะเช็คว่าค่าที่ได้รับ (น้ำหนักที่ได้รับ) มีตัวอักษร m เข้ามาหรือไม่ผมจะเช็คได้อย่างไรครับ (ผมลองตัดคำแล้วมันไม่ได้ครับ) เพราะตัว m จะเป็นตัวบอกว่าน้ำหนักยังไม่นิ่ง เนื่องจากโปรแกรมสำหรับชั่งน้ำหนัก ต้องรอให้น้ำหนักนิ่งก่อน (คือไม่มีการเปลี่ยนแปลงในเวลา 3 วินาทีขึ้นไป) ถึงจะผ่านการตรวจครับ



ผมจะเขียนโปรแกรมรับข้อมูลน้ำหนักจากเครื่องชั่งได้ยังไงครับ (ด่านล่างคือ Format ของเครื่องชั่งที่ส่งค่าเข้ามาครับ ยี่ห้อ Cardinal) C# ครับ
<cr><s><xxxxxx><d><c><uu><m>ETX



 

cr         =          Carriage Return            (hex 0D)

s           =          Sign                              “-“ = negative, “ “(blank) = positive

xxxxxx.xxx =    Weight                         (with leading zeros)

d          =          Decimal point               Embedded into weight (after weight dpp=0)

c          =          status                            m = motion

                                                            o = overcap

                                                            e = weight not currently being displayed

uu         =          Units                            tn, lb, l/o, oz, t, kg, g

m         =          Mode                           G = Gross, N = Net

ETX     =          End of TeXt                 (hex 03) MUST terminate ALL serial commands

 

    private void Log(string msg) {new EventHandler(delegate
 

 

{

 


itzone attached the following image(s):
reciveData.JPG
Hyper.JPG

paedotnet
Posted: Wednesday, February 27, 2008 6:27:02 PM

Rank: มือเทพ
Groups: Member

Joined: 12/6/2007
Posts: 354
Location: bkk

ดูจากโค้ดแล้ว ถ้าใช้เมธอด ReadExisting() จะหมายความว่าให้อ่านค่าที่รับเข้ามาทั้งหมดจาก port ในครั้งนั้นๆซึ่งในแต่ละครั้งมี่ port ส่งค่ามาที่โปรแกรมก็จะแสดงค่าที่รับเข้ามาทั้งหมดทุกครั้ง

ดังนั้นถ้าไม่ต้องการให้รับค่าเข้ามาทังหมดผมว่าน่าจะใช้ ReadLine() แต่เมธอดนี้ก็มีปัญหาเนื่องจากว่าจะมีการส่งค่าอักขระ \n ทุกครั้งที่มีการรับค่าเข้ามาหมายความว่าถ้ารับค่ามาครั้งนึ่งเช่น 6200 จะต้องสั่งใช้ทาง hardware มัน reset ค่าที่ส่งไปก่อนจึ่งจะส่งค่าต่อไป ( 6109 ) เข้ามาได้ซึ่งผมไม่แนะนำวิธีนีนะครับเพราะผมเคยลองเข้ามันมีปัญหาตามมา ผมอยากแนะนำให้รับค่าเข้ามาเป็น byte มากกว่าเนื่องจากว่า จะได้ดักจับค่า ที่ส่งมาจาก port ได้ดังนี้   int bytes = comport.BytesToRead; พอเราได้ค่า  bytes นี้มาแล้วเราก้นำค่านี้เก็บไว้ในหน่วยความจะ buffer ดังนี้

byte[] buffer = new byte[bytes];

comport.Read(buffer, 0, bytes);

หลังจากนั้นก็ใช้คำสั่ง while เพื่อวนลูปหาตำแหน่งค่าที่รับเข้ามาว่าจะให้แสดงข้อมูลถึงค่าใหนแล้วพอแสดงถึงค่านั้นก็ให้หยุดแล้วนำค่านั้นเก็บใน textbox แล้วก็วนลูปเพื่อหาค่าต่อไป (ยังอยู่ใน ลูป while ) แต่ผมไม่รู้ว่าคุณ itzone รู้ค่าในหน่วย byte ที่รับค่ามาจาก serial port หรือเปล่าเพราะวิธีนีจะต้องรู้ค่าใส่ส่วนของ start frame  และ stop frame ที่ส่งมาจาก serialport ถ้ารู้ค่าแล้วถึงใช้วิธีที่ผมบอกได้เนื่องจากว่าจะเป็นการ check ค่า start frame ,stop frame พอโปรแกรมเจอค่านี้ก็จะนำค่าระหว่างกลางนี้( ระหว่าง start frame ,stop frame ไปแสดงผล แล้วพอวนลูปมาเจอค่าต่อไป ซึ่งจะขึ้นต้นด้วย start frame ก็ให้เขียนโปรแกรมกำหนดเพื่อให้นำค่านี้ไปแสดงผลใน textbox ใหม่ตัวอย่างเช่นค่าที่รับเข้ามาจาก serialport ควรจะมี start frame เป็น 02 และ stop frame เป็น 03 ดังนี้

สมมติค่าที่รับเข้ามาเป็นเลขฐาน 10 ดังนี้6200  และค่าต่อไป คือ 6109

ดังนั้นถ้าแปลงข้อมูลเป็น byte จะได้

02 06 00 02 00 00 03    02 06 01 00 09 03โดย ในลูป while จะเป็น ก็จะเป็นการวนลูปค่าเหล่านี้แล้วในลูป while นี้ก็กำหนดเงื่อนไขขึ้นมาว่า ถ้าเจอ 02 ก็ให้นำข้อมูลที่อยู่ระหว่าง 02 และก่อน 03 ไปแสดงใน textbox พอเจอ 02 ใหม่ ( ข้อมูลถัดไป) ก็ให้ดึงข้อมูลที่อยู่ระหว่าง 02 และ 03 ไปแสดงใน textbox ทำขั้นตอนนี้ไปเรื่อยๆ ให้ครบข้อมูลที่รับเข้ามา

ส่วนตัวอักษรตัว m วิธี  check ก็ให้ตรวจสอบก่อนว่าค่าเป็นเมื่อแปลงเป็น byte แล้วได้ค่าอะไร ที่คุณ itzone บอกว่า ตัดคำไม่ได้เนืองจากว่า ได้ใช้เมธอด ReadExisting() จะเป็นการรับค่าเข้ามาทั้งหมดที่ port ส่งมา ยังไงก็ตัดคำไม่ได้เพราะตำแหน่ง ในหน่วย ความจำ address ของแต่ละตัวอักษรจะไม่เหมือนกัน วิธีแก้ก็คือหาว่า m ในหน่วย byte คือเลขอะไร พอรู้แล้วว่าคือเลขอะไร ตัวอย่าง สมมติว่าเป็นเลข 109 เราก็ใช้ if ตรวจสอบเงื่อนไขว่าจะเจอ เลข 109 ก็ให้นำค่าที่ส่งมานี้ไปใช้งานต่อไป



[With great power comes great responsibility]
itzone
Posted: Thursday, February 28, 2008 8:39:50 AM
Rank: มือฝึกหัด
Groups: Member

Joined: 2/27/2008
Posts: 2
จะลองทำตามดูนะครับ ถ้าไม่ได้ยังไง ก็คงต้องรบกวนถามอีกนะครับ ถ้าได้จะแจ้งคำตอบ พร้อมนำโค้ดมาเปิดเผยให้ด้วยครับ เผื่อคนอื่นอยากรู้จะได้เป็นประโยชน์ร่วมกัน
Users browsing this topic
Guest


Forum Jump
You cannot post new topics in this forum.
You cannot reply to topics in this forum.
You cannot delete your posts in this forum.
You cannot edit your posts in this forum.
You cannot create polls in this forum.
You cannot vote in polls in this forum.

Main Forum RSS : RSS

YAFVision Theme Created by Jaben Cargman (Tiny Gecko)
Powered by Yet Another Forum.net version 1.9.1.8 (NET v2.0) - 3/29/2008
Copyright © 2003-2008 Yet Another Forum.net. All rights reserved.


Sponsored by