当前位置:首页 > 行业动态 > 正文

如何用C高效获取串口数据并存入数据库?

C#通过System.IO.Ports类库监听串口数据,采用SerialPort对象配置波特率与端口号,接收数据后使用ADO.NET或Entity Framework解析并存储至数据库,实现硬件设备与信息系统的数据交互,需处理字节编码转换及通信异常。

硬件与通信准备

  1. 串口设备连接

    • 确认设备(如传感器、PLC)通过USB/RS232与计算机连接,记录串口号(如COM3)。
    • 安装对应驱动程序,确保设备管理器中显示正常。
  2. 串口参数配置
    根据设备协议设置参数:

    SerialPort serialPort = new SerialPort
    {
        PortName = "COM3",
        BaudRate = 9600,      // 波特率(常见值:9600/115200)
        Parity = Parity.None, // 校验位
        DataBits = 8,         // 数据位
        StopBits = StopBits.One // 停止位
    };

C#串口数据接收

  1. 数据读取与解析

    • 使用SerialPort.DataReceived事件异步处理数据:
      serialPort.DataReceived += (sender, e) => 
      {
        string rawData = serialPort.ReadLine(); // 按行读取
        ParseAndSaveData(rawData); // 解析并存储
      };
      serialPort.Open(); // 打开串口
    • 关键点
      • 数据需根据协议解析(如十六进制拆分、校验和验证)。
      • 添加异常处理(try-catch)应对断开连接或数据错误。
  2. 解析示例(温度传感器)
    假设数据格式:"TEMP:25.6°C"

    如何用C高效获取串口数据并存入数据库?  第1张

    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);
            }
        }
    }

数据库存储

  1. 数据库设计(以SQL Server为例)

    CREATE TABLE SensorData (
        Id INT PRIMARY KEY IDENTITY,
        Temperature FLOAT NOT NULL,
        RecordTime DATETIME NOT NULL
    );
  2. 使用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();
      }

网站展示数据

  1. 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);
        }
      }
  2. 前端页面(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>
  3. 实时更新(可选)

    • 使用SignalR推送数据到前端:
      public class DataHub : Hub
      {
        public async Task SendTemperature(float temp)
        {
            await Clients.All.SendAsync("ReceiveTemperature", temp);
        }
      }

安全与优化

  1. E-A-T关键措施

    • 数据验证:过滤非规字符,防止SQL注入。
    • 错误日志:记录串口异常和数据库错误。
    • 权限控制:网站限制访问角色(如[Authorize(Roles="Admin")])。
  2. 性能优化

    • 使用连接池管理数据库连接。
    • 异步处理串口事件(async/await)。

引用说明

  • 微软SerialPort文档:MSDN SerialPort Class
  • Entity Framework Core教程:EF Core官方指南
  • ASP.NET Core安全性:OWASP Top 10防护
0