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
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.
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!
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; }
// 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!
Comment