PDA

View Full Version : سوال: دریافت خطا هنگام نمایش فرم در رویداد datareceive پورت سریال



rapmanesh_boys
دوشنبه 02 خرداد 1390, 01:46 صبح
با سلام خدمت دوستان من می خواستم با دریافت بارکد از پورت سریال اطلاعات مورد نظزمو توی یک فرم نمایش بدم ولی در رویداد datareceive وقتی از showdialog استفاده میکنم با اروری مواجه می شم که میگه برای این کار باید از thread STA استفاده کنم.برای این کار یه ترد نوشتم که بازم به showdialog گیر میده و خطای زیرو میده:
the calling thread must be sta, because many ui components require this
تردی که نوشتم به شکل زیره:
string bar;

private void Datareceive(object sender, SerialDataReceivedEventArgs e)
{
bar = serial.ReadExisting();
Thread t = new Thread(new ThreadStart(mem_info));
t.SetApartmentState(ApartmentState.STA);
t.Start();
}

static public void mem_info()
{
Member_Info f = new Member_Info(bar);
f.ShowDialog();

}


لطفا دوستانی که با ترد آشنایی دارن راهنمایی کنن که این تردو چطوری بنویسم؟

jblaox
سه شنبه 29 شهریور 1390, 03:13 صبح
سلام

احتمالا شما مشکلتون حل کردید ، اما برای آیندگان ....

نیازی به ترد نیست ، من هم مشکل شما را داشتم ...........
میشود مشکل ساده تر حل کرد ...

بعد از اینکه پورت باز کردی و ... برای رویداد دریافت اطلاعات از پورت سریال اینجوری عمل کنید :

private void serialPort1_DataReceived (object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { RxString = serialPort1.ReadExisting(); this.Invoke(new EventHandler(DisplayText)); }

سپس به راحتی میتوانید آن را مثلا در یک تکس باکس نمایش بدهید ، مثلا اینجوری :

private void DisplayText(object sender, EventArgs e) { textBox1.AppendText(RxString); }

jblaox
سه شنبه 29 شهریور 1390, 03:22 صبح
در حالت کلی اینجوری میشود :

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace SimpleSerial { public partial class Form1 : Form { // Add this variable string RxString; public Form1() { InitializeComponent(); } private void buttonStart_Click(object sender, EventArgs e) { serialPort1.PortName = "COM1"; serialPort1.BaudRate = 9600; serialPort1.Open(); if (serialPort1.IsOpen) { buttonStart.Enabled = false; buttonStop.Enabled = true; textBox1.ReadOnly = false; } } private void buttonStop_Click(object sender, EventArgs e) { if (serialPort1.IsOpen) { serialPort1.Close(); buttonStart.Enabled = true; buttonStop.Enabled = false; textBox1.ReadOnly = true; } } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (serialPort1.IsOpen) serialPort1.Close(); } private void textBox1_KeyPress(object sender, KeyPressEventArgs e) { // If the port is closed, don't try to send a character. if(!serialPort1.IsOpen) return; // If the port is Open, declare a char[] array with one element. char[] buff = new char[1]; // Load element 0 with the key character. buff[0] = e.KeyChar; // Send the one character buffer. serialPort1.Write(buff, 0, 1); // Set the KeyPress event as handled so the character won't // display locally. If you want it to display, omit the next line. e.Handled = true; } private void DisplayText(object sender, EventArgs e) { textBox1.AppendText(RxString); } private void serialPort1_DataReceived (object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { RxString = serialPort1.ReadExisting(); this.Invoke(new EventHandler(DisplayText)); } } }