C# Automatyczny odczyt portu COM

0

Witam,

mam napisaną aplikację, w której chodzi o odczytywanie danych z portu COM. Póki co mam tą funkcję zrealizowaną za pomocą przycisku (po wciśnięciu dopiero zostają odczytane dane). Próbowałem i myślałem i nie mogę rozwiązać problemu na to, aby odczyt danych z portu COM odbywał się automatycznie w momencie nadawania danych do komputera przez port. Myślę, że jest to możliwe ponieważ w najprostszym terminalu jest taka zasada działania. Wklejony kod jest kodem z jednego okna (plik Form.cs). Z góry dziękuję za wszelką podpowiedź.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;

namespace WindowsFormsApplication3
{
    public partial class Form2 : Form
    {
        SerialPort port = new SerialPort(" ", 9600, Parity.None, 8, StopBits.One);          //deklaracja portu szeregowego

        public Form2()
        {
            InitializeComponent();
            String[] ports = SerialPort.GetPortNames();                                     //przypisanie aktywnego nr portu COM
            foreach (String x in ports)
             comboBox1.Items.Add(x);                                                     //wyświetlenie nazwy aktywnego portu COM
           

            button2.Enabled = false;
            button3.Enabled = false;

            if (port.IsOpen == true)
            {
                pictureBox1.Visible = true;
                pictureBox2.Visible = false;
            }
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            button2.Enabled = true;
            button3.Enabled = true;
        }

        private void button2_Click(object sender, EventArgs e)      // przycisk "połącz"
        {
            if (port.IsOpen == false)
            {
                port.PortName = comboBox1.SelectedItem.ToString();
                port.Open();
            }

            if (port.IsOpen == true)
            {
                pictureBox1.Visible = true;
                pictureBox2.Visible = false;
            }
        }
}
 
1

Wystarczy zajrzeć do dokumentacji klasy SerialPort i znaleźć zdarzenie DataReceived: http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived%28v=vs.100%29.aspx

0

Ok, dziękuję.

Ale patrzę na tą pomoc i w sumie nie wiem w jaki sposób umieścić to w moim kodzie;/ Jestem początkującym w programowaniu obiektowym i jeszcze mam problemy w zorientowaniu się w tych obiektach, klasach. Czy mógłby ktoś bardziej mnie naprowadzić na prawidłowy tok myślenia?

1

To jest tzw. event, żeby nauczyć się go obsługiwać przeczytaj ten artykuł, powinien dużo wyjaśnić http://msdn.microsoft.com/en-us/library/aa645739(v=vs.71).aspx

EDIT
Tutaj tez po polsku http://4programmers.net/C_Sharp/Wprowadzenie/Rozdział_6 -> Zdarzenia

0

Ok, dzięki wielkie :)

Mam jeszcze jedno pytanie: jeśli port COM odczytuje wiele znaków (np. 15), a ja zapisuje do pliku jedynie np. 10 znaków, to po kolejnym odbiorze danych wyświetlają mi się również "pozostałości" po poprzednich danych. Czy można w jakiś sposób wyczyścić bufor portu COM po każdorazowym odbiorze danych?

EDIT
znalazłem coś na temat DiscardInBuffer() oraz DiscardOutBuffer() . Użyłem tej drugiej opcji jednak nic to nie dało. Ktoś wie dlaczego?

0

Może metodą DiscardInBuffer?

0

Już działa. Miałem drobny błąd w programie. Wszystko działa. Dziękuję za wsparcie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1