У меня есть микроконтроллер (vcom), который отправляет 140 байт в мс, поэтому я точно знаю объем данных, ожидаемый после мс, с и т. Д. При отладке SerialPort.BytesToRead при первом вызове в DataReceivedHandler он показывает значения выше 4000.Я также ожидаю, что мои данные начнутся с 0xAA, 0x55, потому что это первые байты, отправленные микроконтроллером, но оказывается, что это не всегда принимается.Я отбрасываю входящий буфер после открытия порта.
Независимо от вышеуказанного подхода, я также пытался запустить таймер, установленный на 1 мс, и вызвал comport.BytesToRead внутри таймера с тем же результатом.
Есть ли у вас какие-либо объяснения для меня?
public void SetComConnectParam(string portName)
{
if (m_serialPort.IsOpen == false)
{
m_serialPort.PortName = portName;
m_serialPort.BaudRate = 1408000;
m_serialPort.Parity = Parity.None;
m_serialPort.DataBits = 8;
m_serialPort.StopBits = StopBits.One;
m_serialPort.ReceivedBytesThreshold = 1; //default = 1
}
}
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
//if (e.EventType == SerialData.Eof){return;}
SerialPort comport = sender as SerialPort;
if (comport == null || comport.BytesToRead == 0 || !comport.IsOpen) { return; }
int dataLength = comport.BytesToRead;
byte[] buffer = new byte[dataLength];
int nbrDataRead = comport.Read(buffer, 0, dataLength);
if (nbrDataRead == 0) { return; }
// add new items to the queue
incomingdataQueue.Enqueue(buffer.Take(nbrDataRead).ToList());
}
private bool ComOpen()
{
// Closing serial port if it is open
if (m_serialPort != null && m_serialPort.IsOpen)
{
m_serialPort.Close();
System.Threading.Thread.Sleep(1000);
}
if (false == m_serialPort.IsOpen)
{
try
{
m_serialPort.Open();
m_serialPort.DiscardInBuffer();
}
catch { return false; }
}
return true;
}