注:使用232协议的设备温湿度变送器,连接时设备的负极需要在使用一根线连接HY-E504(黑盒子)的232设备的连接口的G连接口,黑盒子的A信号线连接设备的B信号线,黑盒子的B信号线连接设备的A信号线。如下图所示:
namespace TcpClient_232
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
StringBuilder sb;
Socket sc;
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
GetData();
}
private async Task GetData()
{
StartClient();
byte[] buffer = SendData(0x01, 0x04, 0x00, 0x00, 0x00, 0x02);
//温度
decimal tem = DeviceUtil.BytesToShort(buffer[3], buffer[4]) * 0.1M;
//湿度
decimal hum = DeviceUtil.BytesToShort(buffer[5], buffer[6]) * 0.1M;
this.Invoke(new Action(() =>
{
label1.Text = $"温度:{tem}℃";
label2.Text = $"湿度:{hum}";
rbShow.Text += sb.ToString();
}));
await Task.Delay(3000);
GetData();
}
//连接服务端
private void StartClient()
{
sc = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
sc.Connect(new IPEndPoint(IPAddress.Parse("192.168.218.57"),8011));
}
//发送指令给服务端
//params:参数可变
public byte[] SendData(params byte[] data)
{
if (sc == null || !sc.Connected)
{
return null;
}
//data数据追加后边两位校验码
byte[] buffer = DeviceUtil.AddCrc16(data);
//发送数据
sc.Send(buffer);
//接收数据
byte[] receives = new byte[1024];
int length = sc.Receive(receives);
//接收到的数据转换称16进制字符串
sb = new StringBuilder();
for (int i = 0; i < length; i++)
{
sb.Append(Convert.ToString(receives[i], 16) + " ");
}
return receives;
}
}
}