C#串口通信-----------解析串口发来数据

首先我们得先知道串口发来的数据是什么样子的:

例如:

55 AA 02 04 01 02 03 04 05 0F

我们看一下上面的例子

        数据头: 55 AA 02

        有效数据位:04        有效数据位的意思是,从这个字符往后数多少位。是他的有效数据

        代表数值:01 02 03 04 05

        代表校验码:0F

 

首先我们需要准备一个串口对象

// 我们需要有一个串口
    SerialPort ser = new SerIalPort();
// 设置端口基本信息
    PortName = "COM2";  
    BaudRate = 57600;
    DataBits = 8;
    Handshake = Handshake.None;
    StopBits = StopBits.One;
    ReadTimeout = -1;
    ser.DtrEnable = true;
    ser.Parity = Parity.None;
// 打开串口端口
    ser.open(); // 这里只做一个比较   该有try/catch还是要加上


 

给串口发送信息,接下来。串口会给上位机发送一些指令

public int sendMsg(String str){
    // 判断一下端口是否被关闭
    if (!ser.IsOpen) {    
        return 0; // 代表端口已被开启
    }

    // 去除传输来的String字符串
    str = str.Replace(" ", "");

    // 保证字符串能够整除2    
    if(str.Length % 2 != 0) {
        str += " ";
    }
    
    // 准备数组
    byte[] value = new byte[str.Length / 2];

    // 为数组赋值
    for (int i = 0; i < value.Length; i++){
        value[i] = Convert.ToByte(str.Substring(i * 2, 2).Replace(" ", ""),16);
    }

    // 发送数据
    ser.Write(value, 0, value.Length);
    
    return 1;
}


发送完命令以后。串口设备会给上位机发送一连串的他的命令

// 在接收数据之前。我们需要绑定串口读取事件
// 例如我在load事件中接收
private void Form1_Load(object sender, EventArgs e){
    // 刚刚在上面定义了一个打开端口的方法
    this.openPort(); // 假设他开启成功
    
    ser.DataReceived += GetData;  // 在后面生成一个接收事件方法
    
}

// 准备一个队列(作为缓冲数据)
Queue<byte> resultBytes = new Queue<byte>();

// 接收事件方法
private void GetData(object sender, SerialDataReceivedEventArgs e){
    // 读取他准备接收的条目数
    byte[] result = new byte[ser.BytesToRead];
    
    // 开始读取数据
    ser.Read(result, 0, result.Length);

    // 把数据存入队列
    for (int i = 0; i < result.Length; i++){
        resultBytes.Enqueue(result[i]);
    }

    // 解析步骤
    while(resultBytes.Count >= 10){   // 这里的10.意思是你接收到的完整数据
    
    // 开始解析数据头
        if(resultBytes.Dequeue() == 0x55
            && resultBytes.Dequeue() == 0xAA
            && resultBytes.Dequeue() == 0x02){
            
            // 最后的结果
            byte[] resultArray = new byte[resultBytes.Dequeue()];

            for(int i = 0 ; i < resultArray.Length;i++){
                // 没拿到一个数据就存入结果集中
                resultArray[i] = resultBytes.Dequeue();
            }

        
            // 数据读取完了。 ResultArray就是最后的值集合
        }  
    }
}

本人小菜。本篇博客只是作为个人记录。。如果对各位有帮助。那最好。。。如果无用。轻喷。谢谢

  • 9
    点赞
  • 6
    评论
  • 65
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值