上一篇
如何用C高效获取串口数据并存入数据库?
- 行业动态
- 2025-05-12
- 14
C#通过System.IO.Ports类库监听串口数据,采用SerialPort对象配置波特率与端口号,接收数据后使用ADO.NET或Entity Framework解析并存储至数据库,实现硬件设备与信息系统的数据交互,需处理字节编码转换及通信异常。
硬件与通信准备
串口设备连接
- 确认设备(如传感器、PLC)通过USB/RS232与计算机连接,记录串口号(如COM3)。
- 安装对应驱动程序,确保设备管理器中显示正常。
串口参数配置
根据设备协议设置参数:SerialPort serialPort = new SerialPort { PortName = "COM3", BaudRate = 9600, // 波特率(常见值:9600/115200) Parity = Parity.None, // 校验位 DataBits = 8, // 数据位 StopBits = StopBits.One // 停止位 };
C#串口数据接收
数据读取与解析
- 使用
SerialPort.DataReceived
事件异步处理数据:serialPort.DataReceived += (sender, e) => { string rawData = serialPort.ReadLine(); // 按行读取 ParseAndSaveData(rawData); // 解析并存储 }; serialPort.Open(); // 打开串口
- 关键点:
- 数据需根据协议解析(如十六进制拆分、校验和验证)。
- 添加异常处理(
try-catch
)应对断开连接或数据错误。
- 使用
解析示例(温度传感器)
假设数据格式:"TEMP:25.6°C"
private void ParseAndSaveData(string rawData) { if (rawData.StartsWith("TEMP:")) { string tempValue = rawData.Split(':')[1].Replace("°C", ""); if (float.TryParse(tempValue, out float temperature)) { InsertToDatabase(temperature, DateTime.Now); } } }
数据库存储
数据库设计(以SQL Server为例)
CREATE TABLE SensorData ( Id INT PRIMARY KEY IDENTITY, Temperature FLOAT NOT NULL, RecordTime DATETIME NOT NULL );
使用Entity Framework Core存储
- 定义数据模型:
public class SensorData { public int Id { get; set; } public float Temperature { get; set; } public DateTime RecordTime { get; set; } }
- 插入数据(依赖注入DbContext):
public void InsertToDatabase(float temperature, DateTime time) { using var context = new AppDbContext(); context.SensorData.Add(new SensorData { Temperature = temperature, RecordTime = time }); context.SaveChanges(); }
- 定义数据模型:
网站展示数据
ASP.NET Core MVC实现
控制器查询数据:
public class SensorController : Controller { private readonly AppDbContext _context; public SensorController(AppDbContext context) => _context = context; public IActionResult Index() { var data = _context.SensorData .OrderByDescending(d => d.RecordTime) .Take(100) // 显示最新100条 .ToList(); return View(data); } }
前端页面(Razor视图)
<table class="table table-striped"> <thead> <tr> <th>时间</th> <th>温度 (°C)</th> </tr> </thead> <tbody> @foreach (var item in Model) { <tr> <td>@item.RecordTime.ToString("yyyy-MM-dd HH:mm")</td> <td>@item.Temperature.ToString("0.0")</td> </tr> } </tbody> </table>
实时更新(可选)
- 使用SignalR推送数据到前端:
public class DataHub : Hub { public async Task SendTemperature(float temp) { await Clients.All.SendAsync("ReceiveTemperature", temp); } }
- 使用SignalR推送数据到前端:
安全与优化
E-A-T关键措施
- 数据验证:过滤非规字符,防止SQL注入。
- 错误日志:记录串口异常和数据库错误。
- 权限控制:网站限制访问角色(如
[Authorize(Roles="Admin")]
)。
性能优化
- 使用连接池管理数据库连接。
- 异步处理串口事件(
async/await
)。
引用说明
- 微软SerialPort文档:MSDN SerialPort Class
- Entity Framework Core教程:EF Core官方指南
- ASP.NET Core安全性:OWASP Top 10防护