[麦麦茶水间] 【每周分享】C# 多窗体共用一个串口及数据CRC校验

[复制链接]
387|0
liao6 发表于 2025-9-17 13:55 | 显示全部楼层 |阅读模式
#申请原创#
@21小跑堂


一、多窗体共用一个串口如何实现?
两种方法可以实现:
1.定义一个静态SerialPort1对象,初始化串口参数,不要用自带的SerialPort控件;
2.把串口定义为一个类,其他窗体就可以直接调用。
第一种方法实现如下:
1.1 定义一个静态SerialPort1对象
        public static SerialPort SerialPort1 = new SerialPort();
1.2 初始化串口参数,注册串口接收事件
  

  

1.3 其他窗体调用
        //串口发送
        MainForm.SerialPort1.Write(sendReadFaultCmd, 0, sendReadFaultCmd.Length);

        //串口接收,可直接通过主窗体类名调用
        MainForm.readData.Length
        MainForm.readData[0]

二、CRC校验软件算法

        CRC校验算法封装到一个类,软件实现方法如下:
      public class CrcCheck
    {
        public static byte CRC8(byte[] buffer)
        {
            byte crc = 0;
            for (int j = 1; j <= buffer.Length-3; j++)
            {
                crc ^= buffer[j];
                for (int i = 0; i < 8; i++)
                {
                    if ((crc & 0x01) != 0)
                    {
                        crc >>= 1;
                        crc ^= 0x8c;
                    }
                    else
                    {
                        crc >>= 1;
                    }
                }
            }
            return crc;
        }
        /// <summary>
        /// 字节0是低八位,字节1是高八位
        /// </summary>
        /// <param name="buffer"></param>
        /// <returns></returns>
        public static byte[] CRC16(byte[] data)
        {
            int crc = 0xffff;
            for (int i = 0; i < data.Length-2; i++)
            {
                crc = crc ^ data;
                for (int j = 0; j < 8; j++)
                {
                    int temp = 0;
                    temp = crc & 1;
                    crc = crc >> 1;
                    crc = crc & 0x7fff;
                    if (temp == 1)
                    {
                        crc = crc ^ 0xa001;
                    }
                    crc = crc & 0xffff;
                }
            }
            //CRC寄存器高低位互换
            byte[] crc16 = new byte[2];
            crc16[1] = (byte)((crc >> 8) & 0xff);
            crc16[0] = (byte)(crc & 0xff);
            return crc16;
        }
    }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

51

主题

125

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部