尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
C# WinForms 上位机开发 9 章学习复盘:从串口、TCP/IP、SQLite 到 PLC 通讯与运动控制卡
一、先上知识地图9 章到底学了什么我把整个课程拆成 5 个层次从 会发字符串 到 会控机械臂表格层次章节核心内容用到的技术通信基础第 2 章串口原理 SerialPort 控件System.IO.Ports.SerialPort通信基础第 3、4 章TCP/IP、Socket、粘包拆包System.Net.Sockets.Socket数据持久化第 5 章SQLite 存储 log4net 日志System.Data.SQLite、log4net工业协议第 6、8 章PLC 入门 Modbus RTU/TCPDtCommunication / HslCommunication工业协议第 7、9 章OPC UA 西门子 S7Opc.Ua、S7.Net运动控制第 10 章雷赛运动控制卡二次开发LTDMC.dll C# 封装一句话总结上位机 会通信收得上来数据 会存储存得进数据库 会控制发得下去指令。二、基础篇串口与 TCP/IP2.1 第 2 章 串口通信SerialPort串口是工业现场最经典的短距离通信方式RS-232 / RS-485 都走它。WinForms 里直接拖SerialPort控件就行关键参数就 5 个PortName串口号COM1、COM3……BaudRate波特率常用 9600、115200DataBits数据位一般 8StopBits停止位一般 1Parity校验位None / Odd / Even易错点这 5 个参数必须和下位机完全一致差一个就连不上。新手最常犯的错是只改了波特率忘了校验位结果收到一堆乱码。接收数据用DataReceived事件但这个事件跑在后台线程里不能直接碰 UI 控件必须Invoke切回主线程。2.2 第 3、4 章 TCP/IP Socket串口学完之后上 TCP因为工业现场越来越多设备走网口。Socket 通信的核心流程服务端new Socket(...)→Bind(IPEndPoint)→Listen(...)→ 循环Accept()→ 每个客户端开一个线程Receive()。这是我自己写的 TCP 服务端核心代码FrmServer.cs// 1. 启动监听 serverSocket new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint iPEnd new IPEndPoint(IPAddress.Parse(txtIP.Text), int.Parse(txtPort.Text)); serverSocket.Bind(iPEnd); serverSocket.Listen(20); // 最大连接数 // 2. 开一个后台线程循环 Accept 客户端 socketTread new Thread(WatchConnecting); socketTread.IsBackground true; socketTread.Start(); // 3. WatchConnecting每来一个客户端再开一个线程专门收它的消息 public void WatchConnecting() { while (true) { socConnection serverSocket.Accept(); // 阻塞直到有客户端连 txtContent.AppendText(客户端连接成功!\r\n); ParameterizedThreadStart pts new ParameterizedThreadStart(ServerRecMsg); Thread thr new Thread(pts); thr.IsBackground true; thr.Start(socConnection); } } // 4. 每个客户端一个接收线程 private void ServerRecMsg(object socketClientPara) { Socket socketServer socketClientPara as Socket; byte[] arrServerRecMsg new byte[1024 * 1024]; // 1M 缓冲区 while (true) { try { int length socketServer.Receive(arrServerRecMsg); string msg Encoding.UTF8.GetString(arrServerRecMsg, 0, length); // 跨线程更新 UI必须 Invoke txtContent.Invoke(new Action(() { txtContent.AppendText(客户端 DateTime.Now \r\n msg \r\n); })); } catch { txtContent.AppendText(客户端已断开\r\n); break; } } }易错点粘包 / 拆包TCP 是流协议没有 消息边界 的概念。你以为一次Receive收到的是一条完整指令实际上可能是半条、两条粘在一起、或者两条中间还被拆开。解决办法是自己定协议头比如[魔数 2 字节][指令长度 4 字节][指令体 N 字节][校验 2 字节]收到数据后先拼到缓存里按协议头切包切出来一条处理一条。这是第 4 章的重点也是面试官最爱问的点。三、数据持久化SQLite 与日志3.1 第 5 章 SQLite log4net上位机不能光收发数据还得存。课程里用的是 SQLite单文件、免安装、适合嵌入式场景另外配了 log4net 做日志。数据库操作我封装了一个DBHelper查询返回DataSet、增删改返回影响行数public class DBHelper { // 查询返回 DataSet方便直接绑到 DataGridView public static DataSet Search(string sql) { DataSet ds new DataSet(); SqlConnection connection new SqlConnection( server.;databasedb2606;integrated securitytrue); SqlDataAdapter adapter new SqlDataAdapter(sql, connection); adapter.Fill(ds); return ds; } // 增删改返回受影响行数 public static int IUD(string sql) { int count 0; using (SqlConnection connection new SqlConnection( server.;databasedb2606;integrated securitytrue)) { connection.Open(); SqlCommand cmd new SqlCommand(sql, connection); count cmd.ExecuteNonQuery(); } return count; } }注上面这段是课程里用 SQL Server 演示的写法SQLite 只需要把SqlConnection换成SQLiteConnection、连接字符串换成Data Sourcexxx.db即可API 几乎一样。易错点连接字符串写错数据库名、账号密码、集成认证混用SqlConnection不Open()就执行命令用完不Dispose数据库文件被锁死日志用 log4net按天分目录、Info 和 Error 分文件生产环境排查问题全靠它。四、工业协议篇PLC / Modbus / OPC UA / 西门子 S7这一块是上位机和 普通 C# 桌面程序 拉开差距的地方。4.1 第 6 章 PLC 入门PLC可编程逻辑控制器是现场的 大脑上位机只是 操作面板。先搞清楚几个概念输入继电器X/I接传感器、按钮输出继电器Y/Q接气缸、电机、指示灯中间继电器M内部软元件数据寄存器D/DB存数据温度、产量、计数都在这上位机要做的事就是读这些寄存器的值显示到界面或者写值进去控制设备。4.2 第 8 章 Modbus重点Modbus 是工业界的 普通话几乎所有 PLC、仪表、变频器都支持。两种常用形态Modbus RTU走串口帧结构紧凑现场设备用得多Modbus TCP走网口502 端口上位机集成用得多课程里用的是DtCommunication这个库HslCommunication 风格的封装核心对象就是ModbusTcpNet和ModbusRtu。Modbus TCP 客户端我自己写的frmModbusTcpNet.csModbusTcpNet master; // 连接 master new ModbusTcpNet(127.0.0.1, 502); // IP 端口 master.DataFormat DataFormat.CDAB; // 字节序下面单独讲 master.Connect(); // 读一个寄存器 DevAddr addr new DevAddr() { Addr 100, // 寄存器地址 DataType DVarType.Int16, // 数据类型 Count 1 }; var read master.Read(addr); if (read.IsSuccess) { tbRValue.Text read.Content.Value.ToString(); } // 写一个寄存器 DevAddr writeAddr new DevAddr() { Addr 100, Value 123, DataType DVarType.Int16 }; master.Write(writeAddr);Modbus RTU 串口版frmMain.csModbusRtu modbusRtu; // 5 个串口参数 站号一次配好 modbusRtu new ModbusRtu(station: 1); modbusRtu.SerialPortInni( portName: COM3, baudRate: 9600, dataBits: 8, stopBits: StopBits.One, parity: Parity.None); modbusRtu.DataFormat DataFormat.CDAB; modbusRtu.Connect();易错点字节序这是 Modbus 最容易踩的坑。一个 32 位的 int 在两个寄存器里有 4 种排法ABCD大端标准DCBA小端最常见BADC字内反CDAB字间反课程里用的就是这种字节序配错 读出来的数全是天文数字。如果读数不对第一反应就换DataFormat。4.3 第 7 章 OPC UAOPC UA 是比 Modbus 更现代的工业协议带安全认证、节点模型、订阅机制。西门子、罗克韦尔的中大型设备都支持。C# 里用Opc.Ua.Client库连上之后按 节点 ID 读 / 写比 Modbus 的地址模型直观。4.4 第 9 章 西门子 S7西门子 S7-1200 / 1500 是国内最常见的中型 PLC。C# 里用S7.Net库直接连不需要走 Modbus。读 DB 块的写法大概是// 读 DB1.DBD0 这个双字 var cpu new PLC(CpuType.S71200, IPAddress.Parse(192.168.0.1), 0, 1); cpu.Open(); float value cpu.ReadFloat(DataType.DataBlock, 1, 0, VarType.DBitReal); cpu.Close();五、运动控制篇雷赛运动控制卡最后一章是从 通讯 跨到 运动控制。前面 Modbus / OPC 都是读 PLC 的现成逻辑运动控制卡则是上位机直接发脉冲控制电机走位。课程用的是雷赛LTI的控制卡封装在LTDMC.dll里C# 调用流程大致是ltdmc.board_init()初始化控制卡设置轴参数脉冲当量、加速度、速度ltdmc.move_home()回原点ltdmc.move_line()直线插补 / 单点运动不停读ltdmc.get_position()拿到当前位置到位后做下一步动作易错点脉冲当量没设对走 1mm 实际走了 10mm加速度设太大电机丢步或异响没回原点就直接走位位置全错多轴联动时插补方向没对齐这一章是我后续做机械臂分拣项目的基础。六、新手最容易踩的 10 个坑总结跨线程访问 UI后台线程直接textBox.Text xxx直接抛InvalidOperationException必须Invoke。Socket 粘包以为一次Receive就是一条完整消息实际要自己做分包。串口参数不匹配波特率 / 数据位 / 停止位 / 校验位 / 站号5 个差一个都连不上。Modbus 字节序ABCD/DCBA/BADC/CDAB四种配错数全错。数据库连接忘了 OpenSqlConnection声明了不Open()就执行命令。连接不释放数据库文件被锁下次打不开。TCP 服务端不监听线程在 UI 线程里Accept()直接卡死界面。事件没注销DataReceived/Timer事件没对应的-关闭窗体后还在触发。运动控制卡没回原点上电后机械坐标是未知的必须先回零。日志不分级所有消息堆一起出问题找不到 Error。七、下一步把这些串到一个真实项目里学完这 9 章只是 会用零件下一步是装机器。我现在正在做的综合项目是ZIDE 机械臂 WinForms 上位机的药品智能分拣装箱系统读码识别药品条码机械臂抓取、24 盒一箱装箱效期预警临期药品提前提示SQLite 存生产记录串口 / TCP 和机械臂控制器通讯后续会把这个项目拆成系列博客发出来包括机械臂通讯协议对接读码器集成串口触发24 盒装箱的位置规划效期预警的数据库设计上位机多线程架构通讯线程、UI 线程、业务线程怎么切如果这篇博客对你上位机入门有帮助欢迎点赞收藏。有问题评论区聊。
RELATED

相关推荐

PET口语Part 3总是卡壳?协作讨论的3个关键能力与AI陪练方案

PET口语Part 3总是卡壳?协作讨论的3个关键能力与AI陪练方案

PET口语考试中,Part 3的协作讨论环节是很多考生的难点。这部分要求两位考生围绕图片展开讨论,不仅要说清楚自己的观点,还要与搭档互动、推进话题。不少孩子阅读写作都能过关,却在Part 3卡壳,最终口语分数被拉低。PET口…

📅 2026/10/11 7:45:47
C++学习日记 Day18:STL-拷贝替换/算术生成/集合算法

C++学习日记 Day18:STL-拷贝替换/算术生成/集合算法

## 今天学了什么今天学习C中STL-常用拷贝替换/算术生成/集合算法,并结合所学STL完成两个案例。## 常用的拷贝和替换算法copy(v1.begin(), v1.end(), v2.begin()); //拷贝replace(v.begin(), v.end(), oldValue, newValue); //替换replace_if(v.begin(), v.end()…

📅 2026/10/11 7:45:47
小白程序员必收藏!3个黄金赛道助你年薪百万,2026春招已释放信号!

小白程序员必收藏!3个黄金赛道助你年薪百万,2026春招已释放信号!

大模型产业迎来高速发展,AI岗位需求激增,年薪百万成为可能。文章介绍了具身智能、人工智能(基础算法方向)和智能科学与技术(AIX方向)三个专业方向,分别适合动手能力强、数学功底扎实、兴趣广泛的…

📅 2026/10/11 7:45:47
MORE NEWS

更多资讯

📰

PMP报班还是自学?6888元费用全拆解与避坑指南

我有个做研发的朋友,去年年初问我考 PMP 的事。他查了一圈,头部机构的套餐报价基本落在六千到七千档,最心仪的那家报 6888 元。他纠结的倒不是能不能拿出这笔钱,而是这钱花出去到底买了什么——自己买书刷题是不是也能过&#xff…

📰

帆软财经方案筑基企业财务管报升级:让集团合并、预算执行与经营分析经脉贯通

集团财务管报的升级,难点从来不在"多出一张表",而在合并、预算执行、经营分析三套报表各自为政、经脉不通。帆软财经数智化应用解决方案以统一数据底座和指标体系筑基,把这三条经脉真正打通,让管报从"事后记录&quo…

📰

项目绩效域深度解析:从五大过程组到八大绩效域,备考与实战双视角

最近不少项目管理备考群都在刷同一个话题:教材目录里“1.18、项目绩效域(重点新增)”这一节到底怎么学。有人疑惑,五大过程组还没背明白,怎么又冒出八个绩效域?也有人把整节翻完了还是说不清楚,…

📰

论文降AI率工具实测指南:从AI检测原理到9款工具避坑流程

又到了一年一度交论文初稿的季节。很多同学写完论文用某查重系统一查,重复率没问题,结果学校系统里AI检测那一栏标红了一大片,提示“疑似AI生成内容比例超过70%”。这个数字直接决定你是否需要重写、延期答辩甚至被导师约谈。这几年不少高校已…

📰

王树森推荐系统学习笔记P21

推荐系统中的多样性 : 物品相似性的度量 : 1. 基于物品属性标签 ; (两个物品有越多相同的标签, 则表示两个物品越相似) 如 : 类目 , 品牌 , 关键词 ....... 可以根据一级类目 , 二级类目 , 品牌 来计算相似度 ; 2. 基于物品的向量表征 . (两个物品的向量的余弦相似度越大 , 则…

📰

K8s中Sentinel部署:独立组件与Sidecar模式选型与实战

每次聊到 Sentinel 上 Kubernetes,大家纠结的往往就是标题里这个问题:到底用 Sidecar 模式,还是把 Sentinel 当成一个独立组件来部署?我一开始也觉得这是个部署拓扑选择题,后来踩过几次坑、把控制台和客户端的关系理顺…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬