C# 使用RFID从RS232端口读取数据
更新 我正在读取一张C# 使用RFID从RS232端口读取数据,c#,hardware,C#,Hardware,更新 我正在读取一张RFID卡,并将其值签名到我的文本框中。text 它在我第一次通过我的RFID读卡器时起作用,但在我第二次通过卡时,它在我的文本框上显示整个卡的id。text,它只显示卡id的最后一个字母。有时你可以看到整个数字在文本框上快速出现和消失,但从您第二次传递卡片起,文本框中只剩下最后一个字母。 这可能是什么原因造成的 以下是我当前的代码: using System; using System.Windows.Forms; using System.IO.Ports; using
RFID卡
,并将其值签名到我的文本框中。text
它在我第一次通过我的
RFID读卡器时起作用,但在我第二次通过卡时,它在我的文本框上显示整个卡的id。text
,它只显示卡id的最后一个字母。有时你可以看到整个数字在文本框上快速出现和消失,但从您第二次传递卡片起,文本框中只剩下最后一个字母。
这可能是什么原因造成的
以下是我当前的代码:
using System;
using System.Windows.Forms;
using System.IO.Ports;
using System.Text;
using System.Text.RegularExpressions;
namespace RFID_Reader
{
public partial class PortaSerial : Form
{
private SerialPort porta_serial = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
public PortaSerial()
{
InitializeComponent();
}
private void PortaSerial_Load(object sender, EventArgs e)
{
try
{
if (porta_serial.IsOpen)
{
porta_serial.Close();
}
porta_serial.Open();
porta_serial.DtrEnable = true;
porta_serial.DataReceived += new SerialDataReceivedEventHandler(Recebe_Data);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
void Recebe_Data(object sender, SerialDataReceivedEventArgs e)
{
try
{
string oi = porta_serial.ReadExisting().ToString();
SetLabel(oi);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
void SetLabel(String s)
{
try
{
if (this.InvokeRequired)
{
this.Invoke(new Action<String>(SetLabel), s);
return;
}
textBox1.Text = RemoveSpecialCharacters(s);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
public static string RemoveSpecialCharacters(string str)
{
StringBuilder sb = new StringBuilder();
foreach (char c in str)
{
if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || c == '.' || c == '_')
{
sb.Append(c);
}
}
return sb.ToString();
}
}
}
使用系统;
使用System.Windows.Forms;
使用System.IO.Ports;
使用系统文本;
使用System.Text.RegularExpressions;
名称空间RFID读卡器
{
公共部分类PortaSerial:表单
{
专用串行端口porta_serial=新串行端口(“COM1”,9600,奇偶校验。无,8,停止位。1);
公共PortaSerial()
{
初始化组件();
}
私有void PortaSerial_加载(对象发送方,事件参数e)
{
尝试
{
if(端口串行.IsOpen)
{
porta_serial.Close();
}
porta_serial.Open();
porta_serial.DtrEnable=true;
porta_serial.DataReceived+=新的SerialDataReceivedEventHandler(接收数据);
}
捕获(例外情况除外)
{
抛出新异常(例如消息);
}
}
无效接收数据(对象发送方,SerialDataReceivedEventArgs e)
{
尝试
{
字符串oi=porta_serial.ReadExisting().ToString();
SetLabel(oi);
}
捕获(例外情况除外)
{
抛出新异常(例如消息);
}
}
void SetLabel(字符串s)
{
尝试
{
if(this.invokererequired)
{
调用(新操作(SetLabel),s);
返回;
}
textBox1.Text=删除特殊字符;
}
捕获(例外情况除外)
{
抛出新异常(例如消息);
}
}
公共静态字符串删除特殊字符(字符串str)
{
StringBuilder sb=新的StringBuilder();
foreach(str中的字符c)
{
如果((c>='0'&&c='A'&&c='A'&&c在Form1\u加载方法中,您使用port
引用您的SerialPort
对象,但在事件处理程序中,您使用porta\u serial
在Form1\u加载方法中,您使用port
引用您的SerialPort
对象,但在事件处理程序中,您使用porta_serial
要访问GUI元素(文本框、标签等),您需要在UI线程中运行。DataReceived正在另一个线程中运行。您可以通过如下调用更改为UI线程
void SetLabel(String s)
{
if (this.InvokeRequired) {
this.Invoke (new Action<String>(SetLabel), s);
return;
}
Label1.Text = s;
}
void SetLabel(字符串s)
{
if(this.invokererequired){
调用(新操作(SetLabel),s);
返回;
}
标签1.Text=s;
}
但是要小心-如果你需要访问GUI的不同部分(例如标签和文本框),你应该“收集”这些调用是因为每一个调用都需要一些时间。此外,您可以考虑NealJooCK而不是调用以不阻塞接收线程。但是,您应该阅读MSDN或谷歌中的这些细节以获得更困难的例子。 < P>以访问GUI(TeXbox,Labor,…)的元素。您需要在UI线程中运行。DataReceived正在另一个线程中运行。您可以通过如下调用更改为UI线程
void SetLabel(String s)
{
if (this.InvokeRequired) {
this.Invoke (new Action<String>(SetLabel), s);
return;
}
Label1.Text = s;
}
void SetLabel(字符串s)
{
if(this.invokererequired){
调用(新操作(SetLabel),s);
返回;
}
标签1.Text=s;
}
但是要小心-如果你需要访问GUI的不同部分(例如标签和文本框),你应该“收集”这些调用是因为每一个调用都需要一些时间。此外,您可以考虑NealJooCK而不是调用来不阻塞接收线程。但是,您应该阅读MSDN或谷歌中的这些细节以获得更难的示例。对不起,MyBad。它是正确的,我只是忘了在这里进行更改。问题是,我使用的软件是我们。正在调用COM1
端口…我只是不知道为什么它没有引发错误。现在它正在读取…谢谢@Steven,但是现在,我收到了一个不同的错误。我将更新我的问题抱歉,我的坏。这是正确的,我只是忘记在这里更改。问题是,我使用的软件使用的是COM1
端口…我只是不知道为什么没有触发错误。现在它正在读取…谢谢@Steven,但是现在,我得到了一个不同的错误。我将更新我的问题,我将它称为何处?在我的DataReceived
?此外,我得到了这个没有重载,因为“SetLabel”匹配委托的“System.Action”。在这个.Invoke上(新操作(SetLabel),s)是的,只要你需要写入某个控件的数据。哪一个错误?确实有一个错误,但我更正了样本。你仍然有错误吗?哪一个?现在它工作了,但有一件事,我收到了卡号,还有一些特殊字符。有没有一种方法可以过滤到只对textbox1进行签名。文本字母?有很多实际上,有些比其他更复杂…最简单的可能是使用String.Replace-如果你知道哪些是特殊字符,也就是说。我在哪里调用它?在我的DataReceived
?另外,我得到了这个没有重载,因为“SetLabel”匹配委托的“System.Action”。在这个.Invoke上(新操作(SetLabel),s)是的,只要你需要写入某个控件的数据。哪一个错误?确实有一个错误,但我更正了样本。你还有e吗