C#上位机(串口工具优化)

1.添加定时器1s更新一次串口号

//定时器
        private void timer1_Tick(object sender, EventArgs e)
        {    
            Updata_Serialport_Name(comboBox1);
        }

总结:间隔1000ms产生一次定时器中断事件,在中断事件中调用用户自定义的更新串口号函数,来实现串口号的动态更新。

C#上位机(串口工具优化)_第1张图片
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关闭串口
C#上位机(串口工具优化)_第2张图片
2.2打开串口
C#上位机(串口工具优化)_第3张图片
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是自己命名的一个函数名。
C#上位机(串口工具优化)_第4张图片
4.3 双击DataREceived 属性栏,创建对应的串口接收函数。
C#上位机(串口工具优化)_第5张图片

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.验证
C#上位机(串口工具优化)_第6张图片
C#上位机(串口工具优化)_第7张图片
往期链接:
1: C#上位机(串口工具).
2: C#上位机(简单实现串口发送).
3: C#上位机(定时器计数).
4: c# 上位机(VS2013新建一个例程).

你可能感兴趣的:(C#上位机,c#,单片机,stm32,c++,visual,studio)