C# Winform开发中串口列表的获取与串口的使用
概念与内涵
串口是C#开发中常用的接口,也是最入门的,在这里记录一下,便于大家后续开发的时候直接使用。
本例子实现的Winform
我们将serial port控件从工具箱拉到Winform窗口,并改名为serialPortMain,如下图
上图中的控件分别为comboBoxSerial,buttonOpen,buttonClose和ButtonRefresh。我们进一步假设还有一个richTextBoxMain,用于显示一些调试状态。
我们假设串口的波特率等参数是预先设定的,如下图:
#刷新按钮的实现:
private void buttonRefresh_Click(object sender, EventArgs e)
{
comboBoxSerial.Items.Clear();
string[] portNames = SerialPort.GetPortNames(); //<-- Reads all available comPorts
foreach (var portName in portNames)
{
comboBoxSerial.Items.Add(portName); //<-- Adds Ports to combobox
}
if (comboBoxSerial.Items.Count > 0)
{
comboBoxSerial.SelectedIndex = 0;
serialPortMain.PortName = comboBoxSerial.Items[0].ToString();
buttonOpen.Enabled = true;
buttonClose.Enabled = false;
}
}
#打开按钮的实现
private void buttonOpen_Click(object sender, EventArgs e)
{
if (!serialPortMain.IsOpen)
{
serialPortMain.Open();
richTextBoxMain.AppendText("串口成功打开\r\n");
timerMain.Enabled = true;
buttonRefresh.Enabled = false;
buttonClose.Enabled = true;
buttonOpen.Enabled = false;
}
}
#关闭按钮的实现
private void buttonClose_Click(object sender, EventArgs e)
{
serialPortMain.Close();
timerMain.Enabled = false;
buttonRefresh.Enabled = true;
buttonOpen.Enabled = true;
}
#发送数据的实现
private void buttonSend_Click(object sender, EventArgs e)
{
if (!serialPortMain.IsOpen) return;
byte[] buf = new byte[6];
buf[0] = 0xEB;
buf[1] = 0x90;
buf[2] = 0x0C;
buf[3] = 0x00;
buf[4] = 0x01;
buf[5] = 0x01;
serialPortMain.Write(buf, 0, 6);
richTextBoxMain.AppendText("上位机:发送打开GNSS接收状态控制设定到硬件\r\n");
}
#接收数据的实现
我们假设用一个Timer,每秒一次接收数据。
private void timer1_Tick(object sender, EventArgs e)
{
if (!serialPortMain.IsOpen) return;
int size = serialPortMain.BytesToRead;
if (size !=0)
{
byte[] buf = new byte[size];
int d = serialPortMain.Read(buf, 0, size);
string rx_str = System.Text.Encoding.UTF8.GetString(buf);
if (rx_str.Contains("Uart Wakeup CMD")) timerSendCount = 100;
richTextBoxMain.AppendText("时间:"+DateTime.Now.ToString("T")+",硬件:"+ rx_str + "\r\n");
richTextBoxMain.ScrollToCaret();
}
}
一个简单的C# Winform串口程序就做完了。