C#:线程安全串行输入
C#: Thread Safe Serial Input
我正在设计一个程序来从串行手持扫描仪获取输入并将其与充满零件号的组合框进行比较。手持扫描仪读取数据矩阵并将其与所选零件进行比较。这是目前的代码
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
System.ComponentModel.IContainer components = new System.ComponentModel.Container();
SerialPort serialPort1 = new System.IO.Ports.SerialPort(components);
serialPort1.PortName = "COM10";
serialPort1.BaudRate = 57600;
serialPort1.Parity = Parity.None;
serialPort1.StopBits = StopBits.One;
serialPort1.DataBits = 8;
serialPort1.Handshake = Handshake.None;
serialPort1.DtrEnable = true;
serialPort1.Open();
serialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
} // end form1()
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
textBox1.Text = indata;
if (indata == comboBox1.Text)
{
this.BackColor = Color.Green;
}
else
{
this.BackColor = Color.Red;
}
} // end datareceivedhandler
private void button2_Click(object sender, EventArgs e)
{
this.Close();
} // end button2_Click
} // end class
我能够将数据获取到变量 "inData" 但出现此错误
'System.InvalidOperationException' 类型的未处理异常发生在 System.Windows.Forms.dll
附加信息:跨线程操作无效:控件 'textBox1' 从创建它的线程以外的线程访问。
我已经查阅了有关如何进行线程安全调用的帖子,但老实说我就是不明白。任何帮助或解释如何做到这一点,以便我能够学习,将不胜感激。
您得到异常是因为您无法从除 UI 线程之外的任何其他线程访问 gui。在主线程的上下文中使用 this.Invoke
到 运行 您的代码。
额外提示:定义一个 "end of input" 序列,例如让扫描仪在每个条形码的末尾发送 CRLF。将您从串行端口获得的所有内容附加到 StringBuilder
,直到您收到的数据包含 CRLF。 (即:使 StringBuilder
成为实例变量并允许多次调用该事件)。然后才处理条形码。
问题是串行输入数据可能高度分散。我们通常每次事件只能得到 3 或 4 个字符。
我正在设计一个程序来从串行手持扫描仪获取输入并将其与充满零件号的组合框进行比较。手持扫描仪读取数据矩阵并将其与所选零件进行比较。这是目前的代码
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
System.ComponentModel.IContainer components = new System.ComponentModel.Container();
SerialPort serialPort1 = new System.IO.Ports.SerialPort(components);
serialPort1.PortName = "COM10";
serialPort1.BaudRate = 57600;
serialPort1.Parity = Parity.None;
serialPort1.StopBits = StopBits.One;
serialPort1.DataBits = 8;
serialPort1.Handshake = Handshake.None;
serialPort1.DtrEnable = true;
serialPort1.Open();
serialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
} // end form1()
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
textBox1.Text = indata;
if (indata == comboBox1.Text)
{
this.BackColor = Color.Green;
}
else
{
this.BackColor = Color.Red;
}
} // end datareceivedhandler
private void button2_Click(object sender, EventArgs e)
{
this.Close();
} // end button2_Click
} // end class
我能够将数据获取到变量 "inData" 但出现此错误
'System.InvalidOperationException' 类型的未处理异常发生在 System.Windows.Forms.dll
附加信息:跨线程操作无效:控件 'textBox1' 从创建它的线程以外的线程访问。
我已经查阅了有关如何进行线程安全调用的帖子,但老实说我就是不明白。任何帮助或解释如何做到这一点,以便我能够学习,将不胜感激。
您得到异常是因为您无法从除 UI 线程之外的任何其他线程访问 gui。在主线程的上下文中使用 this.Invoke
到 运行 您的代码。
额外提示:定义一个 "end of input" 序列,例如让扫描仪在每个条形码的末尾发送 CRLF。将您从串行端口获得的所有内容附加到 StringBuilder
,直到您收到的数据包含 CRLF。 (即:使 StringBuilder
成为实例变量并允许多次调用该事件)。然后才处理条形码。
问题是串行输入数据可能高度分散。我们通常每次事件只能得到 3 或 4 个字符。