使用RFID从RS232端口读取数据

时间:2013-05-14 17:56:36

标签: c# hardware

更新

我正在阅读RFID Card,并将其值记入我的textbox.text 这是我第一次在RFID Reader中传递卡片时的工作,但是我第二次通过卡片,而不是在我的textbox.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();
        }
    }
}

2 个答案:

答案 0 :(得分:4)

为了访问GUI的元素(TextBox,Label,...),您需要在UI线程中运行。 DataReceived正在另一个线程中运行。您可以像Invoke一样通过Invoke更改为UI线程

void SetLabel(String s)
{
   if (this.InvokeRequired) {
      this.Invoke (new Action<String>(SetLabel), s);
      return;
   }

   Label1.Text = s;
}

但要注意 - 如果您需要访问GUI的不同部分(例如Label TextBox),您应该“收集”那些Invoke,因为每次调用都需要一些时间。您也可以考虑使用BeginInvoke而不是Invoke来阻止接收线程。但是,您应该在MSDN或谷歌中阅读有关这些详细信息的更多困难示例。

答案 1 :(得分:0)

在Form1_Load方法中,您使用port来引用SerialPort对象,但在事件处理程序中,您使用porta_serial