Работа с com портом

Fueldims

Добрый день, требуется дальнейшая работа с com портом после принятия определенных данных, как реализовать?
using System;
using System.IO.Ports;
 
class PortDataReceived
{
    public static void Main()
    {
        SerialPort mySerialPort = new SerialPort("COM5");
 
        mySerialPort.BaudRate = 9600;
        mySerialPort.Parity = Parity.None;
        mySerialPort.StopBits = StopBits.One;
        mySerialPort.DataBits = 8;
        mySerialPort.Handshake = Handshake.None;
 
        mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
 
        mySerialPort.Open();
 
        Console.WriteLine("Press any key to continue...");
        Console.WriteLine();
        Console.ReadKey();
        mySerialPort.Close();
   
 
 
    }
 
    public static void myParser() {
        Console.WriteLine("Входящий вызов");
        mySerialPort.WriteLine(""); // Здесь это недопустимо
    }
    
    public static void DataReceivedHandler(
                        object sender,
                        SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        string indata = sp.ReadExisting();
        Console.WriteLine("Data Received:");
        Console.Write(indata);
        if (indata.IndexOf("RING") > -1)
        {
            myParser();           
        }
 
 
    }
}
Заранее спасибо.
6 ответов

Fueldims

Что-то ничего тут не понятно, в этом коде... Поиском по форуму воспользуйтесь, было несколько тем именно по работе с последовательным портом.


Fueldims

Нужно чтоб при поступлении данные (RING) запускалась функция myParser, и шла работа с ком портом, но в ней нельзя использовать метод mySerialPort.WriteLine("");


Fueldims

Какая именно работа? Прием, анализ, передача? Тут же не экстрасенсы, угадывать не могут. Почему WriteLine нельзя? У порта кроме этого и еще есть методы, какие проблемы? Какой тип данных используете?


Fueldims

Еще раз. Слушаю ком порт. При чтении сообщения (например RING) надо произвести запись в ком порт (mySerialPort.WriteLine("...."), для этого во входящем сообщении ищу подстроку, при нахождении ее запускаю функцию myParser(); в нем и прописываю запись в ком порт (mySerialPort.WriteLine("...."), но на это говорит что данные элемент не существует в текущем контексте, видимо проблема с областью видимости, как мне обратно вернуться к управлению порта а затем снова его слушать?


Fueldims

Во первых, уйдите от консольки, там точка входа - статичный метод, и все остальные приходится так объявлять. Дальше, в ветке по WinForm, вот тут: Возникает ошибка "необработанное исключение типа System.StackOverflowException" хорошо рассматривалась работа с портом, и примеров там достаточно. Да и на MSDN их хватает. Читайте, пробуйте.


Fueldims

Решено!
using System;
using System.IO;
using System.IO.Ports;
 
public class PortDataReceived
{
    static SerialPort mySerialPort = new SerialPort("COM5");
    public static void Main(string[] args)
    {
        mySerialPort.BaudRate = 2400;
        mySerialPort.Parity = Parity.None;
        mySerialPort.WriteTimeout = 500; mySerialPort.ReadTimeout = 500;
        mySerialPort.StopBits = StopBits.One;
        mySerialPort.DataBits = 8;
        mySerialPort.Handshake = Handshake.RequestToSend;
        mySerialPort.DtrEnable = true;
        mySerialPort.RtsEnable = true;
        mySerialPort.NewLine = System.Environment.NewLine;
        mySerialPort.Open();
        System.Threading.Thread.Sleep(500);
        
        mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
 
        Console.WriteLine("Press any key to continue...");
        Console.WriteLine();
        Console.ReadKey();
        mySerialPort.Close();
    }
 
    private static void DataReceivedHandler(
                        object sender,
                        SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        string indata = sp.ReadExisting();
        Console.WriteLine("Data Received:");
        Console.Write(indata);
        if (indata.IndexOf("RING") > -1)
        {
            //mySerialPort.WriteLine("AT+CMGL=\"ALL\"");
            mySerialPort.WriteLine("ATA");
            System.Threading.Thread.Sleep(500);
            while (mySerialPort.BytesToRead > 0)
            {
                try
                {
                    Console.WriteLine(mySerialPort.ReadLine());
                }
                catch { }
            }
        }
 
 
    }
}