在WinForm中收發數據,可以使用SerialPort類來進行串口通信。以下是一個簡單的示例:
首先,在WinForm的設計視圖中,拖動一個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; // 設置波特率
serialPort.DataBits = 8; // 設置數據位
serialPort.Parity = Parity.None; // 設置奇偶校驗位
serialPort.StopBits = StopBits.One; // 設置停止位
serialPort.DataReceived += SerialPort_DataReceived; // 綁定數據接收事件
}
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(); // 設置串口名稱
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(); // 關閉串口
buttonOpen.Enabled = true;
buttonClose.Enabled = false;
}
}
private void buttonSend_Click(object sender, EventArgs e)
{
if (serialPort.IsOpen)
{
serialPort.Write(textBoxSend.Text); // 發送數據
}
}
private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string data = serialPort.ReadExisting(); // 讀取接收到的數據
// 在UI線程中更新UI控件上的數據
Invoke(new Action(() =>
{
textBoxReceive.Text += data;
}));
}
}
}
在上面的示例中,我們通過SerialPort控件來實現串口收發數據。在窗體加載時,我們獲取可用的串口列表,并將其添加到ComboBox控件中。點擊打開按鈕后,我們根據用戶選擇的串口名稱來打開串口。點擊關閉按鈕后,關閉串口。點擊發送按鈕后,發送TextBox中的文本數據。當收到數據時,我們通過DataReceived事件來讀取接收到的數據,并將其顯示在TextBox中。
需要注意的是,串口的配置參數(波特率、數據位、奇偶校驗位、停止位)需要根據實際情況進行設置。同時,為了在數據接收事件處理程序中更新UI控件上的數據,我們使用了Invoke方法來在UI線程中執行更新操作。