下面总结下利用winform设计串口调试助手,如果错误的地方,望大家批评指正。
首先附上项目工程代码方便大家自取:链接:https://pan.baidu.com/s/1m3veGA5_hJ2-BRFRvHyOGQ?pwd=1eo5
提取码:1eo5
以下的内容均学习自下方链接,如有文章有描述不清的地方,可点击视频链接看详细教程:
【单片机课/毕设利器】B站最小白的串口调试助手教程上位机C#编程
一、串口调试助手的界面设计
整个串口界面中,我们需要串口号、波特率、数据位、停止位、校验位。接收窗口(用于接收外界信息),发送窗口(向外界发送信息),本项目中除了串口号和波特率进行修改,其他直接使用系统默认的方式。
默认格式如下:
1、点击最上方菜单栏项目-->添加窗体应用--->类名命名Form5.cs(这里大家随意就行)
2、添加各类控件,设计好界面
①在工具箱栏搜索Serial,将串口添加到界面中
②方法类似,继续添加button、label、TextBox、Radiobutton中,并如下布置好界面
③为了方便修改我们的控件,这里先更改各个控件的ID号。
任意选择某控件-->点击属性-->设计--->更改Name栏里的内容
二、代码的实现
先双击空白页进入初始化
①先定义一个扫描可用端口的类,方便我们得知有几个端口可用,代码如下
private void ReflashPortToComboBox(SerialPort serialPort, ComboBox comboBox)
{
if(!serialPort.IsOpen)//串口处于关闭状态
{
comboBox.Items.Clear();
string[] str = SerialPort.GetPortNames();
if(str == null)
{
MessageBox.Show("本机没有串口!", "Error");
return;
}
//添加串口
foreach (string s in str)
{
comboBox.Items.Add(s);
Console.WriteLine(s);
}
}
else
{
MessageBox.Show("串口处于打开状态不能刷新串口列表", "Error");
}
}
②初始化界面中调用ReflashPortToComboBox函数,并添加GB2312类型,使我们在之后的串口发送中获取中文字符
public Form5()
{
InitializeComponent();
serialPort1.Encoding = Encoding.GetEncoding("GB2312");
//防止跨线程操作控件异常
Control.CheckForIllegalCrossThreadCalls = false;//取消跨线程检查
}
③在端口按钮中也添加ReflashPortToComboBox,方面后期的串口刷新
private void button1_Click(object sender, EventArgs e)
{
ReflashPortToComboBox(serialPort1, comboBox_port);
}
④在波特率的下拉宽-->属性-->数据-->选中Item-->点击后在里面添加波特率
⑤编辑打开串口代码
//端口号打开按钮
private void button_Open_Click(object sender, EventArgs e)
{
Int32 iBaudRate = Convert.ToInt32(comboBox_BaudRate.Text);//获取下拉宽中的波特率,并从字符串转换为Int32
serialPort1.PortName = comboBox_port.SelectedItem.ToString();//串口号
serialPort1.BaudRate = iBaudRate;//波特率
try
{
serialPort1.Open();
button_Open.Enabled = false;
button_Close.Enabled = true;
}
catch(Exception ex)
{
MessageBox.Show("串口打开失败" + ex, "error");
}
}
⑥编辑关闭串口按钮
private void button_Close_Click(object sender, EventArgs e)
{
try
{
serialPort1.Close();
button_Open.Enabled = true;
button_Close.Enabled = false;
}
catch (Exception ex)
{
MessageBox.Show("串口关闭失败" + ex, "error");
}
}
⑦清空接收窗及清空发送窗
//清空接收窗
private void button4_Click(object sender, EventArgs e)
{
textBox_Get.Clear();
}
//清空发送窗
private void button6_Click(object sender, EventArgs e)
{
textBox_Send.Clear();
}
⑧编辑发送数据发送按钮
private void button2_Click(object sender, EventArgs e)
{
if(serialPort1.IsOpen)
{
if(textBox_Send.Text!="")
{
if(radioBt_SendAscll.Checked == true)
try
{
serialPort1.Write(textBox_Send.Text);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, "串口数据写入错误");
serialPort1.Close();
button_Open.Enabled = true;
button_Close.Enabled = false;
}
else
{
try
{
string hexData = textBox_Send.Text.Replace(" ", "");
byte[] buffer = new byte[hexData.Length / 2];
for (int i = 0; i < buffer.Length; i++)
{
buffer[i] = Convert.ToByte(hexData.Substring(i * 2, 2), 16);
}
serialPort1.Write(buffer, 0, buffer.Length);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "串口数据写入错误");
serialPort1.Close();
button_Open.Enabled = true;
button_Close.Enabled = false;
}
}
}
}
}
⑨编辑串口接收,单击serial1控件-->选择事件-->点击DataReceived进入串口接收函数编辑
//串口接收事件
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
DateTime dt = DateTime.Now;
try
{
if(radioBt_GetAscll.Checked)//如果接收的是字符
{
string content = serialPort1.ReadExisting() + " " + dt.GetDateTimeFormats('f')[0].ToString() + "\r\n";//读取从机数据
textBox_Get.AppendText(content);//将数据添加到文本
}
else//如果接收的是HEX模式
{
// 接收到数据后的处理逻辑
int i_InNum;//输入缓冲区中字节数
i_InNum = serialPort1.BytesToRead;
Byte[] ReceivedData = new Byte[serialPort1.BytesToRead];//创建接收字节数组
serialPort1.Read(ReceivedData, 0, ReceivedData.Length);//读取接收的数据
String RecvDataText = null;
for (int i = 0; i < ReceivedData.Length; i++)
{
RecvDataText += (ReceivedData[i].ToString("X2")+" ");
}
textBox_Get.Text += RecvDataText + dt.GetDateTimeFormats('f')[0].ToString() + "\r\n";
}
}
catch(Exception ex)
{
MessageBox.Show("数据接受出错" + ex, "error");
}
}
三、演示
最后进行效果的演示