C# i obsługa serial port

  • 2 Odpowiedzi
  • 8579 Wyświetleń

0 użytkowników i 1 Gość przegląda ten wątek.

*

Offline omcdr

  • 20
C# i obsługa serial port
« dnia: Sierpień 27, 2008, 15:44:37 »

Moje pytanie dotyczy obsługi portu COM w C#. Po połączeniu z bluetooth SPP pojawia się wirtualny port COM7.
Mogę wysłać i odebrać dane, ale nie równocześnie, jeśli w programie jest wątek, który nasłuchuje na tym porcie, to nie mogę nic wysłać. Jeśli tego wątka nie ma to mogę wysłać, ale nie mam jak odebrać.

Można te dwie funkcje zmusić do współdziałania, aby można było wysyłać i odbierać dane ?
Ewentualnie jak inaczej sprawdzać, czy jest coś do odebrania na tym porcie COM ?


Cytuj
        private string Port = "COM7";
       
       
        private void mnuConnect_Click(object sender, EventArgs e)
        {
            serial = new SerialPort(Port);
            serial.ReadTimeout = 1000;

            try
            {
                if (!serial.IsOpen)
                {
                    textBox1.Text += "Output port closed. Opening output port...\r\n";
                    serial.Open();
                }
                textBox1.Text += "Ports opened. Starting the listener thread...\r\n";
                rcvThread = new Thread(new ThreadStart(ReceiveData));
                numThreads++;
                rcvThread.Start();
                textBox1.Text += "Listener thread started.";
                btnSend.Enabled = true;
                textBox1.Text += "Connected.\r\nInbound:" + inboundPort + "\r\nOutbound:" + outboundPort+"\r\n";
            }
            catch (Exception ex)
            {
            ...
            }
        }



        private void ReceiveData()
        {
            while (!closeRequested && !disconnectRequested)
            {
                try
                {
                    string line = serial.ReadLine();
                    if (line.CompareTo("quit$$$") == 0)
                    {
                        disconnectRequested = true;
                        continue;
                    }
                    txtLog.Invoke(new updateText(UpdateText), line);
                }
                catch
                {

                }
            }
        }
       

        private void btnSend_Click(object sender, EventArgs e)
        {
            try
            {
                serial.WriteLine(" tttteeeeeeexxxxxxxtttt\n");
            }
            catch (Exception ex)
            {
            }
        }


*

Offline malypb

  • *
  • 84
  • Sprzęt: Samsung i780, Mio 550, NavRoad 430BT, Nokia 330, Nokia 500
Odp: C# i obsługa serial port
« Odpowiedź #1 dnia: Sierpień 29, 2008, 21:04:55 »
Musisz wstrzymac odczyt portu na czas wysylania.
Jest na to wiele sposobow.
Albo uzyc mechanizmu WaitForCommEvent (z Win32 API - nie wiem jak sie nazywa odpowiednik w .NET).

Odp: C# i obsługa serial port
« Odpowiedź #2 dnia: Sierpień 29, 2008, 21:33:03 »
Witam

Nie ma takiej potrzeby, żeby tworzyć specjalny dodatkowy wątek do odbioru ... tym bardziej, że nie spełnia swojego zadania.
Klasa SerialPort posiada zdarzenie DataReceived do odbioru danych:
- odbiór jest asynchroniczy i wywoływany tylko wtedy jeśli coś znajdzie się w buforze odbiorczym
- nie ma pullingu więc nie ma obciążenia procesora.
Najwygodniej jest to wyklikać ;) ("położyć" SerialPort i wyklikać zdarzenie), ale jeśli trzeba to napisać:

Definicja zdarzenia:
Cytuj
     private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
     {           
     }

Oraz podpięcie tego zdarzenia do klasy:
Cytuj
     this.serialPort.DataReceived += new SerialDataReceivedEventHandler(this.serialPort_DataReceived);
« Ostatnia zmiana: Sierpień 29, 2008, 21:34:34 wysłana przez zwolenik »