C# DLL последовательной связи - PullRequest
0 голосов
/ 21 апреля 2020

Я разрабатываю в DLL протокол последовательной связи. У меня есть класс по этому вопросу, там я разделил разными способами:

  1. Открытая последовательная связь.
  2. Запись и чтение данных (на PL C).
  3. Закрытие последовательной связи.

Из проекта, использующего DLL, я могу открывать и закрывать последовательная связь, но когда я использую запись, обработчик событий никогда не активируется. Я не понимаю почему. Я попытался разработать код для тестирования последовательной связи в отдельном проекте (без DLL), он отлично работает, и я могу общаться с PL C. Так что я подумал, что, возможно, мне придется поддерживать библиотеку DLL, я использовал некоторые таймеры, но они не работали.

Последовательный класс в DLL:

            public class Serial
            {
             SerialPort com = new SerialPort(GlobalData.PLC_ADDRESS, 9600, Parity.None, 8, StopBits.One);

              public void Open()
                {
                  // Read event handler
                    com.DataReceived += new SerialDataReceivedEventHandler(com_DataReceived);

                    // Set the read/write timeouts
                    com.ReadTimeout = 400;
                    com.WriteTimeout = 400;
                    // Open the port for communication.
                    com.Open();
    }

           public void Talk2PLC()
            {
                byte[] cmd = { 17, 3, 0, 64, 0, 100, 71, 101};
                com.Write(cmd, 0, cmd.Length);
    }


        public void com_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
 Console.WriteLine($"Inside com_DataReceived");

            // Buffer and process binary data
            while (com.BytesToRead > 0)
                PlcBuffer.Add((byte)com.ReadByte());
}
        public void Close()
        {
                // Close the port
                com.Close();


    }
}

Из проекта который использует DLL с этими методами, я вызываю сначала Open (), затем Talk2PL C.

Я также использовал «IsOpen» в DLL, чтобы проверить, открыт порт или нет, я не копировал здесь, чтобы иметь более четкий код.

Что я должен сделать, чтобы код вошел в "com_DataReceived (...)"? Я написал Console.WriteLine (..), чтобы проверить, когда он входит.

1 Ответ

0 голосов
/ 21 апреля 2020

Я пытался с Mitsubishi, я не нашел никаких проблем, может сделать com.DtrEnable = true до com.Open ()

...