Допустим, я хочу иметь функцию, которая читает данные из SerialPort
и возвращает байт [].
public byte[] RequestData(byte[] data)
{
//See code below
}
Что-то настолько простое, что это действительно не работает / не работает и не очень надежно:
byte[] response = new byte[port.ReadBufferSize];
port.Open();
port.Write(data, 0, data.Length);
Thread.Sleep(300); //Without this it doesn't even work at all
Console.WriteLine("Bytes to read: {0}", port.BytesToRead);
int count = port.Read(response, 0, port.ReadBufferSize);
Console.WriteLine("Read {0} bytes", count);
port.Close();
port.Dispose();
return response.GetSubByteArray(0, count);
Я также попытался заменить Thread.Sleep на что-то вроде:
while (port.BytesToRead < 14)
{
//Maybe Thread.Sleep(10) here?
}
Но это вызывает проблемы. (PS: я знаю, что мне нужно по крайней мере 14 байтов)
Конечно, лучшим способом (я думаю) было бы иметь что-то вроде:
port.ReceivedBytesThreshold = 14;
port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
port.Open();
port.Write(data, 0, data.Length);
А потом, конечно, есть обработчик:
void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
var port = (SerialPort)sender;
while (port.BytesToRead > 0)
{
//Read the data here
}
}
Но тогда я не могу вернуть данные в результате функции, которую я хотел определить?
Код клиента, использующий это, должен был бы подписаться на событие, вызванное этим кодом,
но тогда как он узнает, что ответ на самом деле является ответом на только что сделанный запрос.
(может быть отправлено несколько сообщений, и я могу представить, что одному сообщению потребуется больше времени для обработки на другой стороне, чем другому, или что-то в этом роде).
Любой совет будет приветствоваться
UPDATE
Следующий код работает намного лучше, но если я удалю операторы Thread.Sleep (), он снова перестанет работать правильно. Например, инструмент мониторинга последовательного порта четко указывает, что 17 последовательных байтов были записаны в последовательную линию. В первый раз BytesToRead = 10 и в следующий раз BytesToRead = 4, но затем BytesToRead остается 0, так куда же делись последние 3 байта?
void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Thread.Sleep(100);
while (port.BytesToRead > 0)
{
Console.WriteLine("Bytes to read: {0}", port.BytesToRead);
var count = port.BytesToRead;
byte[] buffer = new byte[count];
var read = port.Read(buffer, 0, count);
if (count != read)
Console.WriteLine("Count <> Read : {0} {1}", count, read);
var collectAction = new Action(() =>
{
var response = dataCollector.Collect(buffer);
if (response != null)
{
this.OnDataReceived(response);
}
});
collectAction.BeginInvoke(null, null);
Thread.Sleep(100);
}
}