วันเสาร์ที่ 28 ธันวาคม พ.ศ. 2556

การเขียน ภาษา c# เพื่ออ่านค่าที่ส่งมาจาก serial port บนคอมพิวเตอร์เรา

บทความนี้ผมก็หาวิธีการเขียนโปรแกรมรับค่ามาจาก board microcontroller ของ Arduino รุ่น UNO อยู่หลายวัน เพราะไม่เคยเขียนภาษา c# มาก่อน (ถามว่าไม่ถนัด c# แล้วเขียนทำไม ตอบได้เลยว่า อยากเขียนมีไรปะ อิอิอิอิ) จริงๆแล้วไม่จำเป็นต้องเป็นบอร์ดของ Aduino ก็ได้ เพราะในที่นี้เราจะรับค่าที่ส่งเข้า Serial port ของคอมพิวเตอร์แล้วมาแสดงผล บนหน้าจอเท่านั้นเอง ก็เริ่มจาก เปิดโปรแกรม Microsoft Visual Basic 2013 ขึ้นมา โดยไปที่ File >> New Project เพื่อสร้าง Project ใหม่ขึ้นมา


แล้วก็เลือกที่ Visual c# >> Window Form Application แล้วก็ทำการเปลี่ยนชื่อ project เราได้ตามสบาย เลยครับ แล้วกด ok ไปซะ 


เมื่อเสร็จจากข้างบนแล้วเราจะได้หน้า Form เปล่าๆ มา 1 หน้า


แล้วก็แต่งหน้า Form ได้ตามสบาย โดยของผมจะมีดังนี้นะครับ TextBox , Button , ComboBox  ดังรูป
โดย TextBox เอาไว้แสดงค่าที่ส่งเข้ามา button เอาไว้กดเริ่มการทำงาน ComboBox เอาไว้ ค้นหา Port 


ทำการ Double Click ที่ตัวฟอร์มแล้วจะปรากฎหน้า Code (คลิกให้หมด ทั้งปุ่มทั้ง อะไรที่อยู่ในหน้า form) จะได้ Code มา 

เมื่อเสร็จแล้วก็ ให้ไปที่ Toolbox แล้วหาคำว่า Serial Port แล้วลากลงมาไว้ใน Form ของเรา

เมื่อลากได้สำเร็จจะเจอ คำว่า Serial Port อยู่ข้าล่าง Form เรา แล้วมันจะตามด้วยเลขอะไรก็ช่างหัวมันนะครับไม่ต้องไปสนใจเพราะมันเป็นชื่อ 

ต่อไป คลิกที่คำว่า serial port ที่อยู่ข้างล่างทีนึง แล้วไปที่ Properties คลิกที่ Event(ที่เป็นรูปสายฟ้า) >>DataRecived แล้ว Double Click มันออกมา จะได้โคดออกมาโดยอัตโนมือ 



แล้วก็เขียน Code ดังนี้ อันใหนไม่มีก็เพิ่มเอานะครับ แล้วก็ลอง Run ดู
Code Programe

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            CheckForIllegalCrossThreadCalls = false;//เช็ค thread call
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //รับข้อมูล port name ใส่ Combo Box
           String [] stportname = SerialPort.GetPortNames();
            foreach(String n in stportname){
                comboBox1.Items.Add(n);
            }
            comboBox1.SelectedIndex = 0;
        }
        int i = 0;
        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            //ทำงานเมื่อมีข้อมูลเข้ามาจาก port
            textBox1.AppendText(serialPort1.ReadLine());//อ่านข้อมูลออกมาแล้วใส่ Text Box
            textBox1.AppendText("\n");//เลื่อนบรรทัดใหม่
            Console.WriteLine(i++);
        }

        private void button1_Click(object sender, EventArgs e)
        {   //จะเลือก port และเปิด port
            serialPort1.PortName=comboBox1.SelectedItem+"";
            serialPort1.Open();
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void label1_Click(object sender, EventArgs e)
        {

        }
    }
}

เสริมนะครับ 
Code โปรแกรมทางฝั่ง บอร์ด Arduino ที่ผมลอง test ส่งค่าเข้ามา ก็หน้าตาประมาณนี้นะครับ


ของผมเมื่อจัดแต่งหน้าแล้ว Run ก็จะได้ประมาณนี้ครับ


ก็การเขียน c# เพื่ออ่านค่า ขั้นเริ่มต้น ก็มีเพียงเท่านี้ครับ ใครจะเอาประยุกต์รับค่าออกมาแล้วคำนวน อะไรก็ตามสบายเลยครับ

Copy Code ไปแปะเลยมันไม่ดีนะครับเพราะจะทำให้ไม่ข้าใจ พยายามเขียนด้วยตัวเองจะดีที่สุดครับ
เพิ่มเติมนะครับ

*********** ในกรณีที่ set ความเร็วในการส่งข้อมูลไม่ตรงกัน มันจะไม่ได้ข้อมูลที่เราต้องการนะครับ ในฝั่ง โปรแกรมฝังตัว ถ้าเรา set ตรง serial.begin(9600); เป็น 9600 มันจะเป็นค่า default ของตัวโปรแกรมฝั่งที่เราจะอ่านครับ แต่ถ้า set เป็นความเร็วอื่นเช่น serial.begin(115200); เราจะต้องแทรก  serialPort1.BaudRate = ความเร็วในการส่ง; เช่น serialPort1.BaudRate = 115200; นะครับโดยต้อง ใส่ก่อนบรรทัดที่จะเปิด port เช่น        serialPort1.BaudRate = 115200;       serialPort1.Open();






ไม่มีความคิดเห็น:

แสดงความคิดเห็น