2013-05-14 86 views
0

UPDATE讀取數據與RFID

我讀了,並簽署它的值到我textbox.text
它在我第一次通過我的卡片RFID Reader時工作,但形成第二次通過卡片,而不是在我的textbox.text上顯示整個卡片的ID,它只顯示卡片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(); 
     } 
    } 
} 

回答

4

爲了訪問GUI(TextBox,Label,...)的元素,您需要在UI線程中運行。 DataReceived正在另一個線程中運行。您可以通過調用這樣

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

    Label1.Text = s; 
} 

變成UI線程但要注意 - 如果你需要訪問的GUI(如標籤文本框)的不同部分,你應該「收」那些調用的,因爲每一個電話需要一些時間。你也可以考慮BeginInvoke而不是Invoke來阻止接收線程。但是,您應該閱讀MSDN或谷歌中有關更多難題的詳細信息。

+0

我在哪裏打電話?在我的'DataReceived'中? 此外,我得到這個'沒有超載'SetLabel'匹配委託'System.Action'。在'this.Invoke(new Action(SetLabel),s);' – PlayHardGoPro 2013-05-14 19:01:06

+0

是的,只要你需要寫入一些控件的數據。 – JeffRSon 2013-05-14 19:03:14

+0

錯誤怎麼樣? = x – PlayHardGoPro 2013-05-14 19:05:42

0

在你Form1_Load方法,您使用port參考你的SerialPort的對象,但在你的事件處理程序,使用porta_serial

+0

對不起,MyBad。這是正確的,我只是忘了在這裏改變。 問題是,我使用的是使用'COM1'端口的軟件......我只是不知道爲什麼它沒有引發錯誤。現在它正在閱讀...謝謝@Steve – PlayHardGoPro 2013-05-14 18:30:59

+0

但現在,我收到了一個不同的錯誤。我會更新我的問題 – PlayHardGoPro 2013-05-14 18:34:22