基于c#的串口调试助手实现
界面截图
功能
串口数据的发送,接收显示。
发送方式:发送字符,或字符对应的十六进制发送
接收显示:字符显示,或十六进制显示
发送方法:回车,发送输入的字符
默认发送新行
实现方法
Visual Studio中创建windows窗体应用,添加所需控件,修改控件属性,为控件添加控件处理函数,具体实行方法:
一。添加控件
1.TextBox文本框
功能:获取用户的输入数据或者显示文本,用于串口接收数据的显示,以及串口数据的发送输入框
对于显示接收数据的文本框,只允许读取,而不允许输入,修改,
(1.1)设置文本框为只读:
修改Readonly属性:true,只读; false:可读可写
例:
textBox1.ReadOnly = true;
(1.2)将数据追加到文本框
发送或者接收的串口数据要显示在文本框,或者要定期的删除文本框显示内容,例:
textBox1.AppendText(ret);将字符串ret追加到文本框的末尾
textBox1.Text+=ret;将字符串ret追加到文本框的末尾
2.Combobox控件
功能:显示一个选项列表,或允许用户输入的列表框的文本框
在本功能中,用以选择波特率,端口号,数据位的信息
(2.1)创建只可以选择的下拉框
修改DropDownStyle属性
simple: 是控件的列表部分总是可见
DropDown: 默认值,使用户可以编辑该控件的文本框
DropDownList: 不能编辑文本框部分,呈现下拉框的样式
在我们的使用中,修改为
comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
(2.2)
获取Combobox1控件的选择框内容:
string str = comboBox1.Text;
3.Lable控件
主要用于显示用户不能编辑的文本,给文本框、列
表框等添加描述信息,例如,设置label1文本:
label1.Text = "COM";
(4)buttun控件
通过单击来执行操作,在配置完串口的选项后,点击Open按钮,对应该控件的click事件,在代码中添加配置
通过修改buttun控件的Enabled属性,控制控件是否工作
(5)radioButton控件
点式控件,如果被选中,则Checked属性 返回true
(5)Panel容器:
用于为其他的控件提供可以识别的分组,如果不添加该控件,相同类型的控件,只能选择一个,如radioButton控件如果不用Panel容器限制,则只能选择一个,用于给控件分区
(6)serialPort控件
串口控件
打开串口serialPort:
serialPort.Open();
关闭串口:
serialPort.Close();
发送数据
serialPort.Write(byte[],int offset,int count)
byte:发送数据的byte数字
offset:开始读取的数组下表的位置
count:读取的元素个数
接收数据
string str = serialPort1.ReadExisting();//读取输入缓冲区的所有字节
byte ret = (byte)serialPort1.ReadByte(); //读取输入缓冲区的一个字节
判断串口是否打开
bool serialPort.Isopen()
返回值: true, 打开
false: 关闭
为串口添加接收事件
serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(portReceived) ;
portReceived:
就是对应的串口接收函数的函数名(可以自己定义函数名),该函数类似于单片机中的中断,当有数据接收时,就会触发我们所注册的函数,在该函数中添加对应的数据接收,显示处理代码。
(7)timer控件
功能:定时检测是否有数据发送,如果发送区有数据,且按了回车键盘,则发送数据。
可以定期的引发事件,就如同中断一样
timer1.Stop(); //关闭定时器
timer1.Start(); //打开定时器
interval属性:定时时间:单位:ms
二.窗体属性
(1)更换窗体图标 Icon 属性
(2)隐藏窗体图标栏 FormBorderStyle 属性
(3)设置窗体的显示位置 StartPosition 属性
CenterParent
窗体在其父窗体中居中
CenterScreen
窗体在当前显示窗体中居中,其尺寸在窗体大小中指定
Manual
窗体的位置由 location 属性确定
WindowsDefaultBounds
窗体定位在 Windows 默认位置,其边界也由 Windows 默认决定
WindowsDefaultLocation
窗体定位在 Windows 默认位置,其尺寸在窗体大小中指定
(4)修改窗体的大小 size属性
(5)设置图像背景的窗体 BackgroundImage
三.代码实现
设置,添加好控件之后,就可以为控件添加相应的代码块了。
程序实现的流程:在buttun控件中读取串口配置参数,初始化打开串口,当有数据输入时,就会触发串口接收函数,在该函数中,添加对应的代码用以接受到的数据的读取与显示,数据的发送,定时器每50毫秒判断发送区是否有数据输入,如果有,则判断是否输入了回车,如果输入回车,则通过串口将数据进行发送。
四.代码部分
打开串口部分:
private void button1_Click(object sender, EventArgs e) //start按钮
{
try
{
serialPort1.PortName = comboBox1.Text;
serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text);
serialPort1.DataBits = Convert.ToInt32(comboBox4.Text);
}
catch
{
MessageBox.Show("请重新配置串口,此为系统默认端口设置");
}
try
{
serialPort1.Open(); //打开串口
button1.Enabled = false;
button2.Enabled = true;
timer1.Start();
}
catch
{
if (serialPort1.IsOpen)
{
MessageBox.Show("串口连接错误");
}
else
{
MessageBox.Show("串口不存在,请重新连接");
}
}
}
发送部分:
private void timer1_Tick(object sender, EventArgs e) //定时器处理函数,判断是否要发送数据
{
byte[] ret = new byte[1];
if (serialPort1.IsOpen && textBox4.Text != "")
{
string str = textBox4.Text;
byte[] BIT = new byte[1];
if (textBox4.Text.Substring(textBox4.Text.Length - 1, 1) == "\n") //按下回车,发送数据
{
if (radioButton1.Checked) //以字符方式发送
{
int i = 1;
BIT[0] = (byte)str[0];
if (radioButton5.Checked) //判断是否发送新行
{
while (BIT[0] != '\n') //循环发送数据,字节的方式,发送回车\r,按下回车键会发送"\r\n"
{
serialPort1.Write(BIT, 0, 1); //发送数组下标为0的元素
BIT[0] = (byte)str[i++];
}
}
else //不发送回车\r
{
while (BIT[0] != '\r') //循环发送数据,字节的方式,不发送回车\r
{
serialPort1.Write(BIT, 0, 1); //发送数组下标为0的元素
BIT[0] = (byte)str[i++];
}
}
textBox4.Text = ""; //清除发送区
}
else if (radioButton2.Checked) //字符以对应的ASCII的16进制进行发送
{
int length = textBox4.Text.Length -2;
byte[] buf = new byte[2];
string str_test;
try
{
for (int i = 0; i < length; i += 3)
{
str_test = textBox4.Text.Substring(i,2); //字符串6c 对应 整数108
buf[0] = (byte)Convert.ToInt32(str_test, 16);//字符串形式的十六进制,转换为整形
serialPort1.Write(buf, 0, 1); //发送数组下标为0的元素
}
if (radioButton5.Checked)//发送回车 :\r
{
buf[0] = 13;
serialPort1.Write(buf, 0, 1); //发送数组下标为0的元素
}
}
catch
{
//MessageBox.Show("sh");
}
textBox4.Text = ""; //清除发送区
}
}
}
}
接收部分:
private void portReceived(object sender,System.IO.Ports.SerialDataReceivedEventArgs e )
{
if (radioButton4.Checked) //判断是否以字符串的方式读取
{
string ret = serialPort1.ReadExisting();//读取输入缓冲区的所有字节
textBox1.AppendText(ret); //将读取到的数据追加到文本框的末尾
}
else if(radioButton3.Checked) //读取到的字符对应的ACill以16进制显示
{
byte ret = (byte)serialPort1.ReadByte(); //读取输入缓冲区的一个字节 10 --对应 A
string str = ret.ToString("x"); //将byte对应的16进制,转换为16进制的字符串0-ff;
textBox1.Text += (str.Length == 1) ? "0x0" + str + " " : "0x" + str + " "; //追加到文末
}
}
完整代码块:请点击以下链接:
https://github.com/1997LP/C-/commit/8367b256410a41178bec5620a914b9b577f1e5a7#diff-0329923df475cd6cf19e93ae2291b5dc