Chế tạo Serial Monitor từ C# (C Sharp) - Một sản phẩm được truyền cảm hứng

Sau khi đọc bài viết C sharp (C#) - Một cách điều khiển ARDUINO bằng máy tính !!! của Đinh Hồng Thái mình thấy rất hay và muốn phát triển nó...Trong đầu mình chợt lóe lên những ý tưởng với C#. Mình tự đặt câu hỏi: Làm thế nào để tự tạo ra 1 Serial Monitor của chính mình!!! Qua một thời gian tìm hiểu, mình đã thành công!!!

I. Thiết kế giao diện chính và trang trí

Như những bài trước, các bạn sẽ thiết kế 1 giao diện cho app của mình như sau:

Ngoài ra các bạn kéo thêm timer1 vào, serialPort1, StatusTrip....ngoài ra có thể trang trí bằng lịch, hay hình ảnh cho nguy hiểm!!! timer1 các bạn thiết lập Properties như sau:

Sau đó, các bạn click chuột phải vào tên Project trong cột Solution Explorer bên phải màn hình >>> Chọn Add >> Win Form để tạo một Form2....Mình sẽ thiết lập trong app...Nếu ấn Tác giả thỳ sẽ hiện lên Form2...Form2 là logo bạn tự tạo...Cho Pro tí ấy mà!!!...

Trong Form2 này các bạn có thể kéo thả các logo của mình, thêm các label giới thiệu cho ngầu ...Đây là cách trang trí của mình..hehe:

Tiếp theo...các bạn tạo thêm một Form3....Khi chạy App...Form3 sẽ hiện ra...giao liện như kiểu: "Xin chờ 1 tí, chương trình đang Load..." cho nguy hiểm:

Ở Form3, bạn tùy chỉnh Properties cho Form3 như chèn hình ảnh vô, chọn BackGrondImage là Strench, FormBorderStyle chọn None giống như hình trên...và các bạn kéo thả 1 ProcessBar1, một timer..thiết lập timer1 Enable là true..và time là 32

II. Code

Sau khi xong phần thiết kế giao diện các bạn nạp code cho từng Form:

Form1:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
// Thêm 3 em này vào là OK, để sài SerialPort
using System.IO;
using System.IO.Ports;
using System.Xml;

using System.Threading;// khởi tạo hàm Threading

namespace nhandulieuCOM
{
    public partial class Form1 : Form
    {
        string InputData = String.Empty; // Khai báo string buff dùng cho hiển thị dữ liệu sau này.
        delegate void SetTextCallback(string text); // Khai bao delegate SetTextCallBack voi tham so string
        public Form1()
        {
        //cái Thread thực ra để chạy Form3 khi ms zô...cho ngầu
            Thread t = new Thread(new ThreadStart(SplashScreen));//tạo 1 Thread t là SplashScreen
            t.Start();// khi chương trình bật thỳ chạy t...tức là gọi SplashScreen
            Thread.Sleep(4500);//ngủ 4,5s  
            InitializeComponent();
            t.Abort();//sau đó đóng t
            // Khai báo hàm delegate bằng phương thức DataReceived của Object SerialPort;
            // Cái này khi có sự kiện nhận dữ liệu sẽ nhảy đến phương thức DataReceive
            // Nếu ko hiểu đoạn này bạn có thể tìm hiểu về Delegate, còn ko cứ COPY . Ko cần quan tâm
            serialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceive);
            string[] BaudRate = { "1200", "2400", "4800", "9600", "19200", "38400", "57600", "115200" };
            comboBox2.Items.AddRange(BaudRate);// Thiết lập cho comboBox2
        }
        private void SplashScreen()
        {
            Application.Run(new Form3());//chạy Form3
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            comboBox1.DataSource = SerialPort.GetPortNames();
            comboBox2.SelectedIndex = 3;
        }







        private void timer1_Tick(object sender, EventArgs e)
        {
            if (!serialPort1.IsOpen)
            {
                button2.Enabled = true;
                button1.Enabled = false;
                Thongbao.Text = ("Bạn chưa kết nối, hãy chọn một cổng COM để kết nối nhé!!! keke !! Arduino.vn");
                Thongbao.ForeColor = Color.Red;
            }
            else if (serialPort1.IsOpen)
            {
                button2.Enabled = false;
                button1.Enabled = true;
                Thongbao.Text = ("Đã kết nối nhé!!! keke");
                Thongbao.ForeColor = Color.Green;

            }
        }
        private void DataReceive(object obj, SerialDataReceivedEventArgs e)
        {
            InputData = serialPort1.ReadExisting();
            if (InputData != String.Empty)
            {
                // txtIn.Text = InputData; // Ko dùng đc như thế này vì khác threads .
                SetText(InputData); // Chính vì vậy phải sử dụng ủy quyền tại đây. Gọi delegate đã khai báo trước đó.
            }

        }
        // Hàm của em nó là ở đây. Đừng hỏi vì sao lại thế.
        private void SetText(string text)
        {
            if (this.textBox1.InvokeRequired)
            {
                SetTextCallback d = new SetTextCallback(SetText); // khởi tạo 1 delegate mới gọi đến SetText
                this.Invoke(d, new object[] { text });
            }
            else this.textBox1.Text += text;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (!serialPort1.IsOpen)
            {
                serialPort1.PortName = comboBox1.Text;
                serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text);
                serialPort1.Open();
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            serialPort1.Close();
        }

        private void button5_Click(object sender, EventArgs e)
        {
        // Hiện tí thông báo..cho ngầu
            if (serialPort1.IsOpen)// đã kết nối thì
            {
            //nếu chưa nhập
                if (textBox2.Text == "") MessageBox.Show("Nhập dữ liệu cần gửi vào nhé!!!", "Đỗ Hữu Toàn - Thông báo");
                else

                    serialPort1.Write(textBox2.Text);// ngược lại...gửi giá trị từ textBox tới cổng COM
            }
            // Nếu cổng COM chưa kết nối
            else MessageBox.Show("Kết nối cổng COM đi bạn", "Đỗ Hữu Toàn - Thông báo");
            textBox2.Clear();


            }

        private void button3_Click(object sender, EventArgs e)
        {
            textBox2.Clear();
            textBox1.Clear();
            //Ấn xóa clear hết textbox
        }

        private void button4_Click(object sender, EventArgs e)
        {
            DialogResult stt = MessageBox.Show("Bạn chắc chắn muốn thoát chương trình???", "Đỗ Hữu Toàn - Arduino.vn", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (stt == DialogResult.Yes ) MessageBox.Show("Cảm ơn bạn đã sử dụng chương trình, nhớ Rate Note ủng hộ mình nhé","Đỗ Hữu Toàn - Arduino.vn");
            Close();
        }

        

        private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            Form2 tacgia = new Form2();
            tacgia.ShowDialog();
            // chạy form2 khi ấn nút tác giả ( linklabel1)
        }

        
        
     }
}
    

Form 2

(chỉ là phần logo..k cóa code nhé)

Form 3

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace nhandulieuCOM
{
    public partial class Form3 : Form
    {
        public Form3()
        {
            InitializeComponent();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            //Khi timer làm tươi...tăng 1 đơn vị cho progessBar
            progressBar1.Increment(1);
            if(progressBar1.Value == 100)
            {
            // Nếu ProgessBar = 100..Tức là Max r đó
                timer1.Stop();// thì sop timer..ngừng làm tươi..ngừng tăng processBar
            }

        }
    }
}

III. Kết quả

Trên đây là cách chế tạo Serial Monitor của mình...Các bạn xem và góp ý nhé!!! Chúc các bạn thành công!!!

Các bạn có thể tải về bản solution của mình tại đây nhé.

 

Những hình ảnh về dự án: 
Bài viết truyền cảm hứng: 
lên
26 thành viên đã đánh giá bài viết này hữu ích.
Các dự án được truyền cảm hứng

Bộ điều khiển PID - ứng dụng phần 2 - xe dò line dùng thuật toán PID

Tiép nối bài viết về xe dò line cảm ơn Đỗ Hữu Toàn đã viết hộ mình phần 4. hôm nay mình sẽ làm cho chiếc xe dò line đi mượt và có hồn hơn 

lên
34 thành viên đã đánh giá bài viết này hữu ích.
Các bài viết cùng tác giả

HỆ ĐIỀU HÀNH MEDIA CENTER CHO Raspberry Pi - Đánh giá cá nhân của mình về Openelec (Open Embedded Linux Entertainment Center ) và OSMC ( Open-Source Media Center ).

Bài viết này, mình sẽ so sánh 2 hệ điều hành MediaCentrer cho Raspberry Pi là  Openelec (Open Embedded Linux Entertainment Center ) và OSMC ( Open-Source Media Center ).

lên
17 thành viên đã đánh giá bài viết này hữu ích.

Kết nối tay game PlayStation với Arduino

Bài viết trước mình đã giới thiệu với các bạn về Joystick, đó chính là phím di chuyển trên tay PlayStation. Nhưng các bạn hãy quan sát trong các kỳ thi robocon, hầu hết các thí sinh đều dùng tay PlayStation để điều khiển robot. Vậy làm sao để sử dụng tay PlayStation ??

lên
22 thành viên đã đánh giá bài viết này hữu ích.