نمایش نتایج 1 تا 3 از 3

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

  1. #1

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

    با سلام خدمت دوستان من می خواستم با دریافت بارکد از پورت سریال اطلاعات مورد نظزمو توی یک فرم نمایش بدم ولی در رویداد 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();

    }



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

  2. #2

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

    سلام

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

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

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

       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);   }

  3. #3

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

    در حالت کلی اینجوری میشود :

       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));           }       }   }

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •