#c# #.net #serial-port #eventhandler
#c# #.net #последовательный порт #обработчик событий
Вопрос:
Я использую SerialDataReceivedEventHandler
SerialPort
класс для связи с устройством последовательного порта. Я отправляю код SCPI на устройство с помощью SerialPortObject.Write(command)
команды where, которая имеет строковый тип. Затем устройство ответит строкой, которая собирается обработчиком событий и считывается в переменную с помощью SerialPortObject.ReadLine()
.
Я отправляю различные команды на последовательный порт, например, для получения скорости или положения шагового двигателя и хочу сохранить их в string speed
или string position
соответственно. Однако обработчик событий может читать только строку, отправленную устройством, не зная, в какой переменной оно должно хранить данные. Решение состоит в том, чтобы вводить SerialPortObject.ReadLine()
команду после каждой SerialPortObject.Write()
команды, однако это приостанавливает поток, и Windows останавливается до тех пор, пока устройство не ответит, что иногда может быть длинным, в то время как обработчик событий будет делать это асинхронно.
string position, speed;
SerialPortObject.DataReceived = new SerialDataReceivedEventHandler(DataReceivedHandler);
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
var input = SerialPortObject.ReadLine();
}
public void CurrentPosition()
{
//This requests for the current position (command is specific to the device)
SerialPortObject.Write("?X");
}
public void Speed()
{
//This requests for the current position (command is specific to the device)
SerialPortObject.Write("?V");
}
Мой вопрос
Как я могу SerialDataReceivedEventHandler
распознать, какой из CurrentPosition()
or Speed()
вызвал событие, и поместить ответ устройства в position
and speed
соответственно.
Ответ №1:
Я думаю, вам следует сохранить состояние, какая команда была отправлена последней, например, с перечислением. Или отправляющая сторона должна добавить (если это возможно) запрошенный параметр.