更新
我正在阅读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();
}
}
}
答案 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
。