【每周分享】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]