SerialPort BytesToRead возвращает более высокое значение, чем ожидалось - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть микроконтроллер (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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...