Отображение данных в списке из COM-порта - PullRequest
0 голосов
/ 05 января 2012

У меня 2 кнопки. Кнопка Connect (открыть com-порт) и Disconnect (закрыть порт). Когда я нажимаю на кнопку подключения, таймер будет запускать и отображать данные в Listbox через com-порт каждые несколько секунд. Когда я нажимаю «Отключить» и снова нажимаю кнопку «Подключить», данные не будут отображаться в списке и таймер не сработает Почему это так?

Вот мои коды:

    List<byte> buffer = new List<byte>(125);
    private void btnConnect_Click(object sender, EventArgs e)
    {

        if (serialPortN.IsOpen)
            serialPortN.Close();
        try
        {
            {

                serialPortN.PortName = "COM8";
                serialPortN.BaudRate = 9600;
                serialPortN.Parity = Parity.None;
                serialPortN.DataBits = 8;
                serialPortN.StopBits = StopBits.One;
                serialPortN.Encoding = System.Text.Encoding.ASCII;
                serialPortN.ReadTimeout = 500;
            }

            serialPortN.Open();
            label1.Text = "COM8" + " is opened";


            System.Timers.Timer timer = new System.Timers.Timer();
            timer.Interval = 5000;
            timer.Elapsed += new ElapsedEventHandler(TimerElapsed);
            timer.Start();

            serialPortN.DataReceived += new SerialDataReceivedEventHandler(datareceived);


            btnDisconnect.Enabled = true;
            btnConnect.Enabled = false;

        }

        catch (Exception ex)
        {
            MessageBox.Show(ex.Message.ToString());
        }
    }
     void datareceived(object sender, SerialDataReceivedEventArgs e)
    {
        myDelegate d = new myDelegate(update);
        listBox1.Invoke(d, new object[] { });

    }

    public void update()
    {

        while (serialPortN.BytesToRead > 0)
            buffer.Add((byte)serialPortN.ReadByte());
        // Call a routine to process the data.          
        ProcessBuffer(buffer);
     }

  private void ProcessBuffer(List<byte> buffer)
    {
       int numberOfBytesToRead = 125;
        if (buffer.Count >= numberOfBytesToRead)
        {
            this.Invoke(new Action(() =>
             Console.WriteLine(string.Format("SPO = {0}, PulseRate = {1}, Time = {2}",
                                                    buffer[43].ToString(),
                                                    buffer[103].ToString(),
                                                    DateTime.Now.ToString()
            ))));

            buffer.RemoveRange(0, numberOfBytesToRead);
        }

    }

   void TimerElapsed(object sender, ElapsedEventArgs e)
    {

        int numberOfBytesToRead = 125;
        if (buffer.Count >= numberOfBytesToRead)
        {
            this.Invoke(new Action(() =>
            listBox1.Items.Add(string.Format("SPO = {0}, PulseRate = {1}, Time = {2}",
                                                    buffer[43].ToString(),
                                                    buffer[103].ToString(),
                                                    DateTime.Now.ToString()
            ))));
            buffer.RemoveRange(0, numberOfBytesToRead);

        }

Спасибо всем!

1 Ответ

0 голосов
/ 05 января 2012
  1. First off - Измените listbox1.Invoke to this.Invoke в полученных данных.
  2. Дважды проверьте COM-порт - Если вы используете последовательное USB-устройство, оно может переименовывать себя при смене USBпорты и через перезагрузку.
  3. Установить timer.AutoReset = true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...