Halo Sobat, hari ini
saya ingin berbagi sedikit pengalaman tentang komunikasi serial di visual
studio C#. Mungkin bagi para master, hal ini udah biasa atau mudah. Namun, dulu
pertama kali saya di tugasi oleh dosen pembimbing TA saya untuk membuat komunikasi
serial PC to PC, PC to node hardware, saya mencari-cari cara untuk membuat
komunikasi serial di visual studio C#. pertama kali, sulit sekali dicari.
Berbagai potongan coding saya kumpulkan, hingga dapat deh. Sehingga saya ingin
membuat catatan kecil disini. Yuk mulai aja membuatnya.
1. Berikut ini
tampilan form design nya
Dalam
komunikasi serial, minimal kita membutuhkan COM port jika melalui serial port
dan Boud rate. Untuk membuat form design seperti diatas, kita membutuhkan
komponen di toolbox antara lain.
Nama
Form Window
|
Name
Property
|
ComboBox untuk port
|
cboPort
|
ComboBox untuk baudrate
|
cboBaudrate
|
ComboBox untuk data bits
|
cboDatabits
|
ComboBox untuk parity
|
cboParity
|
ComboBox untuk stop bits
|
cboStopBits
|
ComboBox untuk hand shake
|
cboHS
|
Button untuk open
|
btnPort
|
Butoon untuk close
|
blnclose
|
TextBox untuk Data sent
|
rtbOutgoing
|
TextBox untuk Data Received
|
rtbIncoming
|
TextBox untuk status port
|
TextPrompt
|
SerialPort
|
serialPort1
|
Apabila sudah membuat
form design nya, saat nya untuk mem-program design nya supaya bekerja sesuai
dengan kehendak kita. Untuk menulis listing program, klik kiri pada formà view code. Berikut listing program nya.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
namespace detectPort1
{
public partial class Form1 : Form
{
//menggunakan
serial port baru
SerialPort comport = new SerialPort();
delegate void SetTextCallback(string text);
String data = String.Empty;
public Form1()
{
comport.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(portDataReceived);
InitializeComponent();
cboBaudrate.Items.Add(300);
cboBaudrate.Items.Add(600);
cboBaudrate.Items.Add(1200);
cboBaudrate.Items.Add(2400);
cboBaudrate.Items.Add(9600);
cboBaudrate.Items.Add(14400);
cboBaudrate.Items.Add(19200);
cboBaudrate.Items.Add(38400);
cboBaudrate.Items.Add(57600);
cboBaudrate.Items.Add(115200);
cboBaudrate.Text =
cboBaudrate.Items[0].ToString();
cboDatabits.Items.Add(8);
cboDatabits.Items.Add(7);
cboDatabits.Text =
cboDatabits.Items[0].ToString();
cboParity.Items.Add("None");
cboParity.Items.Add("Even");
cboParity.Items.Add("Odd");
cboParity.Items.Add("Mark");
cboParity.Items.Add("Space");
cboParity.Text =
cboParity.Items[0].ToString();
cboStopBits.Items.Add("One");
cboStopBits.Items.Add("OnePointFive");
cboStopBits.Items.Add("Two");
cboStopBits.Text =
cboStopBits.Items[0].ToString();
cboHS.Items.Add("None");
cboHS.Items.Add("XOnXOff");
cboHS.Items.Add("RequestToSend");
cboHS.Items.Add("RequestToSendXOnXOff");
cboHS.Text =
cboHS.Items[0].ToString();
}
private void btnPort_Click(object sender, EventArgs e)
{
comport.PortName = Convert.ToString(cboPort.Text);
comport.BaudRate = Convert.ToInt32(cboBaudrate.Text);
comport.DataBits = Convert.ToInt16(cboDatabits.Text);
comport.StopBits = (StopBits)Enum.Parse(typeof(StopBits), cboStopBits.Text);
comport.Parity = (Parity)Enum.Parse(typeof(Parity), cboParity.Text);
comport.Handshake = (Handshake)Enum.Parse(typeof(Handshake), cboHS.Text);
comport.Open();
if (comport.IsOpen)
{
TextPrompt.AppendText("Port status : Open\n");
}
}
private void blnclose_Click(object sender, EventArgs e)
{
comport.Close();
TextPrompt.AppendText("Port status : Close\n");
}
private void rtbOutgoing_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)13) //mendeteksi enter
{
comport.Write("\r\n");
rtbOutgoing.Text = "";
}
else if (e.KeyChar < 32 || e.KeyChar > 126)
{
e.Handled = true;
}
else
{
comport.Write(e.KeyChar.ToString());
}
}
private void portDataReceived(object sender, SerialDataReceivedEventArgs e)
{
data = comport.ReadExisting();
if (data != String.Empty)
{
this.BeginInvoke(new SetTextCallback(SetText), new object[] { data });
}
}
private void SetText(string text)
{
this.rtbIncoming.Text += text;
}
private void cboPort_Click(object sender, EventArgs e)
{
//
string[] ArrayComPortName = null;
int index = -1;
cboPort.Items.Clear();
ArrayComPortName = SerialPort.GetPortNames();
foreach(String ports in ArrayComPortName)
{
index++;
cboPort.Items.Add(ArrayComPortName[index]);
}
if (index >= 0) cboPort.Text=ArrayComPortName[0];
}
}
}
Setealah itu, uji
programnya. Untuk menguji programnya, saya menggunakan virtual port. Jadi harus
install software VSPE, atau Hyperterminal. Namun kali ini saya menggunakan
VSPE.
Berikut ini cara
membuat virtual port nya.
1. Tampilan awal
VSPE
2.
Pilih create new
deviceà
pada device type pilih pair
3.
Setelah itu
tekan next. Dan pilih com port nya. Kali ini saya menggunakan port COM 1 dan
port COM 2.
4.
Tekan finish.
Maka akan terbentuk koneksi antara COM 1 dan COM 2.
Setelah
terbentuk komunikasi port, maka kita membutuhkan 2 interface. Interface pertama
kita gunakan program kita yang baru di-run. Interface ke dua saya menggunakan
aplikasi hterm. Berikut ini uji coba program nya.
Gunakan baudrate yang
sama. Program yang di run menggunakan COM1. Sedangkan hterm menggunakan COM 2.
----Semoga Bermanfaat----
Terima kasih kepada Mas Bima, Mas Jodi, dan Mas Tian
Mas boleh minta softfile gak
BalasHapusmas saya alfi dari PENS,
BalasHapusboleh minta file project detectPort1 nya.
bisa kirimkan ke email : alfiansyah.ramadlan@yahoo.com
terima kasih
yg cboPortnya kok jd Click ya gan?
BalasHapusSoalnya combobox cboPortnya masih belum munculin pilihan portnya gan.. pdhl sudah konek ke COMport(dicheck di device manager). Mohon bantuanya gan... thx thx
BalasHapusDadan, dari ITS Kalo bole bagi ilmu softilenya dong gan amanuisdadan04@gmail.com
BalasHapus