Я разрабатываю в DLL протокол последовательной связи. У меня есть класс по этому вопросу, там я разделил разными способами:
- Открытая последовательная связь.
- Запись и чтение данных (на PL C).
- Закрытие последовательной связи.
Из проекта, использующего 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 (..), чтобы проверить, когда он входит.