2017-01-04 3 views
0

Я рассмотрел несколько вопросов по этой теме, но ничто не дает мне решение.QT Последовательные данные о снижении

Тестирование по VM, у меня есть входящие данные длиной 47, 80 или 31 символа.

readyRead Последовательный порт подключен к:

void MainWindow::readData(){ 
    QString buf; 
    myByteArray = serial->readAll(); 
    for(int i = 0; i < myByteArray.size(); ++i){ 
     if(myByteArray.at(i) == '\n'){ 
      buf.append(myByteArray.at(i)); 
      qDebug() << buf << endl; 
      buf.clear(); 
     else{ 
      buf.append(myByteArray.at(i)); 
     } 

Я знаю, что каждое сообщение заканчивается «\ г \ п», поэтому мы используем, что в качестве отправной точки для завершения текущего сообщения.

Проблема, с которой я сталкиваюсь, состоит в том, что я могу получить чистое сообщение каждые 50. Он отбрасывает символы слева и справа. У меня есть текстовый файл, в котором отображаются сообщения, отправляемые по серийному номеру, поэтому я могу сравнить с тем, что получено, и отвратительно, как они выглядят.

Я пробовал readLine(), а также несколько других предложений в других потоках, и это всегда тот же результат.

Моя мысль состояла в том, чтобы проверить, соответствуют ли полученные сообщения длине ожидаемых, 47, 80 или 31 символов, а затем игнорируют те, которые не совпадают. Проблема в том, что я получаю фактическое чистое сообщение каждые 2 минуты .... может быть.

Если я сбрасываю то, что приходит по проводам, как только я его получаю, результаты действительно не отличаются от того, когда я буферизую данные.

Другой вопрос, который у меня есть, для каждого сообщения, которое я получаю, я пропустил около 3-4 в целом.

Любые предложения по тому, как справиться с этим лучше?

ответ

1

readAll возвращает все имеющиеся в наличии. Нет никакой гарантии, что все данные были получены. Я предполагаю, что ваши данные все еще передаются, когда вы совершаете этот звонок.

Вам необходимо прочитать данные до Вы получаете \r\n.

В зависимости от ваших потребностей, вы можете найти readLine удобства для использования.

+0

Одним из единственных согласований является прием символа \ n. Я вижу, что начало сообщения получено, а конец, но в середине, где символы теряются. Я пробовал читать readAll и readLine, и это относительно тот же результат. Я знаю, что отправлено полное сообщение, я просто не получаю его через этот последовательный порт. Какова моя следующая линия обращения? – bauervision

+0

@bauervision Это важный бит информации: он принадлежит самому вопросу. Вам нужно будет убедить нас, что вы действительно получаете только часть сообщения: например. используйте 'qDebug() << line.toHex();', где строка выводится из 'readLine'. Возможно, вы не используете управление потоком, и где-то вы перегружаете буфер. Скорее всего, вам нужно показать пример минимального кода, который демонстрирует проблему. –

+0

Baudrate = 38400, DataBits = 8, No Parity, One Stop, No Flow Control Это настройки, данные мне от администратора, не уверен, что изменение его на моем конце будет иметь значение или если оно нарушит соединение. Просто не знаю достаточно об этом. – bauervision

Смежные вопросы