Я хотел бы отправлять и получать байты через последовательный порт.Мой приемник должен получать байты асинхронно.Я написал небольшой пример ниже, который, кажется, работает, но он оставляет меня с нерешенным чувством.
Должен ли я действительно использовать WriteLine, ReadLine?Как написано сейчас, возможно ли, что код в обработчике события m_port_DataReceived будет вызываться для каждого байта?Это было мое понимание события «DataReceived»;возможно я ошибаюсьБлокирует ли ReadLine, пока не увидит символ конца строки?
Должен ли я каким-либо образом использовать конструкцию if (e.EventType == SerialData.Eof) в обработчике событий?Вы можете видеть, что я это закомментировал.Я попробовал это и не мог заставить это работать.Когда можно ожидать SerialData.Eof?Моя идея заключалась в том, что я мог бы подождать, пока все байты присутствуют, прежде чем вызвать «ReadExisting»Однако утверждение «if» никогда не оценивается как true.Заставить код перейти в ReadExisting, однако, правильно прочитал все байты.
В общем, как лучше настроить мой код для получения байтов, поступающих через последовательный порт?Отправитель будет отправлять небольшие куски байтов каждые 125 мсек, но не будет отправлять специальные символы.Пакеты байтов разнесены во времени, поэтому я не думаю, что есть проблема смешивания пакетов вместе.Более того, проблема в том, что «как только вы увидите один байт, прочитайте все, если вы будете ждать очень короткое время, вы получите все».Учитывая этот сценарий, есть ли предпочтительный способ?
Заранее спасибо, Дейв
public class SerialPortController
{
SerialPort m_port;
public SerialPortController(bool server)
{
if (server)
{
m_port = new SerialPort("COM4");
m_port.BaudRate = 115200;
m_port.Open();
byte[] sillyBytes = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7 };
ASCIIEncoding encoding = new ASCIIEncoding();
string output_string = encoding.GetString(sillyBytes);
m_port.WriteLine(output_string);
//m_port.Write(sillyBytes, 0, 8);
}
else
{
m_port = new SerialPort("COM5");
m_port.DataReceived += new SerialDataReceivedEventHandler(m_port_DataReceived);
m_port.BaudRate = 115200;
m_port.Open();
}
int character = Console.Read();
}
void m_port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//if (e.EventType == SerialData.Eof)
{
// string answer = m_port.ReadExisting();
string answer = m_port.ReadLine();
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] byte_answer = encoding.GetBytes(answer);
}
}
}