基于C#实现串口调试工具读取温度值

一、硬件连接方案

1. 设备连接示意图

温度传感器(如DS18B20)  
│  
├─ DATA → STM32 GPIO(需上拉电阻)  
├─ VCC → 3.3V/5V  
└─ GND → 地

2. 串口转换模块

  • 使用MAX232或CH340芯片实现USB转TTL
  • 波特率建议:9600/115200(根据传感器手册设置)

二、串口调试工具配置

1. 推荐工具

工具名称 特点 适用场景
SSCOM 稳定支持多设备 工业级设备调试
串口调试助手V5 界面简洁,支持HEX显示 快速验证通信协议
CoolTerm 跨平台,支持数据保存 开发者日常调试

2. 参数设置示例

波特率: 9600  
数据位: 8  
停止位: 1  
校验位: None  
流控: 无

三、温度读取实现(C#)

1. 基础串口通信

using System.IO.Ports;

public class TemperatureReader {
    private SerialPort _serialPort;

    public TemperatureReader(string portName, int baudRate) {
        _serialPort = new SerialPort(portName, baudRate);
        _serialPort.DataReceived += SerialPort_DataReceived;
    }

    public void Open() {
        if (!_serialPort.IsOpen) {
            _serialPort.Open();
            SendCommand(0x03, 0x0000, 0x0002); // 发送读取温度指令
        }
    }

    private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) {
        byte[] buffer = new byte[_serialPort.BytesToRead];
        _serialPort.Read(buffer, 0, buffer.Length);
        ProcessData(buffer);
    }

    private void SendCommand(byte cmd, ushort startAddr, ushort numRegs) {
        byte[] frame = new byte[8];
        frame[0] = 0xAA; // 帧头
        frame[1] = cmd;
        frame[2] = (byte)(startAddr >> 8);
        frame[3] = (byte)startAddr;
        frame[4] = (byte)(numRegs >> 8);
        frame[5] = (byte)numRegs;
        byte crc = CalculateCRC(frame, 6);
        frame[6] = crc;
        frame[7] = (byte)(crc >> 8);
        _serialPort.Write(frame, 0, 8);
    }

    private void ProcessData(byte[] data) {
        if (data.Length < 9) return;
        if (data[0] != 0xAA) return;

        ushort rawTemp = (ushort)(data[3] << 8 | data[4]);
        float temperature = rawTemp / 16.0f; // 根据传感器规格转换
        Console.WriteLine($"温度值:{temperature:F1}℃");
    }

    private byte CalculateCRC(byte[] data, int length) {
        byte crc = 0xFF;
        for (int i = 0; i < length; i++) {
            crc ^= data[i];
            for (int j = 0; j < 8; j++) {
                crc = (crc & 0x80) != 0 ? (crc << 1) ^ 0x31 : crc << 1;
            }
        }
        return crc;
    }
}

2. Modbus协议实现(使用NModbus库)

using Modbus.Device;
using System.IO.Ports;

public class ModbusTemperature {
    private IModbusSerialMaster _master;

    public void Initialize(string portName, int baudRate) {
        SerialPort serialPort = new SerialPort(portName, baudRate);
        serialPort.Open();
        _master = ModbusSerialMaster.CreateRtu(serialPort);
    }

    public float ReadTemperature(byte slaveId) {
        ushort[] registers = _master.ReadHoldingRegisters(slaveId, 0, 2);
        ushort raw = (ushort)(registers[0] << 8 | registers[1]);
        return raw / 10.0f; // 假设传感器数据格式为×10℃
    }
}

四、数据解析流程

  1. 报文结构分析(以DS18B20为例)

    [0xAA][0x03][0x00][0x00][0x00][0x02][CRC低][CRC高]
    
    • 0xAA:起始符
    • 0x03:读取指令
    • 0x0000:起始地址
    • 0x0002:读取2字节
    • CRC:循环冗余校验
  2. 校验算法实现

    public static bool VerifyCRC(byte[] data) {
        byte crc = CalculateCRC(data, data.Length - 2);
        return crc == data[data.Length - 2] && 
               (byte)(crc >> 8) == data[data.Length - 1];
    }
    

五、工程优化建议

  1. 异常处理

    try {
        _serialPort.Open();
    } catch (IOException ex) {
        Debug.WriteLine($"串口被占用: {ex.Message}");
    }
    
  2. 数据缓存优化

    private StringBuilder _buffer = new();
    private void SerialPort_DataReceived(...) {
        _buffer.Append(Encoding.ASCII.GetString(buffer));
        if (_buffer.Contains("\r\n")) {
            ProcessLine(_buffer.ToString());
            _buffer.Clear();
        }
    }
    
  3. 多传感器支持

    public class MultiSensorManager {
        private Dictionary<byte, float> _temperatures = new();
    
        public void Update(byte slaveId, float temp) {
            lock(_temperatures) {
                _temperatures[slaveId] = temp;
            }
        }
    }
    

六、调试技巧

  1. 报文捕获 使用串口监控精灵捕获原始数据 分析正常/异常报文差异

  2. 数据验证

    // 模拟测试数据
    byte[] testData = new byte[] {0xAA,0x03,0x00,0x00,0x00,0x02,0x2C,0x0A};
    Debug.Assert(VerifyCRC(testData), "CRC校验失败");
    
  3. 性能监控

    PerformanceCounter pc = new PerformanceCounter("Processor", "% Processor Time");
    pc.InstanceName = "_Total";
    Console.WriteLine($"CPU占用率:{pc.NextValue()}%");
    

七、扩展功能实现

  1. 实时曲线绘制

    using LiveCharts;
    public partial class MainForm : Form {
        private ChartValues<float> _temperatureSeries = new();
    
        public MainForm() {
            InitializeComponent();
            chart.Series = new SeriesCollection {
                new LineSeries { Values = _temperatureSeries }
            };
        }
    }
    
  2. 报警功能

    public class TemperatureAlert {
        public event EventHandler<AlertEventArgs> OverLimit;
    
        public void Check(float temp) {
            if(temp > 80) {
                OverLimit?.Invoke(this, new AlertEventArgs("高温报警!"));
            }
        }
    }
    

参考代码 串口调试工具(读取温度值) www.youwenfan.com/contentcno/92793.html

该方案支持DS18B20、DHT11、SHT3x等多种传感器,可通过修改指令格式适配不同设备。建议结合Modbus Poll工具进行协议验证,使用Wireshark抓包分析通信过程。

posted @ 2025-12-23 16:16  chen_yig  阅读(4)  评论(0)    收藏  举报