网口模拟量采集卡可达到10毫秒访问频率,最近项目需要更换了串口的采集卡(100ms访问频率)。
实际上也是标准的Socket通信。
1,程序界面如下:
开发界面:
运行效果:
2,添加引用
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;
3,变量定义
//是否连接成功
private bool m_IsConnectOK = false;
//发送字串
private string m_CmdSend;
//TcpClient连接对象
private TcpClient m_Client;
private NetworkStream m_NetStream;
//数据缓冲
private byte[] m_SendBuffer = new byte[16];
private byte[] m_RecvBuffer = new byte[16];
//定时器:发送
private System.Threading.Timer m_ThreadSendTimer;
//启动发送
private bool m_EnableSend = false;
//定时器:接收
private System.Threading.Timer m_ThreadRecvTimer;
//启动接收
private bool m_EnableRecv = false;
4,窗体加载事件中添加代码
private void FormMain_Load(object sender, EventArgs e)
{
m_ThreadSendTimer = new System.Threading.Timer(new TimerCallback(ThreadSend_TimerCallBack), null, 500, 10);
m_ThreadRecvTimer = new System.Threading.Timer(new TimerCallback(ThreadRecv_TimerCallBack), null, 500, 6);
}
5,请求连接:
private void buttonTcpCltConn_Click(object sender, EventArgs e)
{
string serverIP = this.textBoxIPAddress.Text.Trim();
string serverPort = this.textBoxPort.Text.Trim();
try
{
m_Client = new TcpClient();
m_Client.Connect(serverIP, int.Parse(serverPort));
m_IsConnectOK = true;
m_EnableRecv = false;
SetMsgShow(serverIP + ":" + serverPort + " TcpClient连接成功.", true);
}
catch (Exception ex)
{
m_IsConnectOK = false;
SetMsgShow(serverIP + ":" + serverPort + " TcpClient连接失败:" + ex.Message, true);
}
}
6,开始采集
private void buttonTcpCltSend_Click(object sender, EventArgs e)
{
try
{
this.richTextBoxSend.Clear();
this.richTextBoxRecv.Clear();
m_CmdSend = this.textBoxCmd.Text.Trim();
m_SendBuffer = HexStrTobyte(m_CmdSend);
//private byte[] m_SendByte = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x04, 0x00, 0x00, 0x00, 0x03 };
//发送频率更改
int period = int.Parse(this.textBoxSendInterval.Text.Trim());
m_ThreadSendTimer.Change(0, period);
m_EnableSend = true;
SetMsgShow(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + ":启动定时发送", true);
}
catch (Exception ex)
{
SetMsgShow(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + ":" + ex.Message, true);
}
}
7,发送数据
private void ThreadSend_TimerCallBack(object state)
{
if (m_EnableSend) {
if (!string.IsNullOrEmpty(m_CmdSend) && m_IsConnectOK)
{
m_NetStream = m_Client.GetStream();
m_NetStream.Write(m_SendBuffer, 0, m_SendBuffer.Length);
m_NetStream.Flush();
m_EnableRecv = true;
SetMsgShow(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + " - " + byteToHexStr(m_SendBuffer), true);
}
}
}
8,接收数据
private void ThreadRecv_TimerCallBack(object state)
{
while (m_EnableRecv)
{
try
{
m_NetStream = m_Client.GetStream();
int recvLen = m_NetStream.Read(m_RecvBuffer, 0, m_RecvBuffer.Length);
string recvStr = ByteToHex(recvByte);
SetMsgShow(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + " -- " + recvStr, false);
}
catch (Exception ex)
{
SetMsgShow(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + ":" + ex.Message, false);
}
//带返回值:r.Result;.
m_EnableRecv = false;
}
}
提供完整源代码:https://download.csdn.net/download/mossiy/12094772
开发环境:Vs2017;模拟量输入转以太网modbus tcp数据IO网口采集模块。