C# 串口与窗体应用程序的连接

时间:2022-08-31 07:40:15

这几天又被安排看了几天的书,,,,,真是乏味啊。。。。所以当boss说要我试试自己创建一个窗体应用程序,实现与串口的连接的时候,整个人就跟打了鸡血一样,兴趣和动力立马就上来了啊。

好吧,废话不多说,直接切入正题。

第一部分  设计窗体

不多说,直接设计成下面这个样子就行了,用的控件有GroupBox、button、TextBox(TextBox的MultiLine属性设置成了true,表示自动换行)。

C# 串口与窗体应用程序的连接

(相关链接:设置端口的方法

                     既然关系到串口,这里我们要做的,就是要有串口才行嘛,我们可以直接使用软件生成串口模拟操作,下面提供地址:

                     度网盘下载地址:链接: 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;
        }
    }        
}
 然后运行,无错。。

收工领盒饭去了。。。