串口通信类的编写

class SerialPortComm
    {
        static SerialPort serialPort;

        public static void SetupSerialPort()
        {
            serialPort = new SerialPort("COM10");
            // 设定波特率 
            serialPort.BaudRate = 9600;
            serialPort.DataBits = 8;
            serialPort.StopBits = StopBits.One;
            serialPort.Parity = Parity.None;
            serialPort.Handshake = Handshake.RequestToSend;
            serialPort.ReadTimeout = 3000; // 读超时设置
            serialPort.WriteTimeout = 3000; // 写超时设置
            serialPort.Open();
        }

        public static void SendAndReceiveData()
        {
            try
            {
                // 良好习惯性清空缓冲区
                serialPort.DiscardInBuffer();
                serialPort.DiscardOutBuffer();
                string toSend = "Hello;";
                serialPort.Write(toSend);
                // 接收数据
                string receivedData = ReadData(';');
                System.Windows.Forms.MessageBox.Show("接收数据:" + receivedData);
            }
            catch (TimeoutException ex)
            {
                System.Windows.Forms.MessageBox.Show("超时异常:" + ex.Message);
            }
            catch (System.IO.IOException ioe)
            {
                Console.WriteLine("IO 异常: " + ioe.Message);
            }
            finally
            {
                //关闭串口
                serialPort.Close();
            }
        }

        // 读取数据,直到遇到特定的终止符
        public static string ReadData(char delimiter)
        {
            string incomingData = "";
            char ch;
            while ((ch = (char)serialPort.ReadChar()) != delimiter)
            {
                incomingData += ch;
            }
            return incomingData;
        }

        // 多线程处理例子
        //并发处理:这使得主线程能够继续执行而不被阻塞,
        //从而实现并发执行。在串口通信场景中,特别是需要持续监听串口数据的情况下,
        //通过将接收数据的逻辑放在一个后台线程上执行,可以避免阻塞主线程的工作。
        public static void StartListening()
        {
            Thread readThread = new Thread(new ThreadStart(SendAndReceiveData));
            readThread.Start();
        }

        // 主函数
        static void Main()
        {
            SetupSerialPort();
            StartListening();
            //心跳
            Timer heartBeatTimer = new Timer(SendHeartBeat, null, 0, 3000);
            Thread.Sleep(Timeout.Infinite); // 防止主线程退出
        }

        public static void SendHeartBeat(Object stateInfo)
        {
            if (serialPort.IsOpen)
            {
                serialPort.WriteLine("HeartBeat");
            }
        }
    }

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值