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

  • #31
    e viết chương trình xong rồi nhưng chưa biết cách đóng gói để cài qua máy khác,các bác chỉ e với, thanks!

    Comment


    • #32
      Vietheart oi! bạn làm ơn gửi cho mình toàn bộ Project Serial Comports cho mình tham khảo nhé. Mình đang học C# về vấn đề này.Thanhks!

      Comment


      • #33
        email của mình là:trandinhhieu83@gmail.com. mong Vietheart giúp đỡ.

        Comment


        • #34
          [QUOTE=vietheart;27732]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![/QUOTE

          byte[] data = HexStringToByteAray(txtHexTx.Text); ham HexStringToByteAray lay o dau ra vay. Minh tim hoai khong co. Thank

          Comment


          • #35
            mình cũng đang nghiên cứu serial port trong C#. Mình đang viết chương trình giao tiếp PC-PLC. Vấn đề đang gặp phải là PLC có tín hiệu đưa về: Digital InPut. Dưới PLC truyền lên thì ko vấn đề gì, nhưng mà trên PC nhận thì ko được, hoặc nhận sai kết quả.

            DI gồm 16 kênh, mình lưu giá trị từng kênh vào 1 mảng DI[16],
            * 1: ON
            * 0: OFF

            truyền lên thì truyền tuân tự từng phần tử của mảng, những ở trên nhận kết quả rất lung tung. Các bác có giải pháp gì ko thì góp ý với

            Comment


            • #36
              có ai tính đến chuyện bắt lỗi trong lúc transmit, receive data chưa, chẳng hạn nhận được 1 frame lỗi, hay buffer tràn...

              thấy trong lớp SerialPort của .NET có cái event ErrorReceived, với lại cả cái enum SerialError nữa mà chưa biết dùng thế nào.

              làm sao để lúc nhận được lỗi mình hiển thị được tên lỗi đấy ra :-/
              |

              Comment


              • #37
                Ai có bài chương trình hoàn chỉnh demo serial port trong C# thì cho mình xin với.

                Comment


                • #38
                  Nguyên văn bởi cndragon Xem bài viết
                  Ai có bài chương trình hoàn chỉnh demo serial port trong C# thì cho mình xin với.
                  Ở đây có bài hướng dẫn khá chi tiết về giao tiếp cổng COM sử dụng .NET, anh em có thể tham khảo:

                  Code:
                  http://www.dreamincode.net/forums/showtopic35775.htm
                  Attached Files

                  Comment


                  • #39
                    Bài viết rất bổ ích, thanks.

                    Mà tác giả có phải Thắng KSTN k48 ko? Nhận ra chiến hữu cũ chứ. Dạo này vẫn khỏe ko bạn? Bây giờ quay ra viết C# à? Tớ thăm trang web tntmech rồi, hoành tráng thật. À mà cảm ơn bạn vì đã giới thiệu tên tớ trong phần mềm cắt plasma ngày xưa nhé.

                    Comment


                    • #40
                      Nguyên văn bởi bvhoang Xem bài viết
                      Bài viết rất bổ ích, thanks.

                      Mà tác giả có phải Thắng KSTN k48 ko? Nhận ra chiến hữu cũ chứ. Dạo này vẫn khỏe ko bạn? Bây giờ quay ra viết C# à? Tớ thăm trang web tntmech rồi, hoành tráng thật. À mà cảm ơn bạn vì đã giới thiệu tên tớ trong phần mềm cắt plasma ngày xưa nhé.
                      Bên tôi phải học hỏi bên ông nhiều, khi nào có dịp anh em mình gặp nhau nhé, phải gần nửa năm anh em chưa gặp nhau rồi nhỉ.

                      Comment


                      • #41
                        Cám ơn mấy anh hai nhiều.

                        Comment


                        • #42
                          Nguyên văn bởi vietheart Xem bài viết
                          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!
                          Anh có thể giúp em mở cổng com bằng giao diện web được không ạ?Em đang rất cần cái này! Em định làm cái điều khiển thiết bị từ xa qua Internet đấy ạ!
                          Em cảm ơn anh!

                          Comment


                          • #43
                            em đang làm đồ án môn ghép nối máy tính đề tài là "truyền file qua cổng COM" xây dựng chương trình bằng C#. Nhưng em học không tốt lắm môn C# em muốn xin một chương trình mẫu để tham khảo. anh chủ Topic có thể giúp em được không e mail của em là: hoangvukmt.th@gmail.com
                            em cảm ơn anh trước nhé!

                            Comment


                            • #44
                              Nguyên văn bởi vietheart Xem bài viết
                              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!
                              Mình muốn chuyển thành 1 string dưới dạng mã Dec, mong mọi người góp ý giúp

                              Comment


                              • #45
                                mình mới bắt đầu C# nên còn yếu, mình muốn làm xây dựng như yêu cầu này thì làm thế nào hả mọi người
                                TGVT-PCWVN > ẤN PHẨM

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                • vi van pham
                                  Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?
                                  bởi vi van pham
                                  Đồng ý với Bqv.
                                  50 năm làm nghề, tôi đã chứng kiến 3 lần máy x quang mới nhập từ nước ngoài về bị lỗi.
                                  - Lần thứ 1 máy xq của Pháp được ks Pháp lằp đặt bị lỗi 1 con didode, đưa cho ks Pháp con didode khác cùng mã số, ông...
                                  hôm nay, 08:09
                                • mèomướp
                                  Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?
                                  bởi mèomướp
                                  Dạ chú dinh... muốn sửa lỗi cho hãng thì chú cứ gửi những hình ảnh, video cho họ đi ạ, chú có thể tìm thông tin của những lãnh đạo bên ấy để gửi thì sẽ hiệu quả hơn ạ. Về tổng quan thì họ sẽ ko phản hồi rõ ràng đâu ạ, vì nhận...
                                  hôm nay, 06:19
                                • bqviet
                                  Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?
                                  bởi bqviet
                                  Cuối năm bàn thêm chuyện to hơn chút, đấy là 2 vụ rơi đám 737 đời mới và trục trặc ở cả tá chiếc khác. Ngay cả những thứ tưởng như cao siêu sang xịn thật thì vẫn có thể gặp trường hợp oái oăm như thường. Từ hồi đó bqv đã thấy khó hiểu làm sao lại đẻ ra đám MCAS quái thai đến thế được. Rồi...
                                  24-01-2025, 19:40
                                • bqviet
                                  Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?
                                  bởi bqviet
                                  Bqv phải vào ngay để tán đồng với bài viết trên của bạn. Chỉ bàn về kỹ thuật, thiết bị máy móc của hãng dù danh tiếng vẫn có thể xảy ra những chuyện ngoài dự kiến, thậm chí những chuyện tưởng như không bao giờ có thể xảy ra....
                                  24-01-2025, 19:31
                                • dinhthuong80
                                  Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?
                                  bởi dinhthuong80
                                  (ĐT chia sẻ MPPT này, với mong muốn rằng, chúng ta hãy tự tin lên, hãy tự hào là người VN, đừng quá tin vào người khác, đừng quá thần tượng họ, cần kiểm tra thực chứng chứ không nên cứ cho các thiết bị thông minh, cao siêu là hoàn hảo)
                                  24-01-2025, 12:08
                                • dinhthuong80
                                  Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?
                                  bởi dinhthuong80
                                  Dưới đây là hình ảnh thực:

                                  (bị phạm con tụ pi C17 (phía trên IC U3/DIP08: văng mất xác!)

                                  (hàn vào vị trí C17 tụ pi 27nF ( giá trị phỏng đoán từ 10-100nF!), mạch vẫn chạy như trước khi cạy keo)...
                                  24-01-2025, 12:05
                                • dinhthuong80
                                  Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?
                                  bởi dinhthuong80
                                  ĐT đã mạnh dạn mail thử cho hãng SRNE, họ trả lời là nó dùng nhiệt điện trở ở bên trong mạch như sau:

                                  "Our street light controller product triggers high temperature protection based on internal thermistor sampling''

                                  Thấy hơi lo lắng vì kiến thức điện tử...
                                  24-01-2025, 11:39
                                • mèomướp
                                  Trả lời cho tìm mua đồng hồ vạn năng
                                  bởi mèomướp
                                  Dạ chú mua cái kẹp dòng ấy ạ. Chị hàng xóm nhà cháu có 1 cái thấy lâu lâu rùi chưa hỏng ạ. Ví dụ như mẫu này trên shoppee đầy ạ...
                                  https://vn.shp.ee/dWYVgq7
                                  21-01-2025, 12:48
                                • vi van pham
                                  Trả lời cho Sửa bộ nguồn DC 60V 45A
                                  bởi vi van pham
                                  Bác Đinh Vặn sai rồi,bây giờ con nít mẫu giáo đã giải phương trình 2 ẩn số rồi.
                                  Tôi chứng minh bác lên youtube đầy video đơn giản tựa rất hot, chỉ 1 transistor hay 1 con diode và hướng dẩn cách làm, tác giả không vẽ sơ đồ mạch điện...
                                  21-01-2025, 11:55
                                • nguyendinhvan
                                  Trả lời cho Sửa bộ nguồn DC 60V 45A
                                  bởi nguyendinhvan
                                  Bây giờ mới có tháng giêng, bao giờ mới đến tháng mười ?
                                  Các cháu mẫu giáo mới lên lớp 1 được có 4 tháng. Nên đừng lấy lý do chúng nó đã đi học rồi để bắt nó viết một bài luận văn, hay là giải bài toán hàm. Phải kiên nhẫn...
                                  21-01-2025, 00:47
                                Đang tải...
                                X