在WinForm中收發(fā)數(shù)據(jù),可以使用SerialPort類來進行串口通信。以下是一個簡單的示例:
首先,在WinForm的設(shè)計視圖中,拖動一個SerialPort控件到窗體上。
在窗體的代碼文件中,添加以下代碼:
using System;
using System.IO.Ports;
namespace SerialPortDemo
{
public partial class Form1 : Form
{
SerialPort serialPort;
public Form1()
{
InitializeComponent();
// 初始化SerialPort對象
serialPort = new SerialPort();
serialPort.BaudRate = 9600; // 設(shè)置波特率
serialPort.DataBits = 8; // 設(shè)置數(shù)據(jù)位
serialPort.Parity = Parity.None; // 設(shè)置奇偶校驗位
serialPort.StopBits = StopBits.One; // 設(shè)置停止位
serialPort.DataReceived += SerialPort_DataReceived; // 綁定數(shù)據(jù)接收事件
}
private void Form1_Load(object sender, EventArgs e)
{
// 獲取可用的串口列表,并添加到ComboBox控件中
string[] ports = SerialPort.GetPortNames();
comboBox1.Items.AddRange(ports);
}
private void buttonOpen_Click(object sender, EventArgs e)
{
if (!serialPort.IsOpen)
{
try
{
serialPort.PortName = comboBox1.SelectedItem.ToString(); // 設(shè)置串口名稱
serialPort.Open(); // 打開串口
buttonOpen.Enabled = false;
buttonClose.Enabled = true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
private void buttonClose_Click(object sender, EventArgs e)
{
if (serialPort.IsOpen)
{
serialPort.Close(); // 關(guān)閉串口
buttonOpen.Enabled = true;
buttonClose.Enabled = false;
}
}
private void buttonSend_Click(object sender, EventArgs e)
{
if (serialPort.IsOpen)
{
serialPort.Write(textBoxSend.Text); // 發(fā)送數(shù)據(jù)
}
}
private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string data = serialPort.ReadExisting(); // 讀取接收到的數(shù)據(jù)
// 在UI線程中更新UI控件上的數(shù)據(jù)
Invoke(new Action(() =>
{
textBoxReceive.Text += data;
}));
}
}
}
在上面的示例中,我們通過SerialPort控件來實現(xiàn)串口收發(fā)數(shù)據(jù)。在窗體加載時,我們獲取可用的串口列表,并將其添加到ComboBox控件中。點擊打開按鈕后,我們根據(jù)用戶選擇的串口名稱來打開串口。點擊關(guān)閉按鈕后,關(guān)閉串口。點擊發(fā)送按鈕后,發(fā)送TextBox中的文本數(shù)據(jù)。當收到數(shù)據(jù)時,我們通過DataReceived事件來讀取接收到的數(shù)據(jù),并將其顯示在TextBox中。
需要注意的是,串口的配置參數(shù)(波特率、數(shù)據(jù)位、奇偶校驗位、停止位)需要根據(jù)實際情況進行設(shè)置。同時,為了在數(shù)據(jù)接收事件處理程序中更新UI控件上的數(shù)據(jù),我們使用了Invoke方法來在UI線程中執(zhí)行更新操作。