【发布时间】:2016-01-04 09:41:49
【问题描述】:
我正在使用带有三个温度探头 PT 100 的 PICO PT-104 数据记录器。我试图通过在 UDP 数据包中发送命令来从中获取测量值。
首先, l 发送消息“lock”,将数据记录器锁定到我的笔记本电脑,所以如果数据记录器从网络上的其他人那里收到消息,它不会回答。我得到了答案“锁定成功”。之后,需要发送“keep alive”命令,十六进制0x34。如果在 lock 命令后 10 秒没有发送 keep-alive 命令,那么数据记录器将自动从我的机器上解锁,我将无法再次通信。我为此创建了计时器。
另一方面,我需要发送“开始转换”命令。当我发送该命令时,我得到答案“正在转换”和一些奇怪的字符(我期待数字)。在该命令之后, l 应该每 720 毫秒从所有 4 个通道获取测量值。
PICO PT-104 数据记录仪程序员指南(第 14 页以太网协议):
如果我将接收进程移动到单独的线程,则会出现异常“每个套接字地址(协议/网络地址/端口)通常只允许使用一次”。
https://www.picotech.com/download/manuals/USBPT104ProgrammersGuide.pdf
类Form1:
public partial class Form1 : Form
{
int port = 1;
String IPAddr = "10.1.52.155";
private Thread tRead;
public static bool messageReceived = false;
public Form1()
{
InitializeComponent();
timerKeepAlive(5);
tRead = new Thread(new ThreadStart(ReceiveMessages));
tRead.IsBackground = true;
// tRead.Start();
}
private void Form1_Load(object sender, EventArgs e)
{
sendString("lock");
sendStartConverting();
//sendReadEPROM();
}
// *************************************** T I M E R ****************************************************
private void timerKeepAlive(int seconds)
{
System.Timers.Timer aTimer = new System.Timers.Timer();
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
aTimer.Interval = seconds * 1000;
aTimer.Enabled = true;
}
private void OnTimedEvent(object source, ElapsedEventArgs e)
{
// keep alive se mora slati kao hex vrednost 0x34
sendKeepAlive();
}
// ######################################################################################################
// ************************************** S E N D I N G ****************************************************
private void sendString(string message)
{
try
{
UdpClient udpClient = new UdpClient(1);
//Povezivanje sa klijentom
udpClient.Connect(IPAddress.Parse(IPAddr), port);
// Pretvaranje poruke za slanje u niz bajtova
Byte[] sendBytes = Encoding.ASCII.GetBytes(message);
// Slanje poruke
udpClient.Send(sendBytes, sendBytes.Length);
// Dodavanje poslate poruke u textBox
this.txtCH1.Invoke((Action)(() =>
{
txtCH1.AppendText("Sent: " + message + "!");
txtCH1.AppendText(Environment.NewLine);
}));
/*
IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 55056);
// Pretvaranje podataka koji su stigli u string
Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
string returnData = Encoding.ASCII.GetString(receiveBytes);
// Dodavanje podataka koji su stigli u textBox
this.txtCH1.Invoke((Action)(() =>
{
txtCH1.AppendText("Arrived: " + returnData.ToString());
txtCH1.AppendText(Environment.NewLine);
}));
*/
udpClient.Close();
}
catch (Exception e)
{
MessageBox.Show("ERROR: " + e.Message);
}
}
private void sendKeepAlive()
{
try
{
UdpClient udpClient = new UdpClient(1);
//Povezivanje sa klijentom
udpClient.Connect(IPAddress.Parse(IPAddr), port);
// Pretvaranje poruke za slanje u niz bajtova
var sendBytes = new byte[] { 0x34 };
// Slanje poruke
udpClient.Send(sendBytes, sendBytes.Length);
// Dodavanje poslate poruke u textBox
this.txtCH1.Invoke((Action)(() =>
{
txtCH1.AppendText("Sent: 0x34 Keep alive!");
txtCH1.AppendText(Environment.NewLine);
}));
/*
IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 55056);
// Pretvaranje podataka koji su stigli u string
Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
string returnData = Encoding.ASCII.GetString(receiveBytes);
// Dodavanje podataka koji su stigli u textBox
this.txtCH1.Invoke((Action)(() =>
{
txtCH1.AppendText("Arrived: " + returnData.ToString());
txtCH1.AppendText(Environment.NewLine);
}));
*/
udpClient.Close();
}
catch (Exception e)
{
MessageBox.Show("ERROR: " + e.Message);
}
}
private void sendStartConverting()
{
try
{
UdpClient udpClient = new UdpClient(1);
//Povezivanje sa klijentom
udpClient.Connect(IPAddress.Parse(IPAddr), port);
// Pretvaranje poruke za slanje u niz bajtova
int num = 0x310F;
var unum = (uint)num; // Convert to uint for correct >> with negative numbers
var sendBytes = new[] {
(byte)(unum >> 8),
(byte)(unum)
};
// Slanje poruke
udpClient.Send(sendBytes, sendBytes.Length);
// Dodavanje poslate poruke u textBox
this.txtCH1.Invoke((Action)(() =>
{
txtCH1.AppendText("Sent: 0x310F Start converting!");
txtCH1.AppendText(Environment.NewLine);
}));
IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 55056);
// Pretvaranje podataka koji su stigli u string
for (int i = 0; i < 10; i++)
{
Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
string returnData = Encoding.ASCII.GetString(receiveBytes);
Encoding e = Encoding.GetEncoding(returnData);
// Dodavanje podataka koji su stigli u textBox
this.txtCH1.Invoke((Action)(() =>
{
txtCH1.AppendText("Arrived: " + returnData);
txtCH1.AppendText(Environment.NewLine);
}));
}
udpClient.Close();
}
catch (Exception e)
{
MessageBox.Show("ERROR: " + e.Message);
}
}
private void sendReadEPROM()
{
try
{
UdpClient udpClient = new UdpClient(1);
//Povezivanje sa klijentom
udpClient.Connect(IPAddress.Parse(IPAddr), port);
// Pretvaranje poruke za slanje u niz bajtova
var sendBytes = new byte[] { 0x32 };
// Slanje poruke
udpClient.Send(sendBytes, sendBytes.Length);
// Dodavanje poslate poruke u textBox
this.txtCH1.Invoke((Action)(() =>
{
txtCH1.AppendText("Sent: 0x32 Read EPROM!");
txtCH1.AppendText(Environment.NewLine);
}));
/*
IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 55056);
// Pretvaranje podataka koji su stigli u string
Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
string returnData = Encoding.ASCII.GetString(receiveBytes);
// Dodavanje podataka koji su stigli u textBox
this.txtCH1.Invoke((Action)(() =>
{
txtCH1.AppendText("Arrived: " + returnData.ToString());
txtCH1.AppendText(Environment.NewLine);
}));
*/
udpClient.Close();
}
catch (Exception e)
{
MessageBox.Show("ERROR: " + e.Message);
}
}
private void sendUnlock()
{
try
{
UdpClient udpClient = new UdpClient(1);
//Povezivanje sa klijentom
udpClient.Connect(IPAddress.Parse(IPAddr), port);
// Pretvaranje poruke za slanje u niz bajtova
var sendBytes = new byte[] { 0x33 };
// Slanje poruke
udpClient.Send(sendBytes, sendBytes.Length);
// Dodavanje poslate poruke u textBox
this.txtCH1.Invoke((Action)(() =>
{
txtCH1.AppendText("Sent: 0x33 Unlock!");
txtCH1.AppendText(Environment.NewLine);
}));
/*
IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 55056);
// Pretvaranje podataka koji su stigli u string
Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
string returnData = Encoding.ASCII.GetString(receiveBytes);
// Dodavanje podataka koji su stigli u textBox
this.txtCH1.Invoke((Action)(() =>
{
txtCH1.AppendText("Arrived: " + returnData.ToString());
txtCH1.AppendText(Environment.NewLine);
}));
*/
udpClient.Close();
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
}
// #######################################################################################################
// *********************************** R E C E I V I N G ****************************************************
private void ReceiveMessages()
{
try
{
// Receive a message and write it to the console.
IPEndPoint e = new IPEndPoint(IPAddress.Any, port);
UdpClient u = new UdpClient(e);
UdpState s = new UdpState();
s.e = e;
s.u = u;
Console.WriteLine("listening for messages");
u.BeginReceive(new AsyncCallback(ReceiveCallback), s);
// Do some work while we wait for a message. For this example,
// we'll just sleep
while (!messageReceived)
{
Thread.Sleep(100);
}
}
catch (Exception e)
{
MessageBox.Show("ERROR: " + e.Message);
}
}
public void ReceiveCallback(IAsyncResult ar)
{
UdpClient u = (UdpClient)((UdpState)(ar.AsyncState)).u;
IPEndPoint e = (IPEndPoint)((UdpState)(ar.AsyncState)).e;
Byte[] receiveBytes = u.EndReceive(ar, ref e);
string receiveString = Encoding.ASCII.GetString(receiveBytes);
this.txtCH1.Invoke((Action)(() =>
{
txtCH1.AppendText("Arrived: " + receiveString);
txtCH1.AppendText(Environment.NewLine);
}));
Console.WriteLine("Received: {0}", receiveString);
messageReceived = true;
}
// ######################################################################################################
}
类 UdpState:
class UdpState
{
public IPEndPoint e;
public UdpClient u;
}
【问题讨论】: