一、核心代码:
SerialPort serialPort = new SerialPort("COM1",9600,0, 8, (StopBits)1);
Encoding gb = System.Text.Encoding.GetEncoding("gb2312");
byte[] bytes = gb.GetBytes(“串口中文数据123”);
serialPort.Open();
serialPort.Write(bytes, 0, bytes.Length);
serialPort.Close();
1
2
3
4
5
6
二、实现效果:
在文本框写入数据,点击打印即可发送到对应的串口。
三、步骤:
新建一个窗体程序
然后从工具箱拖入一个按钮
改名为发送(后面又改成了打印,无伤大雅)
然后我们双击发送按钮,进入代码,红框中的函数就是点击事件,我们直接在这里面写发送逻辑
先在顶部引用System.IO.Ports,这样才可以使用SerialPort类:
using System.IO.Ports;
1
然后使用SerialPort操作串口,注意SerialPort有多个初始化函数(输入SerialPort,右键SerialPort-转到定义),如下:
public SerialPort();
public SerialPort(IContainer container);
public SerialPort(string portName);
public SerialPort(string portName, int baudRate);
public SerialPort(string portName, int baudRate, Parity parity);
public SerialPort(string portName, int baudRate, Parity parity, int dataBits);
public SerialPort(string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits);
1
2
3
4
5
6
7
8
9
10
11
12
13
为了简单点,我们直接选择最后一个,把串口名称波特率什么的直接定义好
SerialPort serialPort = new SerialPort("COM1",9600,0, 8, (StopBits)1);
1
其中参数Parity parity可以在定义中看一下(在SerialPort构造函数中找到最后一个构造函数,然后右键Parity转到定义)
我们常见的设置9600,n,8,1中,n是校验位,8是数据位,1是停止位
这里的0就是n
然后注意最后一个停止位用了强制类型转换
如果直接设置成1会报错
看一下定义,1代表一个停止位
这里会报错可能是把1当做一个有符号的整数,而函数中要求的是无符号的,之前的Parity参数也是,不过是因为使用0,0没有符号所以不会报错,
但是如果需要校验位,则也要加上强制类型转换,如下:
SerialPort serialPort = new SerialPort("COM1", 9600, (Parity)1, 8, (StopBits)1);
1
然后写一下发送的逻辑,这里希望可以发送一段中文到串口助手
Encoding gb = System.Text.Encoding.GetEncoding("gb2312");
byte[] bytes = gb.GetBytes(“串口中文数据123”);
serialPort.Open();
serialPort.Write(bytes, 0, bytes.Length);
serialPort.Close();
1
2
3
4
5
6
这里先准备一段数据,然后转成gb2312格式的字节数组,再打开串口,发送,然后关闭。
注意这种简单粗暴的写法程序毫无鲁棒性,它不会检测串口被其他占用了以后怎么办,会直接崩溃,所以后续要优化一下,现在先简单用。
我们可以先用虚拟串口工具VSPD虚拟两个串口连接起来
然后打开串口调试助手,连接上COM2
在点击左上角的绿三角运行一下我们的程序
点击发送,即可在串口助手中看到收到的数据。
然后我们停止掉程序,来写一个可以选择串口和波特率的程序。
把原来的程序窗口拉大一点,然后添加文本框,用于显示打印指令
这时候我们要设置文本框的多行指令
然后拖动即可,也可以通过
实现
然后放一个串口名和波特率的选项,其他的校验位、停止位之类的用n,8,1默认不管了
然后我们初始化一下数据,首先是ComboBox的数据初始化,比较简单的是波特率的下拉,只要自定义好数据就行,先看一下这个控件的名称
然后把数据加载进去,我们在窗口初始化的时候来写入数据,在窗口空白处双击
进入窗口初始话函数,然后添加两个常用的波特率
comboBox2.Items.Add("9600");
comboBox2.Items.Add("115200");
1
2
可以试运行一下,
然后串口号也是如法炮制,直接自己写入
private void Form1_Load(object sender, EventArgs e)
{
comboBox2.Items.Add("9600");
comboBox2.Items.Add("115200");
comboBox1.Items.Add("COM1");
comboBox1.Items.Add("COM2");
comboBox1.Items.Add("COM3");
comboBox1.Items.Add("COM4");
comboBox1.Items.Add("COM5");
}
1
2
3
4
5
6
7
8
9
10
11
12
然后我们先在之前的输入框中默认输入一些信息,免得因为空数据而出现问题!(下面最后一个设置的是COM1)
然后在初始化的地方获取这两个控件当前的值,注意第二个波特率要转成int32类型,然后gb.GetBytes函数的参数改成我们文本框的文字textBox1.Text
private void button1_Click(object sender, EventArgs e)
{
//现在下拉框里面的参数字符
String nowComboBoxPortNameString = comboBox1.Text;
int nowComboBoxbaudRateInt = Convert.ToInt32(comboBox2.Text);
SerialPort serialPort = new SerialPort(nowComboBoxPortNameString,
nowComboBoxbaudRateInt, (Parity)0, 8, (StopBits)1);
Encoding gb = System.Text.Encoding.GetEncoding("gb2312");
byte[] bytes = gb.GetBytes(textBox1.Text);
serialPort.Open();
serialPort.Write(bytes, 0, bytes.Length);
serialPort.Close();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
这样运行的时候可以选择自己想要的波特率或者串口名称而不用到代码去修改了。
然后我们再做一个根据现有串口自动检测的方式,避免连接空串口
我们把Form1_Load函数体内进行如下修改
private void Form1_Load(object sender, EventArgs e)
{
comboBox2.Items.Add("9600");
comboBox2.Items.Add("115200");
foreach (String portName in SerialPort.GetPortNames()) {
comboBox1.Items.Add(portName);
}
}
1
2
3
4
5
6
7
8
9
通过轮询的方式把每个获取到的串口写入combo1,运行效果如下(稍微改了布局)
————————————————
版权声明:本文为CSDN博主「百分之50」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/bfz_50/article/details/90267500