Feb 6, 2010

Thực hiện việc chuyển Text và Chuyển mã Hexa ra Serial Port

Thực hiện việc chuyển Text và Chuyển mã Hexa ra Serial Port bằng C# với .Net FrameWork 2.0
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 < offset =" i"> 16)
nChars = 16;
else
nChars = asc.Length - offset;
hex += this.HexLine(i, asc.Substring(offset, nChars)) + "\r\n";
}
return hex;
}

///
/// Chuyển một chuỗi ASCII 16 byte sang định dạng hexa.
///

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 < nspaces =" 62" i =" 0;" i =" 0;"> 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;
}
một Class riêng để 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()
{

}
///
/// Mo cong COM1
///

///
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()
{

}
///
/// Send(SerialPort ComPort, String data) se
/// Gui chuoi data ra cong ComPort
///

///
///
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;
}

}
File gửi kèm
File  Type: rar ComPorts.rar (876 Bytes, 993 views)

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!

iệ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!

http://www.dreamincode.net/forums/showtopic35775.htm
http://dientuvietnam.net/forums/showthread.php?t=3046&page=4

No comments: