![]() |
|
![]() ![]() ![]() |
|
7BON |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 20.11.2015 Репутация: нет Всего: нет |
math64 прописал вот так
запись
чтение
посылку которую получаю совершенно другая (14 40 СЕ 6В 01 00 00 00), а нужно A5 01 00 04 00 00 00 CB к примеру, в чем может быть ошибка, что такая посылка идет? если прописать просто через QByteArray все получается. На рисунке, если видно Simple terminal в консоли не понятные символы кодировку я пробывал прописывать, но ничего не вышло прописал я так
как можно это исправить? Этот ответ добавлен с нового Винграда - http://vingrad.com |
||||||
|
|||||||
7BON |
|
|||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 20.11.2015 Репутация: нет Всего: нет |
||||
|
||||
math64 |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Запись:
1. Зачем сначала передаёшь буфер, а затем заполняешь данными? Нужно наоборот. 2. Так у тебя все данные запишутся 3 раза:
В цикле должно быть только out << frame.reserved[i]; Чтение: Здесь должно быть не заполнение frameread, а проверка, что прочитано правильно (и, естественно, после того, как прочитано): При чтении можешь ингорировать все до получения 0xA5, и только после этого читать фрейм. В принципе, можно не пользоваться QDataStream, а читать писать непосредственно в QByteArray |
||||
|
|||||
7BON |
|
||||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 20.11.2015 Репутация: нет Всего: нет |
можете скинуть пример, как проверить заполнение в QByteArray ![]()
я делал, но походу это не то. да и спасибо вам ![]() ![]() |
||||
|
|||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Я на предудущей странице этой темы показывал фрагмент моего SerialHelper.
В processData() ищется синхробайт (0xA5 в твоём случае), убеждаюсь что сообщение принято полностью (у меня в протоколе - второй байт - длина сообщения), проверяю контрольную сумму, если она совпадает, делаю messageReceived(char* buf, int len); и уже основная программа его обрабатывает. |
|||
|
||||
7BON |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 20.11.2015 Репутация: нет Всего: нет |
math64 можете объяснить:
1. что за переменная unprocessedData и для чего она? 2.
в этой строке создается массив и считывается с него байты, я понял так? 3.в этой строке
это наподибии вот этого?
4.
в этой строке прописать заместо byte 0xA5 для проверки я так понял? |
||||||||
|
|||||||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
1. unprocessedData - массив необработанных байтов.
2. ba - новые прочитанный байты. Добавляются к unprocessedData. 3. received - счетчик принятых байтов. Выводится в статус-строке. Необязательно. 4. processData выделяет в unprocessedData целое сообщение, т.е. ищет синхробайт 0xA5, проверяет что все данные считаны и контрольная сумма правильна, и делает emit messageReceived(buf, len); Если отсутствует синхробайт или контрльная сумма неправильна можешь делать emit garbageReceived(buf, len); - если хочешь обрабатывать мусор. Возвращает число обработанных байт, которые удаляются из unprocessedData. В слоте onMessageReceived(buf, len) разбираешь тело сообщения - можешь использовать QDataStream, можешь накладывать структуру или разбирать вручную (не забывай поменять порядок байт в слове). |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |