c#串口通信(控制台程序)

本文介绍的是利用控制台进行串口通信,网上有很多的文章都是使用winform来介绍串口通信,有些文章并没有给出winform的UI界面,这需要我们去猜那个控件对于的代码了,这相当于费脑子。这是基于这个原因,我利用控制台程序讲解串口通信的大概流程,有什么不对的地方,请多多指教。

 

由于我在同一台PC机上测试并且我手头上没有串口线,不然我可以利用COM线把PC机上的COM1口和COM2口接起来的,没办法,故在编程之前,需要做的工作是,把PC机的COM1口2号引脚和3号引脚短接起来,用小铁丝短接即可,放心,不会电死人的,我试过了。

 

由于一台PC机上的一个COM口只能绑定一个SerialPort类,故发送数据和接收数据的方法都封装在一个类中,废话少说,直接上完整的代码。

using System;
using System.Collections.Generic;
using System.IO.Ports;              //需要引入的命名空间
using System.Text;
using System.Data;
using System.Xml;


namespace 串口通信发送和接收端
{
    class Program
    {
        static void Main(string[] args)
        {
            SerialPortTest port = new SerialPortTest();
            port.Send();    //发送数据
            port.Close();   //关闭COM口
        }
       
    }


    public class SerialPortTest {
        SerialPort port;
        public SerialPortTest() {
            //指定COM1口,根据情况也可以指定COM2口
            port = new SerialPort("COM1");
            //指定波特率
            port.BaudRate = 9600;      
            try
            {
                //打开COM口
                port.Open();
                //接收数据
                Receieve();
            }
            catch (Exception)
            {

                Console.WriteLine("打开COM口失败");
            } 
        }

        //接收数据
        private void Receieve() {
            //接收到数据就会触发port_DataReceived方法
            port.DataReceived += port_DataReceived;
        }

        void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            //存储接收的字符串
            string strReceive = string.Empty;
            if (port != null)
            {
                //读取接收到的字节长度
                int n = port.BytesToRead;
                //定义字节存储器数组
                byte[] byteReceive = new byte[n];
                //接收的字节存入字节存储器数组
                port.Read(byteReceive, 0, n);
                //把接收的的字节数组转成字符串
                strReceive = Encoding.UTF8.GetString(byteReceive);
                Console.WriteLine("接收到的数据是: " + strReceive);
            }
        }

        //发送数据
        public void Send() {
            //从控制台获取输入的字符串
            Console.WriteLine("请输入字符串:");
            string strRead = Console.ReadLine();
            //当输入不是q时,就一直等到输入并发送
            while (strRead != "q")
            {
                //去掉输入字符串的前后空格
                strRead = strRead.Trim();
                if (!strRead.Equals(""))
                {
                    //串口发送数据
                    port.WriteLine(strRead);
                }
                Console.WriteLine("请输入字符串:");
                strRead = Console.ReadLine();
            }

        }
        //关闭COM口
        public void Close() { 
            if(port!=null&&port.IsOpen){
                port.Close();
                port.Dispose();
            }
        }

    }
}

 其实最重要的是SerialPort类,先取得实例对象,然后指定要使用哪个COM口和通信的波特率,接着打开COM口,这时紧接着调用接收数据的方法,等待数据发来;再接着调用发送数据的方法,最后关闭COM口和释放资源。

 

 

运行效果图如下:

但是,如果发送的字符串过于长,方法void port_DataReceived(object sender, SerialDataReceivedEventArgs e)会自动调用多次,如下图:

看到了吗?第三次发的是zhangxiangyu,但接收到的方法void port_DataReceived(object sender, SerialDataReceivedEventArgs e)自动调用两次,那么接收端如何获取完整的字符串呢?可以使用字符串拼接。

 

好了,这就完成了,会的大牛勿喷!!!

 

待补充:

不单可以发送和接收字符串类型的数据,也可以发送和接收16进账的数据,有空再补充