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吗