美文网首页玩Play
C#串口通信:1协议制定

C#串口通信:1协议制定

作者: RUYES | 来源:发表于2017-07-02 12:00 被阅读184次

博主在目前在做一个上位机软件,中间用到串口上的一些东西。于是学习了一下串口的通信处理。很多不足,希望大家可以提出你们宝贵的意见。

先说要求:

  1. 通信稳定可靠。
  2. 下位机多设备集成在总线上,故通信需要区分设备号。
  3. 同一设备的有不同的指令、以及不同指令长度不一,故需要指令号区分指令。需要数据长度位以便接收。
  4. 带协议帧头。

以上

制定的协议结构如下:

  帧头(3)+设备号(1)+指令类型(2)+数据长度(2)+载荷+CRC(2)

大概如此,帧头用于判断是有效包,设备号判断下位机的设备编号,指令类型区别载荷数据的指令类型,数据长度便于挪出空间便于接收数据。CRC16校验确保传输数据的可靠。CRC校验部分为帧头之后的数据。

在此,我多说两句CRC,在此之前博主没接触过这玩意,所以CRC16校验的代码是我看着下位机的C代码改来的。直接贴上来吧,查表法。

public class Crc
{
    private static readonly byte[] _auchCRCHi = new byte[]//crc高位表
    {
      0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
      0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
      0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
      0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
      0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
      0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
      0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
      0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
      0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
      0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
      0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
      0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
      0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
      0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
      0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
      0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
      0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
      0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
      0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
      0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
      0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
      0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
      0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
      0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
      0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
      0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
    };
    private static readonly byte[] _auchCRCLo = new byte[]//crc低位表
    {
      0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
      0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
      0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
      0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
      0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
      0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
      0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
      0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
      0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
      0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
      0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
      0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
      0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
      0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
      0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
      0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
      0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
      0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
      0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
      0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
      0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
      0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
      0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
      0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
      0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
      0x43, 0x83, 0x41, 0x81, 0x80, 0x40
    };
    public static ushort CRC16(Byte[] buffer)
    {
        byte crcHi = 0xff; // 高位初始化
        byte crcLo = 0xff; // 低位初始化
        for (int i = 0; i < buffer.Length; i++)
        {
            int crcIndex = crcLo ^ buffer[i]; //查找crc表值
            crcLo = (byte)(crcHi ^ _auchCRCHi[crcIndex]);
            crcHi = _auchCRCLo[crcIndex];
        }
        return (ushort)(crcHi << 8 | crcLo);
    }
}

相关文章

  • C#串口通信:1协议制定

    博主在目前在做一个上位机软件,中间用到串口上的一些东西。于是学习了一下串口的通信处理。很多不足,希望大家可以提出你...

  • C#串口通信:3协议解析

    C#串口通信:协议解析 发送部分就是字节数组拼接,在此不多说了,主要说说上位机接收并解析协议部分。 主要上串口在接...

  • UART通信

    串口(USART)通信--串口通讯协议简介 物理层与协议层 一、物理层 1.RS232标准 ...

  • 串口通信

    1、串口通信协议。 串口是计算机上一种非常通用的设备通信协议(不要与通用串行总线Universal SerialB...

  • 关于串口格式与报文格式

    《串口硬件分类》中已经说明了几种串口的类型,并在《串口通信协议》中说明了几种串口协议形式,这里就常用的串口协议进一...

  • 字节流十六进制数据协议解析

    串口数据通信与以太网数据通信 以太网数据协议 串口数据协议 应用调用: 工具类:BytesUtils

  • 陆:串口环形缓冲(STC15WK32S4)

    1:串口作为嵌入式最常用的通信接口,用于debug、控制串口模块、实现232、485通信、modbus协议移植;2...

  • JS获取电子秤读数

    JS直接获取串口数据比较麻烦另做一个程序维护js和串口的通信 基本原理:使用websocket语言:C# 组成部分...

  • STM32 NFC 点对点通信协议

    P2P通信的具体协议 NFC通信的数据格式 串口发送数据格式 00 00 ff (命令长度+1)(0xff-命令...

  • STM32学习:USART串口通信

    一、STM32F1的USART介绍 (一)串口通信简介 串口通信(Serial Communication),是指...

网友评论

    本文标题:C#串口通信:1协议制定

    本文链接:https://www.haomeiwen.com/subject/dppncxtx.html