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!
Thông báo
Collapse
No announcement yet.
Vào Ra Dữ Liệu Với Serial Port Trong C# .Net Framework
Collapse
X
-
[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
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 PortCode: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![/QUOTE
byte[] data = HexStringToByteAray(txtHexTx.Text); ham HexStringToByteAray lay o dau ra vay. Minh tim hoai khong co. Thank
Comment
-
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
-
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
-
Ở đâ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:Nguyên văn bởi cndragon Xem bài viếtAi có bài chương trình hoàn chỉnh demo serial port trong C# thì cho mình xin với.
Code:http://www.dreamincode.net/forums/showtopic35775.htm
Attached Files
Comment
-
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
-
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ỉ.Nguyên văn bởi bvhoang Xem bài viếtBà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
-
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 ạ!Nguyên văn bởi vietheart Xem bài viếtTiệ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!
Em cảm ơn anh!
Comment
-
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
-
Mình muốn chuyển thành 1 string dưới dạng mã Dec, mong mọi người góp ý giúpNguyên văn bởi vietheart Xem bài viếtThấ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 PortCode: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
-
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
Bài viết mới nhất
Collapse
-
Trả lời cho Tìm bạn thân quen cũ.bởi lvhnNhớ không nhầm thì lúc còn đi học có gặp chú 1 lần cf bãi xe Nguyễn Kim, giờ quán cf đó nghỉ bán rồi
-
Channel: Tâm tình dân kỹ thuật
hôm nay, 15:44 -
-
Trả lời cho Thắc mắc pin 21v ?bởi lvhnCon số đấy biểu thị gần đúng thôi, cái đồng hồ đó có đảm bảo chính xác hay không? pin có cục lên 4v4 vẫn bình thường. Cái gì cũng có sai số trong phạm vi không quá lớn thì không ảnh hưởng gì đâu, bàn ngay ngón ngắn ngón dài mà
-
Channel: Điện tử dành cho người mới bắt đầu
hôm nay, 15:32 -
-
Trả lời cho Amply bị rò DC 22 voltbởi lvhnThay mấy con transisto nhỏ đầu vào, thường vi sai lỗi hay bị. Khám tổng quát chân các linh kiện xem có bị rỉ sét nhiều không?
-
Channel: Điện thanh
hôm nay, 15:24 -
-
bởi dinhthuong92Mạch này hiệu suất ra led đạt khoảng 90.7% tại 12V in, 40W out.
-
Channel: Nguồn!
27-07-2026, 10:15 -
-
bởi dinhthuong92Có lẽ nguồn viết bài này chỉ mang tính định tính để nói rằng cần thay đổi tổng trở tải để có Pmax chứ trình bày chưa chi tiết và thấu đáo một cách định lượng. Công thức tổng quát phải có mặt L mới được, và nói là "tổng...
-
Channel: Nguồn!
27-07-2026, 10:09 -
-
Trả lời cho [Chia sẻ] Tổng hợp các công ty AI Việt Nam đang làm gì thật sự — Từ voicebot, computer vision đến AI agentsbởi nguyendinhvanCàng ngày, CNTT càng trở nên lôi thôi , rách việc.
Cái AI và Ge... trên trình duyệt chỉ tổ làm vướng mắt, mất thì gian.
Tôi toàm phải mất cộng tắt nó đi.-
Channel: Xu hướng, nhu cầu và thị trường
25-07-2026, 14:59 -
-
bởi trung30000Em có con amply 12 sò D 718 và e688 , biến áp 15A, 30v 0 30 v, một kênh thì hoạt động bình thường, kênh còn lại nổ bụp bụp, sột sột, đèn tín hiệu nhảy lên vạch max, khoảng 4 đến 5 giây, sau đó đèn tín hiệu trả về mức không, Em thấy như...
-
Channel: Điện thanh
24-07-2026, 13:50 -
-
Trả lời cho Tìm hiểu máy hàn lăn (Rolling Welding)bởi hoang_3ibác cần thì liên hệ Em: mayhanhaivuong.com (0903238399)...
-
Channel: Điện tử công nghiệp
24-07-2026, 10:58 -
-
Trả lời cho Công thức tính định luật kirchhoffbởi abcnewmemberGiải bằng hệ phương trình bật nhất 3 ẩn.
...
-
Channel: Hỗ trợ học tập
23-07-2026, 14:52 -

Comment