当我们初学串口的时候往往都是手无足措,手里没有一些成型可以运行的代码的时候就会特别烦躁,接下来就让我们完成一个最基本的串口“最小系统”吧:
1.窗体部分
我们可以使用一个combobox来选择串口,一个textbox显示接受数据,一个button进行连接操作
2.代码部分:
首先我们需要知道C#中已经给我们提供了一个serial类,可以直接设置相应参数,使用起来很方便。
//代码1SerialPort com = new SerialPort(); //首先new一个串口对象
接下来就是对它的初始化了
//代码2public void SerialInitialize() {com.BaudRate = 115200; //波特率com.PortName = comboBox1.SelectedItem.ToString(); //选择串口com.DataBits = 8; //数据位com.DataReceived += Sp_DataReceived; //注册接收事件com.ReceivedBytesThreshold = 1; //接收到一个字节就触发事件com.Encoding = Encoding.Default; //设置编码,避免中文乱码com.Open();}
这里我们使用事件触发(因为C#已经给我们写好了方法所以偷个懒直接拿来用),
然后选择串口是利用了控件combobox,我们可以在初始化的时候写入这么一句:
//代码3comboBox1.Items.AddRange(System.IO.Ports.SerialPort.GetPortNames());
这样就可以获得目前可以连接的串口了(如果需要实时扫描的话可以新建线程无限循环)。
接下来就是写接收数据的事件:
//代码4private void Sp_DataReceived(object sender, SerialDataReceivedEventArgs e){while(com.BytesToRead>0)data += com.ReadExisting(); //数据读取,直到读完缓冲区数据this.Invoke((EventHandler)delegate{//定义一个textBox控件用于接收消息并显示TEST.AppendText(data + Environment.NewLine);});
这里的this.Invoke是一种跨线程用法,它可以跨线程访问我们的textbox控件,如果不用它的话就会提示你无法访问,或者你在主线程内不停刷新的话会导致整个程序未响应。
这个是跨线程访问UI的模板:
this.Invoke((EventHandler)delegate{//你要执行的操作});
3.整合
将相应代码放到对应控件中就ok了