SerialDataReceivedEventHandler с С# и ПЛК (не запускающее событие)

Я получил свой ПЛК для связи с моим приложением С#, использующим nModBus, но сейчас я постоянно читаю все входы ПЛК, пробегая цикл for.

Я хочу создать свой код так, что только когда часть данных будет получена через последовательный порт, тогда он запустит цикл for для чтения через каждый вход и определит, какой вход в частности является высоким.

Вот что у меня есть. Я установил точки останова, и мой код никогда не входит в метод DataReceivedHandler. Я вручную включаю высоковольтные входы ПЛК (используя перемычку). Любые предложения или комментарии?

пространство имен WindowsFormsApplication2 {static class Program {

public static void Main()
 {
 SerialPort mySerialPort = new SerialPort("COM1");

 mySerialPort.BaudRate = 38400;
 mySerialPort.Parity = Parity.Odd;
 mySerialPort.StopBits = StopBits.One;
 mySerialPort.DataBits = 8;
 mySerialPort.Handshake = Handshake.None;
 mySerialPort.ReadBufferSize = 4096;
 mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

 IModbusSerialMaster master = ModbusSerialMaster.CreateRtu(mySerialPort);
 Console.WriteLine("Press any key to continue...");
 Console.WriteLine();
 Console.ReadKey();
 mySerialPort.Close();
 }

 public static void DataReceivedHandler(object sender,SerialDataReceivedEventArgs e)

 {
 SerialPort sp = (SerialPort)sender;
 string indata = sp.ReadExisting();
 Console.WriteLine("Data Received:");
 Console.Write(indata);
 }
1 ответ

Пусть ваш компьютер будет мастером, но опросите это событие. Когда это ИСТИНА, ТОГДА сделайте "массовое" комм, затем попросите ваш компьютер/мастер сбросить "событие".

Я бы сделал это "событие" отдельным "событием связи" с фактическим пользовательским интерфейсом. Сделайте это "CommEvent", установите ПЛК (когда произойдет реальное событие), и ПК/мастер очистит его, как только он закончит массовое сообщение.

Read CommEvent
if CommEvent is TRUE
 Do BulkReads
 Clear CommEvent

licensed under cc by-sa 3.0 with attribution.