倍加福RFID读头读取数据模拟键盘输入文本
文章目录
前言
最近由于客户买的PDA扫RFID数据解析不出正常数据,就写了个程序通过读取倍加福RFID的数据,并模拟键盘文本输入到文本框。
一、硬件配置连接
倍加福的控制,双通道的,可以连接两个RFID读头,灰色的是电源线,绿色的网线,黑色的是连接RFID读头的,吐槽的是,倍加福的RFID读头线路并不是很软,而且有点硬,容易断。
倍加福的读头
二、倍加福控制器参数设置
1、控制器IP设置
2、Webserver 登陆
控制器有自己的网页界面,登录账号密码:identcontrol
此控制器支持与PLC之间的EIP通讯,也支持TCP通讯,需要改通讯模式,只需要在ethernet/ip instance选项种选择就行,这里由于是与电脑通过TCP通讯,就改成TCP/IP就行,端口号默认10000,无法更改。
二、通讯指令
1.启用连续触发
指令:000619420000 通过TCP发送此指令,读头指示灯会不同的闪烁绿灯,当RFID芯片靠近读头时,会闪下黄灯,表示读取成功。
二、获取数据模拟键盘输入文本
1.连接
代码如下:
public void Connect()
{
if (client == null || !client.Connected)
{
try
{
client = new TcpClient();
IAsyncResult result = client.BeginConnect(IPAddress.Parse(RFIDIP), Convert.ToInt32(RFIDPort), ConnectCallback, null);
var success = result.AsyncWaitHandle.WaitOne(CONNECT_TIMEOUT);
if (!success)
{
MessageBox.Show("连接超时!");
return;
}
if (!client.Connected)
{
MessageBox.Show("无法连接到服务器!");
return;
}
this.Invoke((EventHandler)delegate
{
btnConnect.Enabled = false;
btnStop.Enabled = true;
});
}
catch (ArgumentNullException)
{
MessageBox.Show("IP地址错误!");
}
catch (FormatException)
{
MessageBox.Show("端口号错误!");
}
catch (Exception ex)
{
MessageBox.Show("错误连接: " + ex.Message);
}
}
else
{
SendToKeyboard("Already connected!");
this.Invoke((EventHandler)delegate
{
lblStatus.Text = "断开";
lblStatus.BackColor = Color.Red;
btnConnect.Enabled = true;
btnStop.Enabled = false;
});
}
}
启用连读指令
private void ConnectCallback(IAsyncResult ar)
{
try
{
client.EndConnect(ar);
stream = client.GetStream();
stream.ReadTimeout = RECEIVE_TIMEOUT;
IsConnet = true;
receiveThread = new Thread(Receive);
receiveThread.IsBackground = true;
receiveThread.Start();
this.Timer_Sendkeys.Interval = WriteTxtTime;
SendData("000619420000");
UpdateUI(() => SendToKeyboard("启动RFID读码连读!"));
lblStatus.Invoke(new Action(() =>
{
lblStatus.Text = "链接";
lblStatus.BackColor = Color.Green;
}));
}
catch (Exception ex)
{
UpdateUI(() => SendToKeyboard("错误连接中: " + ex.Message));
}
}
接收
private void Receive()
{
Sendstr sendstr = sendmassage;
try
{
while (IsConnet)
{
if (client.Connected)
{
byte[] buffer = new byte[1024];
int bytesRead = stream.Read(buffer, 0, buffer.Length);
if (bytesRead > 0)
{
string message = "";
if (bytesRead > 6)
{
message = Encoding.Default.GetString(buffer, 6, bytesRead).Replace("\0", "").Trim();
Client_Getmassage = message;
Invoke(new mydelegate(ON_Timer));
UpdateUI(() => SendToKeyboard(message));
}
}
else
{
StopReceiving();
Thread.Sleep(1000);
Connect();
}
}
}
}
catch (TimeoutException ex)
{
// 接收超时异常处理
UpdateUI(() => SendToKeyboard("接收超时异常: " + ex.Message));
StopReceiving();
Thread.Sleep(1000);
Connect();
}
catch (Exception ex)
{
// 其他异常处理
StopReceiving();
UpdateUI(() => SendToKeyboard("接收异常: " + ex.Message));
Thread.Sleep(2000);
Connect();
}
}
通过定时器把数据写入到文本,模拟Ctrl+c,Ctrl+V,复制粘贴到文本框,千万别用模拟键盘输入,速度慢容易确实数据乱码。 ,如果需要加回车触发,加上模拟回车键 SendKeys.Send(“ENTER”);
private void Timer_Sendkeys_Tick(object sender, EventArgs e)
{
//if (CKB.Checked)
//{
// Client_Getmassage += "\r";
//}
string text = ConvertEncode(Client_Getmassage + "\r");
Clipboard.SetText(text, TextDataFormat.Text);
SendKeys.Send("^c");
SendKeys.Send("^v");
SendKeys.Send("ENTER");
Client_Getmassage = "";
Timer_Sendkeys.Enabled = false;
}
RFID扫码测试视频
总结
大家需要软件源代码可以去 倍加福RFID读头读取数据模拟键盘输入文本源代码下载