Obsługa portu Com /RS/

0

Hej, od jakiegoś czasu męczę się z napisaniem kodu w C#, który poprawnie obsługiwałby port COM. Chodzi mi o to, abym mógł przesłać dane po czym mają do mnie wrócić wyświetlając się na ekranie. Póki co posługując się MSDN napisałem taki kod:

 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.IO.Ports;

namespace serialports1
{
    class Program
    {
        static void Main(string[] args)
        {
            SerialPort _serialPort = new SerialPort();
            string[] _serialName = SerialPort.GetPortNames();

            Console.WriteLine(_serialName[0]);

            _serialPort.PortName = _serialName[0];
            _serialPort.BaudRate = 9600;
            _serialPort.Parity = Parity.None;
            _serialPort.StopBits = StopBits.One;
            _serialPort.DataBits = 8;
           

            _serialPort.DataReceived += new SerialDataReceivedEventHandler(_serialDatataReceived);
          
            

            try
            {
                _serialPort.Open();
               
            }
            catch (Exception error)
            {
                Console.WriteLine("ERROR: "+error);
            }
            _serialPort.WriteLine("hello!");
            Console.ReadLine();
        }
        private static void _serialDatataReceived(object sender,SerialDataReceivedEventArgs e)
        {
            var port = (SerialPort)sender;
            string msg = port.ReadExisting();
            Console.WriteLine(msg);
        }
    }
}

Do symulacji portów COM używam Virtual Serial Port Driver 8.0. Wysyłanie danych działa, jednak mam problem z ich odebraniem. Użyłem debuggera i okazało się że zdarzenie SerialDataReceived w ogóle nie jest wywoływane. Czy mógłby ktoś udzielić wskazówek jak poprawić kod? Byłbym bardzo wdzięczny:)

1

Kiedyś (w .net 2.0) pisałem aplikację, która używała portu COM, tworząc pętlę (do komunikacji używane były 2 i 3 pin), nie wdając się w szczegóły tak wyglądało moje otwarcie portu:

_serialPort = new SerialPort(_portName, _portBaudRate, Parity.None, 8, StopBits.One);
_serialPort.Handshake = Handshake.None;
_serialPort.ReadTimeout = _devicePollTimeout;
_serialPort.WriteTimeout = _devicePollTimeout;
_serialPort.DataReceived += new SerialDataReceivedEventHandler(SerialPortDataReceived);
_serialPort.Open();

_portBaudRate było 4800,
_portName był COM1.
_devicePollTimeout to był timeout na odczyt/zapis.

Na 100% działało w fizycznym środowisku, jeżeli nie zadziała u Ciebie, to stawiałbym na ten Virtual Serial Port Driver.

Pozdrawiam.

0

Ok działa :) Przyjrzałem się lepiej temu emulatorowi, myślałem że zmostkowane są piny RX TX tego samego portu a jednak były COM1->COM2. Wystarczyło otworzyć kolejny port, wywołać dla niego przerwanie i hula:) Do zamknięcia:)

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