一、硬件连接方案
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℃
}
}
四、数据解析流程
报文结构分析(以DS18B20为例)
[0xAA][0x03][0x00][0x00][0x00][0x02][CRC低][CRC高]- 0xAA:起始符
- 0x03:读取指令
- 0x0000:起始地址
- 0x0002:读取2字节
- CRC:循环冗余校验
校验算法实现
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]; }
五、工程优化建议
异常处理
try { _serialPort.Open(); } catch (IOException ex) { Debug.WriteLine($"串口被占用: {ex.Message}"); }数据缓存优化
private StringBuilder _buffer = new(); private void SerialPort_DataReceived(...) { _buffer.Append(Encoding.ASCII.GetString(buffer)); if (_buffer.Contains("\r\n")) { ProcessLine(_buffer.ToString()); _buffer.Clear(); } }多传感器支持
public class MultiSensorManager { private Dictionary<byte, float> _temperatures = new(); public void Update(byte slaveId, float temp) { lock(_temperatures) { _temperatures[slaveId] = temp; } } }
六、调试技巧
报文捕获 使用串口监控精灵捕获原始数据 分析正常/异常报文差异
数据验证
// 模拟测试数据 byte[] testData = new byte[] { 0xAA,0x03,0x00,0x00,0x00,0x02,0x2C,0x0A}; Debug.Assert(VerifyCRC(testData), "CRC校验失败");性能监控
PerformanceCounter pc = new PerformanceCounter("Processor", "% Processor Time"); pc.InstanceName = "_Total"; Console.WriteLine($"CPU占用率:{pc.NextValue()}%");
七、扩展功能实现
实时曲线绘制
using LiveCharts; public partial class MainForm : Form { private ChartValues<float> _temperatureSeries = new(); public MainForm() { InitializeComponent(); chart.Series = new SeriesCollection { new LineSeries { Values = _temperatureSeries } }; } }报警功能
public class TemperatureAlert { public event EventHandler<AlertEventArgs> OverLimit; public void Check(float temp) { if(temp > 80) { OverLimit?.Invoke(this, new AlertEventArgs("高温报警!")); } } }
参考代码 串口调试工具(读取温度值) www.youwenfan.com/contentalg/92793.html
该方案支持DS18B20、DHT11、SHT3x等多种传感器,可通过修改指令格式适配不同设备。建议结合Modbus Poll工具进行协议验证,使用Wireshark抓包分析通信过程。