socket怎样同时读、写下位机,以及同时读写出现界面卡死的问题,希望高手给解决一下,小弟在此谢过大家了
我想用socket实现同时读、写下位机plc,代码如下,timer1实现时时读下位机,timer2实现实时写下位机,我为了满足同时读写,我在写到时候让读的timer1停止一下,写完了让timer1再次启动,结果界面卡死!请问各路大神怎样实现同时读写下位机
public void Receive()
{
List<byte> sendData = new List<byte>(255);
//[1].Send
sendData.AddRange(new Byte[] { 0, 0 });//1~2.(Transaction Identifier)
sendData.AddRange(new Byte[] { 0, 0 });//3~4:Protocol Identifier,0 = MODBUS protocol
sendData.AddRange(new Byte[] { 0, 6 });//5~6:后续的Byte数量(针对读请求,后续为6个byte)
sendData.Add(0);//7:Unit Identifier:This field is used for intra-system routing purpose.
sendData.Add(3);//8.Function Code : 3 (Read Multiple Register)
sendData.AddRange(new Byte[] { 0, 10 });//9~10.起始地址
sendData.AddRange(new Byte[] { 0, 4 });//11~12.需要读取的寄存器数量
this.Write(sendData.ToArray()); //发送读请求
//[2].防止连续读写引起前台UI线程阻塞
Application.DoEvents();
//[3].读取Response Header : 完后会返回8个byte的Response Header
byte[] receiveData = this.Read(25);//缓冲区中的数据总量不超过256byte,一次读256byte,防止残余数据影响下次读取
}
public void Write(byte[] data)
{
this.socket.Send(data);
}
short m, l, k;
public byte[] Read(int length)
{
byte[] data = new byte[length];
this.socket.Receive(data);
m = data[11] ;
m <<= 8;
l = data[12];
k = (short)(m + l);
if (data[7] == 3)
{
textBox3.Text = k.ToString();
}
return data;
}
private void button1_Click(object sender, EventArgs e)
{
timer1.Start();
}
public void Send()
{
List<byte> values = new List<byte>(255);
values.AddRange(new Byte[] { 95, 0 });//1~2.(Transaction Identifier)
values.AddRange(new Byte[] { 0, 0 });//3~4:Protocol Identifier,0 = MODBUS protocol
values.AddRange(new Byte[] { 0, 11 });//5~6:后续的Byte数量 data.Length +
values.Add(2);//7:Unit Identifier:This field is used for intra-system routing purpose.
values.Add((byte)16);//8.Function Code : 16 (Write Multiple Register)
values.AddRange(new Byte[] { 0, 0 });//9~10.起始地址
values.AddRange(new Byte[] { 0, 2 });//11~12.寄存器数量
values.Add((byte)4);//13.数据的Byte数量
byte qq,ww;
ushort a1;
a1 = Convert.ToUInt16(textBox4.Text);
qq = (byte)(a1 >> 8);
ww = (byte)(a1);
//[2].增加数据
values.AddRange(new Byte[] { qq ,ww ,0,4 });//14~End:需要发送的数据
//[3].写数据
this.Write(values.ToArray());
//[4].防止连续读写引起前台UI线程阻塞
Application.DoEvents();
//[5].读取Response: 写完后会返回12个byte的结果
byte[] responseHeader = this.Read(25);
}
private void timer1_Tick(object sender, EventArgs e)
{
Receive();
}
private void timer2_Tick(object sender, EventArgs e)
{
timer1.Stop();
Send();
timer1.Start();
//Thread.Sleep(1);
}
private void button3_Click(object sender, EventArgs e)
{
timer2.Start();
}
private void button4_Click(object sender, EventArgs e)
{
Connect();
}