1.添加定时器1s更新一次串口号
//定时器
private void timer1_Tick(object sender, EventArgs e)
{
Updata_Serialport_Name(comboBox1);
}
总结:间隔1000ms产生一次定时器中断事件,在中断事件中调用用户自定义的更新串口号函数,来实现串口号的动态更新。
2.将打开串口和关闭串口在一个按钮上实现
private void button5_Click(object sender, EventArgs e)
{
//当前是串口设备是关闭状态
if (button5.Text == "打开串口")
{
//try和catch是C#中特有的,用来进行错误处理的语句。出错了就跳至catch部分补救处理。如果没有catch,一旦出错程序就崩掉了。
//try 是尝试部分,如果尝试过程中出现问题,进入 catch部分,执行错误处理代码
try
{
//将串口设备的串口号属性设置为 comboBox1复选框中选择的串口号
serialPort1.PortName = comboBox1.Text;
//将串口设备的波特率属性设置为 comboBox2复选框中选择的波特率
//Convert.ToInt32(comboBox2.Text); 意思是将comboBox2中选中的波特率字符串,转化为int 32位的数值数据。
serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text);
//打开串口,如果打开了继续向下执行,如果失败了,跳转至catch部分
serialPort1.Open();
//打开串口后,让串口和波特率两个组合框发灰,变成不可操作状态
//串口已经打开了,将comboBox1设置为不可操作
comboBox1.Enabled = false;
//串口已经打开了,将comboBox2设置为不可操作
comboBox2.Enabled = false;
//将串口开关按键的颜色,改为红色
button5.BackColor = Color.Red;
//将串口开关按键的文字改为 “关闭串口”
button5.Text = "关闭串口";
}
catch
{
//弹出错误对话框
MessageBox.Show("打开串口失败,请检查串口", "错误");
}
}
//如果当前串口设备是打开状态
else
{
try
{
//关闭串口
serialPort1.Close();
//关闭串口后,让串口和波特率变成不可操作状态
//串口已经关闭了,将comboBox1设置为可操作
comboBox1.Enabled = true;
//串口已经关闭了,将comboBox2设置为可操作
comboBox2.Enabled = true;
//将串口开关按键的颜色,改为青绿色
button5.BackColor = Color.LightBlue;
//将串口开关按键的文字改为 “打开串口”
button5.Text = "打开串口";
}
catch
{
//弹出错误对话框
MessageBox.Show("关闭串口失败,请检查串口", "错误");
}
}
}
2.1关闭串口
2.2打开串口
3.串口发送按钮
1.serialPort1.Write(str, 0, 1); 是向串口发送缓冲区中写数据,第一位是待写入数组名,第二位是数组起始位置,第三位是数据长度。
2.textBox1.Text.Substring(i, 1);是字符串截取函数,截取完后形成一个子字符串,第一位是首字符地址,第二位是字符串长度。
3.串口发送函数分为按数值方式,和按字符方式。需要根据单选按钮控件的按下状态来决定。
4.数值发送方式写的有点复杂,目的是要从字符串中,两两抠出16进制数据,如0x46,但同时又要考虑空格作为分隔符的存在。虽然代码复杂了,但是相对用户来说,就没有了输入格式要求,随心所欲的输都可以。
/*发送按键按下调用*/
private void button1_Click(object sender, EventArgs e)
{
if (serialPort1.IsOpen) //如果串口设备已经打开了
{
if (radioButton2.Checked) //如果是以字符的形式发送数据
{
char[] str = new char[1]; //定义一个字符数组,只有一位
try
{
for (int i = 0; i < textBox1.Text.Length; i++)
{
str[0] = Convert.ToChar(textBox1.Text.Substring(i, 1)); //取待发送文本框中的第i个字符
serialPort1.Write(str, 0, 1); //写入串口设备进行发送
}
}
catch
{
MessageBox.Show("串口字符写入错误!", "错误"); //弹出发送错误对话框
serialPort1.Close(); //关闭串口
button2.BackColor = Color.Lime; //将串口开关按键的颜色,改为青绿色
button2.Text = "打开串口"; //将串口开关按键的文字改为 “打开串口”
}
}
else //如果以数值的形式发送
{
byte[] Data = new byte[1]; //定义一个byte类型数据,相当于单片机中的 unsigned char 类型
int flag = 0; //定义一个标志,标志这是第几位
try
{
for (int i = 0; i < textBox1.Text.Length; i++)
{
if (textBox1.Text.Substring(i, 1) == " " && flag == 0) //如果是第一位,并且为空字符
{
continue;
}
if (textBox1.Text.Substring(i, 1) != " " && flag == 0) //如果是第一位,但不为空字符
{
flag = 1; //标志转到第二位数据去
if (i == textBox1.Text.Length - 1) //如果这是文本框字符串的最后一个字符
{
Data[0] = Convert.ToByte(textBox1.Text.Substring(i, 1), 16); //转化为byte类型数据,以16进制显示
serialPort1.Write(Data, 0, 1); //通过串口发送
flag = 0; //标志回到第一位数据去
}
continue;
}
else if (textBox1.Text.Substring(i, 1) == " " && flag == 1) //如果是第二位 ,且第二位字符为空
{
Data[0] = Convert.ToByte(textBox1.Text.Substring(i - 1, 1), 16); //只将第一位字符转化为byte类型数据,以十六进制显示
serialPort1.Write(Data, 0, 1); //通过串口发送
flag = 0; //标志回到第一位数据去
continue;
}
else if (textBox1.Text.Substring(i, 1) != " " && flag == 1) //如果是第二位字符,且第一位字符不为空
{
Data[0] = Convert.ToByte(textBox1.Text.Substring(i - 1, 2), 16); //将第一,二位字符转化为byte类型数据,以十六进制显示
serialPort1.Write(Data, 0, 1); //通过串口发送
flag = 0; //标志回到第一位数据去
continue;
}
}
}
catch
{
MessageBox.Show("串口数值写入错误!", "错误");
serialPort1.Close();
button2.BackColor = Color.Lime; //将串口开关按键的颜色,改为青绿色
button2.Text = "打开串口"; //将串口开关按键的文字改为 “打开串口”
}
}
}
}
4.串口接收数据
串口接收数据时,会调用串口接收到数据的事件函数。
串口接收数据函数双击图标并不会进行函数的创建。
需要用如下方法或者自己手动创建。
4.1 选中serialPort1控件
4.2 右边属性中,选择DataReceived。对于Port_DataReceived是自己命名的一个函数名。
4.3 双击DataREceived 属性栏,创建对应的串口接收函数。
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (radioButton4.Checked) //如果以字符串形式读取
{
string str = serialPort1.ReadExisting(); //读取串口接收缓冲区字符串
textBox2.AppendText(str + ""); //在接收文本框中进行显示
}
else //以数值形式读取
{
int length = serialPort1.BytesToRead; // 读取串口接收缓冲区字节数
byte[] data = new byte[length]; //定义相同字节的数组
serialPort1.Read(data, 0, length); //串口读取缓冲区数据到数组中
for (int i = 0; i < length; i++)
{
string str = Convert.ToString(data[i], 16).ToUpper(); //将数据转换为字符串格式
textBox2.AppendText("0X" + (str.Length == 1 ? "0" + str + " " : str + " ")); //添加到串口接收文本框中
}
}
}
5.验证
往期链接:
1: C#上位机(串口工具).
2: C#上位机(简单实现串口发送).
3: C#上位机(定时器计数).
4: c# 上位机(VS2013新建一个例程).