C#串口

学习C#做简单上位机界面,简单熟悉C#控件使用方法后尝试实现串口通信,控件拖拽很方便,双击工具箱里的,双击SerialPort控件后就向窗体中添加了一个串口对象,在Form1_Load里添加如下代码

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                button1.Text = "打开串口";
                textBox2.Text = "test";
                label2.Text = "Ok";
                button1.BackColor = Color.Gray;
                string[] PortsName = SerialPort.GetPortNames(); //获取计算机串口
                    Array.Sort(PortsName);                     //有多个串口时排序
                    comboBox1.Items.AddRange(PortsName);
                    comboBox1.SelectedIndex = 0;               //默认选择列表第一个串口
                
            }
            catch(Exception ex)
            {
                MessageBox.Show("没有发现串口","错误提示");
            }
        }

 在窗体上放置一个button用作打开和关闭串口,双击窗体上的button后跳到button点击事件里,添加代码如下:

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                if (MyCom.IsOpen)
                {
                    button1.BackColor = Color.Gray;
                    button1.Text = "打开串口";
                    MyCom.Close();
                }
                else
                {
                    button1.BackColor = Color.Red;
                    button1.Text = "关闭串口";
                    MyCom.Open();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }

在串口属性值都为默认情况下,SerialPortd的最简单的主要方法就是ReadLine和WriteLine,窗体中添加一个发送按钮,click事件代码如下:

        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                MyCom.WriteLine(textBox2.Text);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return;
            }
        }

接收事件,SerialPort提供了相应的Receive事件,只需要在控件的事件栏(闪电图标)里双击DataReceived即可跳到接收事件代码处,这个操作同时也在Form1.Designer.cs里完成了串口接收事件的注册(MyCom为串口对象名称):

            // MyCom
            // 
            this.MyCom.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.MyCom_DataReceived_1);
            // 

接收代码如下:

<pre class="csharp" name="code">        private void MyCom_DataReceived(object sender, SerialDataReceivedEventArgs e)//接收数据
        {
            try
            {
                System.Threading.Thread.Sleep(100);
                int DataLength = MyCom.BytesToRead;
                byte[] buf = new byte[DataLength];
                MyCom.Read(buf, 0, DataLength);
                  RCount++;
                string str = Encoding.ASCII.GetString(buf);
                this.Invoke(new EventHandler(delegate
                {
                    richTextBox1.Text = richTextBox1.Text + str + '\n';
                    ReceiveCount.Text = Convert.ToString(RCount);
                    
                }
                    ));
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "错误提示");

            }
        }


}

读数据的ReadLine()只有当接收的数据里有换行符时才停止接收,不然程序将一直等待,而Read()方法是自己定义byte长度,不过程序里要加上让线程挂起,即代码中的sleep方法,只有sleep足够长,才能保证发送很长的内容是能完整接收,应该有其它解决办法的吧!

ReadLine()接收代码如下(发送内容里一定要有换行符):

                string Context;
                Context = MyCom.ReadLine();


 

 

程序刚开始调试时发现发送正常,但接收不到数据,在发送和接收里分别设置断点后调试,结果发现程序无法进入接收方法里,于是怀疑接收方法没注册,仔细看代码发现原来之前在类里面实例化了一个全局SerialPort对象:

SerialPort sp = new SerialPort();

但又在工具栏里双击添加了一个SerialPort对象(名称为SerialPort1),在时间栏里双击DataReceived事件后,其实是注册了SerialPort1的接收事件,自己实例化的串口对象并没有注册监听事件,手动添加注册代码:

  MyCom.DataReceived += new SerialDataReceivedEventHandler(MyCom_DataReceived);
之后便可以接收数据了。现在关于对象的概念体会还不是很深,同时对C#窗体编程中控件对象与代码的关系还没理清楚,导致这个简单错误也找了很长时间,不过现在也算实现了最简单的功能,程序还有很多问题,慢慢解决……





 

C#开发的串口,全部注释了;串行接口(串口)是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件。串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须匹配。 1. 波特率:这是一个衡量符号传输速率的参数。指的是信号被调制以后在单位时间内的变化,即单位时间内载波参数变化的次数,如每秒钟传送960个字符,而每个字符格式包含10位(1个起始位,1个停止位,8个数据位),这时的波特率为960Bd,比特率为10位*960个/秒=9600bps。 2. 数据位:这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据往往不会是8位的,标准的值是6、7和8位。标准的ASCII码是0~127(7位),扩展的ASCII码是0~255(8位)。 3. 停止位:用于表示单个包的最后几位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。 4. 校验位:在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值