本文实例为大家分享了C#基于SerialPort类实现串口通讯的具体代码,供大家参考,具体内容如下
最终效果
窗体设置:
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.IO.Ports;
using System.Threading;
using System.Windows.Forms;
namespace SerialCommunication
{
public partial class Form1 : Form
{
System.Threading.SynchronizationContext m_SyncContext = null;
SerialPort serialPort = null;
ToHexadecimalString toHexadecimalString = new ToHexadecimalString();
public Form1()
{
m_SyncContext = SynchronizationContext.Current;
InitializeComponent();
}
//Data initialization
private void Form1_Load(object sender, EventArgs e)
{
string[] ports = SerialPort.GetPortNames();
SerialPortNumber.Items.AddRange(ports);
SerialPortNumber.SelectedIndex = SerialPortNumber.Items.Count > 0 ? 0 : -1;
BaudRateCom.Text = "9600"; //Set parameters
CheckBitCom.Text = "None";
DataBitCom.Text = "8";
StopBitCom.Text = "One";
}
//Send data
private void Send_Click(object sender, EventArgs e)
{
try
{
//Send data and handle exceptions
byte[] bytes = new byte[SendMessage.Text.Length];
bytes = Encoding.Default.GetBytes(SendMessage.Text);
serialPort.Write(bytes, 0, bytes.Length);
}
catch (Exception error)
{
MessageBox.Show(error.Message);
}
}
// Byte to hexadecimal string
//Clear data
private void Clear_Click(object sender, EventArgs e)
{
ReceiveMessage.Text = "";
}
private void Open_Click(object sender, EventArgs e)
{
string portName = SerialPortNumber.Text;
int buadRate = int.Parse(BaudRateCom.Text);
Parity parity = 0;
switch (CheckBitCom.Text)
{
case "None":
parity = Parity.None; break;
case "Odd":
parity = Parity.Odd; break;
case "Even":
parity = Parity.Even; break;
case "Mark":
parity = Parity.Mark; break;
case "Space":
parity = Parity.Space; break;
}
int dataBit = int.Parse(DataBitCom.Text);
StopBits stopBits = 0;
switch (StopBitCom.Text)
{
case "None":
stopBits = StopBits.None; break;
case "One":
stopBits = StopBits.One; break;
case "Tow":
stopBits = StopBits.Two; break;
case "OnePointFive":
stopBits = StopBits.OnePointFive; break;
}
try
{
if (Open.Text == "Open")
{
serialPort = new SerialPort(portName, buadRate, parity, dataBit, stopBits);
serialPort.Open();
Open.Text = "Close";
}
else if (Open.Text == "Close")
{
serialPort.Close();
Open.Text = "Open";
}
}
catch (Exception errror)
{
MessageBox.Show(errror.Message);
}
serialPort.DataReceived += onDataReceived;
}
private void onDataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
Byte[] bytes = new byte[serialPort.BytesToRead];
serialPort.Read(bytes, 0, serialPort.BytesToRead);
m_SyncContext.Post(new SendOrPostCallback((obj) =>
{
ReceiveMessage.AppendText(Encoding.Default.GetString(bytes));
}), bytes);
}
catch (Exception error)
{
MessageBox.Show(error.Message);
}
}
}
}