liao6 发表于 2025-9-17 13:55

【每周分享】C# 多窗体共用一个串口及数据CRC校验

#申请原创#
@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

二、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;
                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;
            crc16 = (byte)((crc >> 8) & 0xff);
            crc16 = (byte)(crc & 0xff);
            return crc16;
      }
    }
页: [1]
查看完整版本: 【每周分享】C# 多窗体共用一个串口及数据CRC校验