这几天又被安排看了几天的书,,,,,真是乏味啊。。。。所以当boss说要我试试自己创建一个窗体应用程序,实现与串口的连接的时候,整个人就跟打了鸡血一样,兴趣和动力立马就上来了啊。
好吧,废话不多说,直接切入正题。
第一部分 设计窗体
不多说,直接设计成下面这个样子就行了,用的控件有GroupBox、button、TextBox(TextBox的MultiLine属性设置成了true,表示自动换行)。
(相关链接:设置端口的方法
既然关系到串口,这里我们要做的,就是要有串口才行嘛,我们可以直接使用软件生成串口模拟操作,下面提供地址:
度网盘下载地址:链接: http://pan.baidu.com/s/1jHpfyjs 密码: kfhe
安装后将压缩包里面 .dll格式的文件拷贝替换到安装目录下,打开软件即可生成端口。
)
第二部分 代码实现
using System.IO.Ports; namespace WindowsFormsApplication8 { public partial class Form1 : Form { //Send SerialPort comm = new SerialPort();//新增串口 //Read SerialPort comm2 = new SerialPort();//新增串口 StringBuilder builder = new StringBuilder();//新增缓存变量 string Buffer_rev = " ";//接收串口的缓存 public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { comm.PortName = "Com" + "1";//设置端口 comm.BaudRate = 9600;//设置波特率 comm2.PortName = "Com" + "2";//设置端口 comm2.BaudRate = 9600;//设置波特率 comm.Open(); comm2.Open(); comm2.DataReceived += comm2_DataReceived; } void comm2_DataReceived(object sender, SerialDataReceivedEventArgs e) { if (comm2 == null || comm2.IsOpen == false) return; if (builder.Length > 100)//假设接收的内容长度不能超过100个字符 { builder = new StringBuilder();//超出100个字符就清空 } int n = comm2.BytesToRead;//记录缓存数量 byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据 comm2.Read(buf, 0, n);//读取缓冲数据(读取buf数组中从0开始的n个字符) foreach (byte item in buf)//遍历 { builder.Append((char)item);//拼接字符串 } //Invoke()的作用是:在应用程序的主线程上执行指定的委托。 //一般应用:在辅助线程中修改UI线程(主线程)中对象的属性时,调用this.Invoke(); //呵呵了。。。。shenmegui //目测通俗点讲应该就是将发送出去的数据在接收端显示出来的意思。。。 this.Invoke(new Action(() => { this.textBox1.Text = builder.ToString(); })); } private void button1_Click(object sender, EventArgs e)//发送数据 { try { string SendStr = textBox2.Text + '\r';//获取要发送的数据,并添加回车符 if (this.comm.IsOpen) this.comm.Write(SendStr);//发送数据 else MessageBox.Show("串口已关闭"); } catch (Exception ex) { } } private void textBox1_TextChanged(object sender, EventArgs e) { } private void textBox2_TextChanged(object sender, EventArgs e) { } private void button2_Click(object sender, EventArgs e)//清除 { textBox2.Text = null; } } }然后运行,无错。。
收工领盒饭去了。。。