C# 串口类封装(串口通讯)RS232 示例代码分享

 本文是对于串口通讯,普通串口RS232串口通讯分享。

通常电脑可以使用USB转TTL模块进行测试,只需两个USB转TTL模块,将两个模块的TX(输出端)和RX(输入端)交叉接入,在电脑上打开两个串口,就可以互相测试了。此部分如有不懂后期会出详细介绍。

头文件引用

using System.IO.Ports;

主要代码:

此代码为个人封装自用的串口类,可互相借鉴学习交流,不完善地方还有很多,主要用于学习目的。

using System;
using System.Collections.Generic;
using System.Data;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DataCollectionSystem_attach
{
    class Port
    {
        //信息委托
        public delegate void TcpCommunicationData(string value);
        public event TcpCommunicationData CommunicationTexts;

        public delegate void TcpCommunicationData_buff(byte[] value);
        public event TcpCommunicationData_buff CommunicationTexts_buff;


        public SerialPort serialPort = new SerialPort();

        /// <summary>
        /// 自动获取串口的端口号
        /// </summary>
        /// <returns></returns>
        public DataTable GetComList(DataTable Port_DataTable)
        {
            Port_DataTable.Columns.Add("PortName", typeof(string));
            string[] names = SerialPort.GetPortNames();
            Port_DataTable.Clear();

            for (int i = 0; i < names.Length; i++)
            {
                DataRow dr = Port_DataTable.NewRow();
                dr["PortName"] = names[i];
                Port_DataTable.Rows.Add(dr);
            }
            return Port_DataTable;
        }


        /// <summary>
        /// 判断DataTable中  是否存在该数据
        /// </summary>
        /// <param name="Port_DataTable"></param>
        /// <param name="name"></param>
        /// <returns>true 为存在   false 为不存在</returns>
        public bool ifDataTable_exist(DataTable Port_DataTable, string name)
        {
            bool ifData = false;
            foreach (DataRow dr in Port_DataTable.Rows)
            {
                if (dr["PortName"].ToString() == name)
                {
                    ifData = true;
                }
            }
            return ifData;
        }

        /// <summary>
        /// 判断串口是否打开
        /// </summary>
        /// <param name="serialPort"></param>
        /// <returns></returns>
        public bool IfProtNoAndOff()
        {
            return serialPort.IsOpen;
        }

        /// <summary>
        /// 打开串口
        /// </summary>
        /// <param name="serialPort"></param>
        /// <param name="name"></param>
        /// <returns>成功返回true</returns>
        public bool opencom(string name, int Baud, Parity parO = System.IO.Ports.Parity.None)
        {
            try
            {
                //波特率
                serialPort.BaudRate = Baud;
                //数据位
                serialPort.DataBits = 8;
                serialPort.PortName = name;
                //1个停止位
                serialPort.StopBits = System.IO.Ports.StopBits.One;
                //无奇偶校验位
                serialPort.Parity = parO;
                serialPort.ReadTimeout = 100;
                serialPort.Open();
                if (!serialPort.IsOpen)
                {
                    MessageBox.Show("端口打开失败");
                    return false;
                }
                else
                {
                    serialPort.DataReceived += serialPort_DataReceived;
                    return true;
                }

            }
            catch (Exception ex)
            {
                serialPort.Dispose();
                return false;
            }
        }

        /// <summary>
        /// 串口发送
        /// </summary>
        /// <param name="Data">数据</param>
        public bool SendPort_Hex(string Data)
        {
            // 向串口写数据,并返回是否写入成功的结果
            try
            {
                if (serialPort.IsOpen)
                {
                    string[] hexValuesSplit = Data.Split(' ');
                    byte[] bytes = new byte[hexValuesSplit.Length];
                    for (int i = 0; i < hexValuesSplit.Length; i++)
                    {
                        bytes[i] = Convert.ToByte(hexValuesSplit[i], 16);
                    }
                    serialPort.Write(bytes, 0, bytes.Length);
                    Thread.Sleep(10);
                    return true;
                }
                else
                {
                    //串口未打开
                    return false;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message); // 输出错误信息
                return false;
            }

        }

        /// <summary>
        /// 串口发送
        /// </summary>
        /// <param name="Data">数据</param>
        public bool SendPort(string Data)
        {
            // 向串口写数据,并返回是否写入成功的结果
            try
            {
                if (serialPort.IsOpen)
                {
                    serialPort.Write(Data);
                    Thread.Sleep(10);
                    return true;
                }
                else
                {
                    //串口未打开
                    return false;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message); // 输出错误信息
                return false;
            }

        }


        /// <summary>
        /// 接受串口数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            ((SerialPort)sender).PortName.ToString();
            Thread.Sleep(50);  //(毫秒)等待一定时间,确保数据的完整性 int len        
            int len = serialPort.BytesToRead;
            string receivedata = string.Empty;
            if (len != 0)
            {
                byte[] buff = new byte[len];
                serialPort.Read(buff, 0, len);
                receivedata = Encoding.Default.GetString(buff);

                CommunicationTexts?.Invoke(receivedata);
                CommunicationTexts_buff?.Invoke(buff);


            }
            //richTextBox1.AppendText(receivedata + "\r\n");
        }

        /// <summary>
        /// 断开串口
        /// </summary>
        /// <param name="serialPort"></param>
        public void Port_Disconnect()
        {
            // 关闭串口,并返回是否关闭成功的结果
            try
            {
                if (serialPort.IsOpen) // 如果串口已打开
                {
                    serialPort.Close(); // 关闭串口
                    serialPort.Dispose();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message); // 输出错误信息
            }
        }

    }
}

有不完善地方、及不清楚位置,望批评改正。互相交流学习!

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在C#中完成RS232串口通讯,你可以使用System.IO.Ports命名空间提供的SerialPort。下面是一个简单的示例代码,演示了如何设置串口参数、打开串口、发送和接收数据: ```csharp using System; using System.IO.Ports; class Program { static void Main(string[] args) { // 创建一个新的SerialPort对象 SerialPort serialPort = new SerialPort(); // 设置串口参数 serialPort.PortName = "COM1"; // 设置串口号 serialPort.BaudRate = 9600; // 设置波特率 serialPort.Parity = Parity.None; // 设置校验位 serialPort.DataBits = 8; // 设置数据位 serialPort.StopBits = StopBits.One; // 设置停止位 // 添加数据接收事件处理程序 serialPort.DataReceived += SerialPort_DataReceived; try { // 打开串口 serialPort.Open(); // 发送数据 serialPort.WriteLine("Hello, World!"); // 等待一段时间以确保接收到足够的数据 System.Threading.Thread.Sleep(1000); // 关闭串口 serialPort.Close(); } catch (Exception ex) { Console.WriteLine("发生异常:" + ex.Message); } Console.ReadLine(); } static void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { // 从串口读取接收到的数据 SerialPort serialPort = (SerialPort)sender; string data = serialPort.ReadExisting(); Console.WriteLine("接收到数据:" + data); } } ``` 请根据你的实际需求修改串口参数和数据处理逻辑。此示例只是一个基本的起点,你可能需要根据你的具体应用场景进行进一步的开发和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值