Thông báo

Collapse
No announcement yet.

Vào Ra Dữ Liệu Với Serial Port Trong C# .Net Framework

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Vào Ra Dữ Liệu Với Serial Port Trong C# .Net Framework

    Thấy anh em tranh luận về vào ra serial với vb, vc, vv..v. Mình thấy máu quá thử làm bằng C# với .Net FrameWork 2.0 xem sao, may là chạy tốt, tiện post lên anh em tham khảo.

    Tôi thực hiện việc chuyển Text và Chuyển mã Hexa ra Serial Port

    Sau đây là chương trình của tôi

    Code:
    using System.IO.Ports;
    using System.IO;
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    
    private SerialPort comport = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
    
    public Form1()
            {
                InitializeComponent();
            }
    
            private void btnKetThuc_Click(object sender, EventArgs e)
            {
                Close();
            }
    private void btnTestPort_Click(object sender, EventArgs e)
            {
                try
                {
                    comport.Open(); 
                    this.comport.DtrEnable = true;
                    this.comport.RtsEnable = true;
                    
                }
                catch 
                {
                    txtThongBao.Enabled = true;
                    txtThongBao.Text = "Có sự cố khi mở cổng Com, hãy kiểm tra lại hệ thống, Chương trình chưa thực hiện được!";
                }
                if (comport.IsOpen)
                {
                    btnTestPort.Enabled = false;
                    btnHexTx.Enabled = true;
                    
                    btnClosePort.Enabled = true;
    
                    txtRx.Enabled = true;
                    txtHexTx.Enabled = true;
                    txtTx.Enabled = true;
                    txtThongBao.Enabled = true;
                    txtThongBao.Text = "Cổng Com 1 đã được mở rồi, bắt đầu chiến đấu đi";
                    
                }
                else this.Focus();
    
            }
    
    
            private void dulieuden(object sender, SerialDataReceivedEventArgs e)
            {
                txtRx.Enabled = true; // Hiển thị TextBox nếu Dữ liệu đến
                btnRx.Enabled = true; // Hiển thị button Ẩn nếu Dữ liệu đến
                comport.DataReceived += new SerialDataReceivedEventHandler(dulieuden);
    
            }
    
      // Đọc toàn bộ dữ liệu lưu tại buffer, triệu tập dữ liệu lưu trong hàm dulieuden
            private void btnRx_Click(object sender, EventArgs e)
            {
                string docdulieu = comport.ReadExisting().ToString();
                this.txtRx.Text = docdulieu;
                txtThongBao.Text = "Dữ liệu nhận được ứng với mã Hexa là: " + AtoX(docdulieu);
            }
    
     private void btnClosePort_Click(object sender, EventArgs e)
            {
                comport.Close();
                txtThongBao.Text = "Cổng Com đã được đóng";
    
                btnTestPort.Enabled = true;
                btnHexTx.Enabled = false;
                
    
                txtTx.Enabled = false;
                txtHexTx.Enabled = false;
                txtThongBao.Enabled = false;
    
                btnClosePort.Enabled = false;
            }
    Việc truyền nhận mã hexa ta quy ước vào một hàm, hàm này với chức năng chuyển đổi sang mã định dạng Hexa để truyền qua Serial Port

    // Chuyển đổi Chuỗi ASCII sang Định Dạng Hexa.

    Code:
    private string AtoX(string asc)
            {
                int nLines;
                int nChars;
                int offset;
                string hex = " ";
    
                // tính toán số lượng dòng Hexa. 
                if ((asc.Length % 16) > 0)
                    nLines = asc.Length / 16 + 1;
                else
                    nLines = asc.Length / 16;
    
                // Chuyển đổi sang những dòng Hexa.
                for (int i = 0; i < nLines; i++)
                {
                    offset = i * 16;
                    if ((asc.Length - offset) > 16)
                        nChars = 16;
                    else
                        nChars = asc.Length - offset;
                    hex += this.HexLine(i, asc.Substring(offset, nChars)) + "\r\n";
                }
                return hex;
            }
    
            /// <summary>
            /// Chuyển một chuỗi ASCII 16 byte sang  định dạng hexa.
            /// </summary>
            private string HexLine(int lNum, string asc)
            {
                string hex = "";
    
                // Copy dòng vào bộ đệm.
                char[] c = new char[16];
                asc.CopyTo(0, c, 0, asc.Length);
    
                // Tạo  offset.
                hex += String.Format("{0:X8} - {0:X8}", lNum * 16, (lNum + 1) * 16 - 1);
                hex += " ";
    
                // Chuyển các ký tự sang định dạng chuẩn hexa.
                for (int i = 0; i < asc.Length; i++)
                {
                    if ((i != 0) && ((i % 4) == 0))
                        hex += " ";
                    hex += String.Format("{0:X2}", (int)c[i]);
                }
    
                // Đệm thêm.
                int nSpaces = 62 - hex.Length;
                for (int i = 0; i < nSpaces; i++)
                    hex += " ";
    
                //Chuyển ASCII tới cuối dòng.                                                                                                  
                for (int i = 0; i < asc.Length; i++)
                {
                    if (((int)c[i] < 32) || ((int)c[i] > 126))
                        hex += ".";
                    else
                        hex += c[i].ToString();
                }
    
                // Trả lại dòng hexa .
                return hex;
            }
    
     private void btnHexTx_Click_1(object sender, EventArgs e)
            {
                try
                {
                    byte[] data = HexStringToByteAray(txtHexTx.Text);
                    comport.Write(data, 0, data.Length); //Đưa mảng số Hexa qua cổng com với định dạng chuẩn
                    string a = this.txtTx.Text;
                    comport.Write(AtoX(a));
                    txtThongBao.Text = "Thông tin được gửi ra cổng RS232 với mã Hex là: " + txtHexTx.Text.ToUpper() + "\r\n \r\n" + "Thông tin được gửi ra cổng RS232 chuyển sang mã Hex Tập tin Text là: \r\n \r\n" + AtoX(a).ToString();
                   
                   
                }
    
                catch (FormatException)
                {
                    txtThongBao.Text = "Có thể cổng com đóng hoặc bạn nhập chính xác Mã Hexa cần Truyền Nhận. Không nhận được định dạng chuỗi sau:  " + txtHexTx.Text.ToUpper();
                }
                return;
            }

    Thật là đơn giản với C# Progarmming!

    Xin chân thành cảm ơn anh em đọc bài viết!

  • #2
    gui vietheart

    lam on post may cai panel cua project nay len nhe!
    mail: [/email] :->

    Comment


    • #3
      đây chỉ là ví dụ, mình thấy anh em quan tâm đên vào ra dữ liệu qua Serial quá, nên mình nghiên cứu với .Net FrameWork. Và thấy nó cũng đơn giản nên mình post lên để anh em ai cần thì làm, vì .Net Framework tối giản hóa việc lập trình để người lập trình có thời gian để sử lý những công việc khác rắc rối hơn! Có rì về C# thì có thể liên lạc mình sẽ Post lên anh em ta cùng tranh luận nha!

      Cám ơn bạn quan tâm!

      Comment


      • #4
        Tạo một project trong C# đơn giản nhất là sử dụng WindowForm, IDE sẽ tự động tạo code, do đó việc lập trình giao diện trở nên rất trực quan...vietheart có thể post toàn bộ project ở trên dưới dạng file Zip để anh em down về chạy test thử, đồng thời làm mẫu cho những người mới lập trình.
        Mọi thứ muốn giỏi cần phải bắt đầu từ cái đơn giản!
        mail: [/email] :->

        Comment


        • #5
          Nguyên văn bởi acbossvn
          Tạo một project trong C# đơn giản nhất là sử dụng WindowForm, IDE sẽ tự động tạo code, do đó việc lập trình giao diện trở nên rất trực quan...vietheart có thể post toàn bộ project ở trên dưới dạng file Zip để anh em down về chạy test thử, đồng thời làm mẫu cho những người mới lập trình.
          Mọi thứ muốn giỏi cần phải bắt đầu từ cái đơn giản!
          Thấy anh em quan tâm, tôi ngồi xây dựng một Class riêng để anh em có thể nhúng trực tiếp vào chương trình khi thiết kế ứng dụng phần mềm!

          Code:
          using System;
          using System.Collections.Generic;
          using System.ComponentModel;
          using System.Data;
          using System.Drawing;
          using System.Text;
          using System.Windows.Forms;
          using System.Data.SqlClient;
          using System.IO.Ports;
          using System.Threading;
          
          class ComPorts
          {
              public Boolean OpenComPortOk;
              public ComPorts()
              { 
              
              }
              ~ComPorts()
              { 
              
              }
              /// <summary>
              /// Mo cong COM1
              /// </summary>
              /// <returns></returns>
              public SerialPort Open(String Port, int Baud, Parity Prt, int DtB,  StopBits StB)
              {
                  //SerialPort ComPort = new SerialPort("COM1", 9600, Parity.None , 8, StopBits.One);
                  SerialPort ComPort = new SerialPort( Port,Baud, Prt, DtB, StB);
                  try
                  {
                      if (!ComPort.IsOpen)
                      {
                          ComPort.Open();
                          this.OpenComPortOk = true;
                      }
                  }
                  catch (Exception e)
                  {
                      MessageBox.Show("Lỗi mở cổng:"+e.ToString());
                 
                      this.OpenComPortOk = false;
                      return ComPort;
                  }
                  ComPort.RtsEnable = true;
                  ComPort.DtrEnable = true;
          
                  return ComPort;
              }
              public void Close()
              {
                  
              }
              /// <summary>
              /// Send(SerialPort ComPort, String data) se
              /// Gui chuoi data ra cong ComPort
              /// </summary>
              /// <param name="ComPort"></param>
              /// <param name="data"></param>
              public void Send(SerialPort ComPort, String data)
              {
                  ComPort.Write(data);
                  
              }
              public String Receive(SerialPort ComPort)
              {
                  String ReceiveData = "";
                  ReceiveData = ComPort.ReadExisting();
                  return ReceiveData;
                  
                
              }
              public byte ReceiveByte(SerialPort ComPort)
              {
                  byte Value;
                  Value = Convert.ToByte(ComPort.ReadByte());
                  return Value;
              }
              
          }
          Attached Files

          Comment


          • #6
            Khi bạn sử dụng Serial Port, bạn nhúng Class vào chương trình và khai báo trong cửa sổ code của bạn

            using System.IO.Ports;
            using System.Threading;

            Việc gọi Class bạn chỉ cần làm như sau:

            Nhấn CRT + Space và bạn chọn ComPorts

            Việc sử dụng chính là bạn khai thác ngay trực tiếp các Method mình đã xây dựng trong Class đó! Truyền tham số vào như ý muốn của bạn!

            Chúc bạn thành công!

            Comment


            • #7
              Tiện đây cũng muốn nói chút xíu về ứng dụng. Mình thấy có anh em quan tâm đến việc Điều Khiển Máy Tính từ xa! Anh em rất vất vả khi đi thiết kế phần cứng. Quan điểm của mình, thì lại thấy việc này rất đơn giản.

              Thiết kế một Modune Thu Phát Hồng Ngoại với việc sủ dụng MCP2155 hoặc MCP2150 để thiết kế!

              Sau đó, lên một thiết kế về khung truyền những tương tác với máy tính chúng ta cần điều khiển, gán các chỉ thị và các tập lệnh thành một Khung Truyền riêng! Việc này cần tối ưu vì đó là việc chúng ta đi xây dựng một Class trong chương trình của chúng ta!

              Ứng dụng vào ra với Serial Port, viết phần mềm tương tác với các chức năng quản lý hệ thống máy tính. Việc này các Componet của .Net FrameWork 2.0 rất mạnh. Chúng ta chỉ cần Add các Referrence vào modune của chương trình là có thể thao tác một cách dễ dàng!

              Thêm một nhân tố rất hữu ích nữa là việc ta điều khiển máy tính của ta qua Internet! Mình ngồi ở Văn Phòng cũng có thể điều khiển được máy tính của ta! Ta lập trình Socket C# với .Net. Có thời gian mình sẽ Post ứng dụng của mình lên để anh em cùng tham khảo về kỹ thuật lập trình Mạng với C#.

              Xin cảm ơn!

              Comment


              • #8
                Class riêng của Vietheart khá hay và tiện lợi.Cho mình hỏi thêm: để nhúng một lớp vào project thì cách làm đơn giản nhất là gì?Hình như VS2005 có chức năng kéo thả?Có cần khai báo thêm gì ko??
                mail: [/email] :->

                Comment


                • #9
                  Khi bạn đã tạo ra một Class rồi, việc bạn sử dụng là việc bạn chỉ cần khai báo cái class đó ra và truyền tham số điều khiển tích hợp với Class bạn xây dựng

                  Code như sau

                  Ví dụ: Tôi tạo Class với tên là Comport

                  Khi tôi gọi ra:

                  Nhấn CRT + Space và chọn Class Comport serial = New Comport();

                  Vậy là các thuộc tính trong lớp comport đã được khai báo hoàn tất!

                  Comment


                  • #10
                    Đêm buồn, gió hiu hiu lạnh. Xa nhà, xa bạn, xa người yêu. Lòng hắt hiu buồn ngồi viết vài dòng Code tặng "acbossvn" và anh em gần xa tham khảo.

                    VietHeart cũng thấy có nhiều anh em quan tâm đến C#! Thực tế mà nói, anh em quá quen với các ngôn ngữ như VB hoặc VC, không quan tâm đến những điểm mạnh của .Net. Tôi xin được giới thiệu về kết nối với Cơ Sở dữ liệu!

                    Xin được xây dựng một Class riêng để anh em tiện nhúng ngay trực tiếp vào chương trình

                    Code:
                    using System;
                    using System.Collections.Generic;
                    using System.ComponentModel;
                    using System.Data;
                    using System.Drawing;
                    using System.Text;
                    using System.Windows.Forms;
                    using System.Data.SqlClient;
                    class CmdSql
                    {
                        public Boolean OpenIsOk;//true neu mo duoc csdl
                        //Ham tao
                        public CmdSql()
                        {
                            this.OpenIsOk = false;
                        }
                        //Ham huy
                        ~CmdSql()
                        {
                        }
                        public Boolean ReturnOpenIsOkie()
                        {
                            return this.OpenIsOk;
                        }
                        /// <summary>
                        /// SqlConnection Connect()
                        /// Ham thuc hien ket noi va tra ve mot
                        /// doi tuong SqlConnection
                        /// </summary>
                        /// <returns></returns>
                        public SqlConnection Connect()
                        {
                            SqlConnection Conn = new SqlConnection();
                            String StrConn = "Data Source=DHBKHN-ODLZ7S8S;Initial Catalog=DataBase;User Id=sa;Password=Pass";
                            Conn = new SqlConnection(StrConn);
                            try
                            {
                                Conn.Open();
                            }
                            catch (Exception e)
                            {
                                this.OpenIsOk = false;
                                MessageBox.Show("Lỗi mở cơ sở dữ liệu!");
                                this.OpenIsOk = false;
                                return Conn;
                            }
                            this.OpenIsOk = true;
                            return Conn;
                        }
                        //Dinh nghia ham dong ket noi
                        public void Close()
                        {
                            //this.Close();
                        }
                        /// <summary>
                        /// Thuc thi cau lenh Sql bat ky: Add, Update, Delete
                        /// </summary>
                        /// <param name="Conn"></param>
                        /// <param name="Sql"></param>
                        public void ExecuteNoneQuery(SqlConnection Conn, String Sql)
                        {
                            SqlCommand cmd;
                            if (this.OpenIsOk == true)
                            {
                                cmd = new SqlCommand(Sql, Conn);
                            }
                            else
                            {
                                MessageBox.Show("Không tạo được kết nối với cơ sở dữ liệu!");
                                return;
                            }
                            cmd.ExecuteNonQuery();
                        }
                        /// <summary>
                        /// Ham thuc thi cau lenh Select va tra ve mot doi tuong SqlDataReader
                        /// </summary>
                        /// <param name="Conn"></param>
                        /// <param name="Sql"></param>
                        /// <returns></returns>
                        public SqlDataReader ExecuteReader(SqlConnection Conn, String Sql)
                        {
                            SqlCommand cmd;
                            SqlDataReader dr;
                            cmd = new SqlCommand(Sql, Conn);
                            return dr = cmd.ExecuteReader();
                        }
                        
                    }
                    Chúc anh em thành công, vui vẻ!
                    Last edited by vietheart; 14-10-2006, 03:01.

                    Comment


                    • #11
                      Có hệ cơ sở dữ liệu nào chức năng vừa đủ có thể embedded kèm theo chương trình mà không cần cài đặt phức tạp kô nhỉ. Ví dụ như một file access?
                      Vẫn biết mỗi lần xa là một lần về lại...

                      Comment


                      • #12
                        Về hệ cơ sở dữ liệu để cài đặt ứng dụng với Embedded thì tôi chưa có nghe qua! Nhưng việc tổ chức cơ sở dữ liệu cho hệ thống Embedded thì tôi đã và đang triển khai thực hiện!

                        Microsoft hỗ trợ .Net Framework với XML data base dung lượng up tới 10M dữ liệu quản lý, nhưng mình chưa thấy đề cập tới vấn đề về Embedded.

                        Thực ra, nếu có được hệ cơ sở dữ liệu như vậy, thì sự khả thi về mặt thời gian và tốc độ xử lý cùng với việc chiếm tài nguyên là rất lớn, vậy lên theo quan điểm của tôi là không khả thi cho lắm.

                        Về việc tổ chức Cơ Sở Dữ Liệu cho EmBedded hiện mình vẫn chỉ thực hiện theo File. Vào ra File với các thuật toán tối ưu nhất để tăng tốc vào ra dữ liệu và ít chiếm tài nguyên bộ nhớ khi xử lý chương trình! Một số hãng ví dụ như Maxim Dallas có hệ điều hành cho Embedded cho phép bạn có thể thực hiện các phần mềm nhúng hỗ trợ ngôn ngữ bậc cao như C hoặc Java. Việc vào ra với File tổ chức dữ liệu với tôi như vậy đã thực sự là một điều quả là thiên thần với các nhà phát triển ứng dụng!

                        QMK nếu có vấn đề rì về tổ chức dữ liệu có thể Post lên anh em tham khảo, kể cả phân tích Khung Truyền cho các hệ thống lớn với lưu lượng vào ra truy xuất với Cơ Sở Dữ Liệu lớn, mình có thể học hỏi và cùng trao đổi trên đây!

                        Xin chân thành cảm ơn!

                        Comment


                        • #13
                          cái này hay quá, đúng vấn đề em đang quan tâm.
                          Thanks!

                          Comment


                          • #14
                            Anh có thể giới thiệu sơ qua về C# và .NET và ứng dụng của nó trong kỹ thuật k, nghe anh nói thấy cũng hấp dẫn quá nhưng cũng chưa hình dung ra được

                            Comment


                            • #15
                              Nguyên văn bởi vietheart Xem bài viết
                              Thực ra, nếu có được hệ cơ sở dữ liệu như vậy, thì sự khả thi về mặt thời gian và tốc độ xử lý cùng với việc chiếm tài nguyên là rất lớn, vậy lên theo quan điểm của tôi là không khả thi cho lắm.

                              Xin chân thành cảm ơn!


                              Windows Mobile có SQL Server chạy được trên đó, cớ gì lại không khả thi????
                              .NETCompactFramework sức mạnh của nó là các ứng dụng DB, vậy sao không khả thi được.

                              Comment

                              Về tác giả

                              Collapse

                              vietheart Tìm hiểu thêm về vietheart

                              Bài viết mới nhất

                              Collapse

                              Đang tải...
                              X