чудо взаимодействия последовательных портов с консольным приложением C # - PullRequest
0 голосов
/ 19 января 2012

Перед этим вопросом я отправляю аналогичный вопрос на Событие SerialPort DataReceived .

Итак, прежде всего, позвольте мне сначала извиниться за создание дублирующего вопроса.
Но если вы увидите ниже кодирование меня, вы обнаружите, что я пытаюсь несколькими способами (я имею в виду, немного другой подход), чтобы получить лучшее решение, которое должно взаимодействовать с последовательными портами.

Итак, допустим, у меня есть один проект консольного приложения.

namespace ConsoleApplication2
{
class Program
{
    static void Main(string[] args)
    {
        MyTest obj = new MyTest();
    }
}
}

Затем два класса, называемые MyTest и MyTest2 ...

MyTest

namespace ConsoleApplication2
{
public class MyTest
{
    public SerialPort SPCOM4;

    public MyTest()
    {

        SPCOM4 = new SerialPort();
        SPCOM4.DataReceived += new SerialDataReceivedEventHandler(SPCOM4_DataReceived);
        if(this.SerialPortOpen(SPCOM4, "4"))
        {
            this.SendToPort(SPCOM4, "[Class Name]MyTest1...");
            MyTest2 objMyTest2 = new MyTest2();                
            Console.ReadLine();
        }

    }

    void SPCOM4_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        string data = SPCOM4.ReadExisting();
        Console.Write(data.Replace("\r", "\n"));
    }

    private bool SerialPortOpen(System.IO.Ports.SerialPort objCom, string portName)
    {
        bool blnOpenStatus = false;
        try
        {
            objCom.PortName = "COM" + portName;
            objCom.BaudRate = 9600;
            objCom.DataBits = 8;

            int SerParity = 2;
            int SerStop = 0;

            switch (SerParity)
            {
                case 0:
                    objCom.Parity = System.IO.Ports.Parity.Even;
                    break;
                case 1:
                    objCom.Parity = System.IO.Ports.Parity.Odd;
                    break;
                case 2:
                    objCom.Parity = System.IO.Ports.Parity.None;
                    break;
                case 3:
                    objCom.Parity = System.IO.Ports.Parity.Mark;
                    break;
            }

            switch (SerStop)
            {
                case 0:
                    objCom.StopBits = System.IO.Ports.StopBits.One;
                    break;
                case 1:
                    objCom.StopBits = System.IO.Ports.StopBits.Two;
                    break;
            }

            objCom.RtsEnable = false;
            objCom.DtrEnable = false;
            objCom.Handshake = System.IO.Ports.Handshake.XOnXOff;
            objCom.Open();
            blnOpenStatus = true;

        }
        catch (Exception ex)
        {
            throw ex;
        }
        return blnOpenStatus;
    }

    private bool SendToPort(System.IO.Ports.SerialPort objCom, string strText)
    {
        try
        {
            int STX = 0x2;
            int ETX = 0x3;

            if (objCom.IsOpen && strText != "")
            {
                objCom.Write(Char.ConvertFromUtf32(STX) + strText + Char.ConvertFromUtf32(ETX));
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
        return true;
    }
}
}

MyTest2

namespace ConsoleApplication2
{
public class MyTest2
{
    public SerialPort SPCOM4;

    public MyTest2()
    {

        SPCOM4 = new SerialPort();
        SPCOM4.DataReceived += new SerialDataReceivedEventHandler(SPCOM4_DataReceived);
        if(this.SerialPortOpen(SPCOM4, "4"))
        {
            this.SendToPort(SPCOM4, "[Class Name]MyTest2...");
            Console.ReadLine();
        }

    }

    void SPCOM4_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        string data = SPCOM4.ReadExisting();
        Console.Write(data.Replace("\r", "\n"));
    }

    private bool SerialPortOpen(System.IO.Ports.SerialPort objCom, string portName)
    {
        bool blnOpenStatus = false;
        try
        {
            objCom.PortName = "COM" + portName;
            objCom.BaudRate = 9600;
            objCom.DataBits = 8;

            int SerParity = 2;
            int SerStop = 0;

            switch (SerParity)
            {
                case 0:
                    objCom.Parity = System.IO.Ports.Parity.Even;
                    break;
                case 1:
                    objCom.Parity = System.IO.Ports.Parity.Odd;
                    break;
                case 2:
                    objCom.Parity = System.IO.Ports.Parity.None;
                    break;
                case 3:
                    objCom.Parity = System.IO.Ports.Parity.Mark;
                    break;
            }

            switch (SerStop)
            {
                case 0:
                    objCom.StopBits = System.IO.Ports.StopBits.One;
                    break;
                case 1:
                    objCom.StopBits = System.IO.Ports.StopBits.Two;
                    break;
            }

            objCom.RtsEnable = false;
            objCom.DtrEnable = false;
            objCom.Handshake = System.IO.Ports.Handshake.XOnXOff;
            objCom.Open();
            blnOpenStatus = true;

        }
        catch (Exception ex)
        {
            throw ex;
        }
        return blnOpenStatus;
    }

    private bool SendToPort(System.IO.Ports.SerialPort objCom, string strText)
    {
        try
        {
            int STX = 0x2;
            int ETX = 0x3;

            if (objCom.IsOpen && strText != "")
            {
                objCom.Write(Char.ConvertFromUtf32(STX) + strText + Char.ConvertFromUtf32(ETX));
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
        return true;
    }
}
}

После того, как я запустил свое приложение, я обнаружил, что выводимое сообщение отличается от ожидаемого.

"[Class Name]MyTest2..."

выходит только это сообщение.

Мой вопрос: почему приведенный ниже код работает неправильно? Почему DataReceived Event не запускается для первого метода.

this.SendToPort(SPCOM4, "[Class Name]MyTest1...");

Пожалуйста, дайте мне предложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...