c#上位机,TCP通信上位机,udp通信上位机,串口通信上位机,数据采集上位机 C# 上位机 ...
源码里藏着几个骚操作:用MemoryMappedFile做进程间通信,BinaryWriter处理浮点数转换,还有用Stopwatch做高精度定时采集。尤其是面对TCP、UDP、串口这些不同协议,用C#能搞出统一的数据采集框架。重点提醒:UDP别指望数据百分百到达,上次做AGV调度就栽在这,后来加了重传机制才稳。先说说TCP通信这老伙计。c#上位机,TCP通信上位机,udp通信上位机,串口通信上位
c#上位机,TCP通信上位机,udp通信上位机,串口通信上位机,数据采集上位机 C# 上位机 TCP UDP 串口通信 源码
最近在折腾工控上位机开发,发现C#在通信这块真是把瑞士军刀。尤其是面对TCP、UDP、串口这些不同协议,用C#能搞出统一的数据采集框架。今天咱们直接上硬菜,聊聊怎么用C#快速搭建通信上位机。

先说说TCP通信这老伙计。搞过网络编程的都知道,TCP讲究的是可靠连接。在C#里用TcpClient三行代码就能搭起架子:
TcpClient client = new TcpClient();
client.Connect("192.168.1.100", 502);
NetworkStream stream = client.GetStream();
重点在数据收发处理。建议单独开个线程跑循环接收,不然界面能卡成PPT。遇到过数据粘包问题没?我一般用固定头尾标识+缓冲区处理:
byte[] buffer = new byte[1024];
while(true)
{
int bytesRead = stream.Read(buffer, 0, buffer.Length);
// 解析逻辑放这里...
}
UDP就比TCP野多了,适合实时性要求高的场景。用UdpClient要注意端口绑定姿势:
UdpClient receiver = new UdpClient(11000);
IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0);
byte[] data = receiver.Receive(ref remoteEP); // 这里会阻塞
重点提醒:UDP别指望数据百分百到达,上次做AGV调度就栽在这,后来加了重传机制才稳。建议收发用不同线程,收到数据直接扔给委托处理:
BeginInvoke(new Action(() => { txtLog.AppendText("收到:" + Encoding.ASCII.GetString(data)); }));
串口通信算是最玄学的部分。System.IO.Ports里的SerialPort类用着顺手,但配置参数能逼疯新手:
SerialPort sp = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);
sp.DataReceived += Sp_DataReceived; // 事件驱动美滋滋
sp.Open();
实测发现DataReceived事件在高速采集时可能丢数据,后来改用轮询模式才解决。注意线程安全!跨线程操作UI记得用Invoke:
void Sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
this.Invoke(new EventHandler(delegate {
txtRecv.Text += sp.ReadExisting();
}));
}
最后说说数据采集框架怎么整合。我习惯用抽象工厂模式封装不同协议,核心就三层:
- 通信层(TCP/UDP/串口)
- 协议解析层(Modbus/自定义格式)
- 业务处理层
比如同时接PLC和传感器可以这样玩:
ICommChannel tcpChannel = CommFactory.CreateChannel(ProtocolType.TCP);
ICommChannel comChannel = CommFactory.CreateChannel(ProtocolType.SerialPort);
tcpChannel.DataReceived += HandlePLCData;
comChannel.DataReceived += HandleSensorData;
源码里藏着几个骚操作:用MemoryMappedFile做进程间通信,BinaryWriter处理浮点数转换,还有用Stopwatch做高精度定时采集。注意数据量大时别用+=拼接字符串,StringBuilder才是王道。
c#上位机,TCP通信上位机,udp通信上位机,串口通信上位机,数据采集上位机 C# 上位机 TCP UDP 串口通信 源码

调试建议:Wireshark抓TCP/UDP包,串口调试先用AccessPort验证,别跟自己写的代码死磕。遇到过最坑的bug是串口RTS信号线没接对,数据死活过不来...
搞上位机就像拼乐高,把通信模块、协议解析、UI展示这些积木搭好,后面加新功能就是分分钟的事。下次准备聊聊用OPCUA统一不同设备接口,那才是真的酸爽。

更多推荐
所有评论(0)