Russian Qt Forum
Октябрь 01, 2024, 16:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: не могу "отловить" константу 0x00 из COM порта  (Прочитано 12202 раз)
VAP
Гость
« : Август 03, 2009, 18:50 »

Добрый день! Возникла проблема следующего характера: при чтении данных из последовательного порта нужно "отловить" константу 0х00, а она почему-то читается как простой 0. Все остальные читаются правильно (в HEX формате). Может у кого-то возникала подобная проблема?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Август 03, 2009, 19:26 »

покажи как читаешь
Записан

Юра.
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #2 : Август 03, 2009, 19:45 »

и в чем проблема то? как 0 преобразовать в 0х00 ? )
Записан

ArchLinux x86_64 / Win10 64 bit
VAP
Гость
« Ответ #3 : Август 03, 2009, 20:07 »

Читаю так: (собственно "маркеры" 0x1F 0x1B читаются без проблем)
                     ..........................
                     for (qint64 i = 0; i < len; i++) {
                           qint64 n = port->read((char*)&buf_r, 1024);
                           if (n != -1)
                               buf_r[n] = '\0';
                                           
                           dataPtr = (unsigned char*)&buf_r;               
                           Code c(*dataPtr);
                           v = qVariantFromValue(c);                                                 
                           Code code = v.value<Code>();
                           switch (code) {
                           case 0x1F:
                              mode = 1;
                              stk.push(mode);
                           break;
                           case 0x1B:
                              mode = 2;
                              stk.push(mode);
                           break;
                           default: 
                              int marker = stk.top();
                              decode(marker, code); 
                           }
                      }
Смысл преобразования 0 в 0x00? На передающей стороне передается именно 0х00!
Записан
denka
Гость
« Ответ #4 : Август 03, 2009, 20:19 »

Уважаемый объясните мне далекому разницу между 0 и 0x00 если честно я вижу разницу тока в системе счисления.
Записан
VAP
Гость
« Ответ #5 : Август 03, 2009, 20:34 »

Разницы нет, я согласен, но вопрос был поставлен как "отловить" эту константу.
Если добавлю в код вариант 0х00 или 0, - не определяет. (0 - вижу в консоли отладки).
Записан
denka
Гость
« Ответ #6 : Август 03, 2009, 20:44 »

Хотелось бы увидеть код при котором case не реагирует на 0, а так же производиться вывод консоль(то есть вывод чего именно?).

Еще что такое Code

И к чему эти преобразования?

Код:
Code c(*dataPtr);
v = qVariantFromValue(c);                                                 
Code code = v.value<Code>();
« Последнее редактирование: Август 03, 2009, 20:55 от den'ka » Записан
spectre71
Гость
« Ответ #7 : Август 03, 2009, 20:57 »

Наверное имеется ввиду что данные приходит ввиде строк "0x1F", "0x1B", "0x00", правильно?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #8 : Август 03, 2009, 21:08 »

Цитировать
Читаю так: (собственно "маркеры" 0x1F 0x1B читаются без проблем)
                     ..........................
                     for (qint64 i = 0; i < len; i++) {
                           qint64 n = port->read((char*)&buf_r, 1024);
                           if (n != -1)
                               buf_r[n] = '\0';
                                          
                           dataPtr = (unsigned char*)&buf_r;                
                           Code c(*dataPtr);
                           v = qVariantFromValue(c);                                                
                           Code code = v.value<Code>();
                           switch (code) {
                           case 0x1F:
                              mode = 1;
                              stk.push(mode);
                           break;
                           case 0x1B:
                              mode = 2;
                              stk.push(mode);
                           break;
                           default:  
                              int marker = stk.top();
                              decode(marker, code);  
                           }
                      }
ужоснах Улыбающийся

что за библиотеку используете?

и что за:
Код:
                           if (n != -1) 
                               buf_r[n] = '\0';
о_О  Зачем это? ??

и вообще...


« Последнее редактирование: Август 03, 2009, 21:16 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
VAP
Гость
« Ответ #9 : Август 04, 2009, 18:25 »

 Использую библиотеку qextserialport 1.1
 Представленная часть кода работоспособна

for (qint64 i = 0; i < len; i++) {
       qint64 n = port->read((char*)&buf_r, 1024); // вычитать из буфера содержимое
       if (n <= len)               
           dataPtr = (unsigned char*)&buf_r;               
           Code c(*dataPtr);     //отдельный класс Code для считывания 5 бит                 
            v = qVariantFromValue(c);                     
            Code code = v.value<Code>();
            switch (code) {
            case 0x00:   //вот здесь не определяет константу!
                  mode = 0;
                  stk.push(mode);
            break;
            case 0x1B:
                   mode = 1;
                   stk.push(mode);  // запись в стек
            break;
            case 0x1F:
                   mode = 2;
                   stk.push(mode);
            break;
            default: 
                   int marker = stk.top(); // чтение из стека
                   decode(marker, code); 
            }
            QTextStream out(stdout);  // Печать на консоль
            out << code;
}

При передаче данных, например: 0x00 0x01 0x03 0x27 0x04 0x31 0x22 0x24
Принимаю вот такую последовательность(на консоль): 00000100003000027000040000310000220000240000 (0x00 «разбивается» и нули добавляются в конец).  Почему так происходит именно с 0x00 не разобрался.
Записан
VAP
Гость
« Ответ #10 : Август 04, 2009, 18:34 »

Почему не отображается на форуме оператор присваимания для buf_r - большая загадка???
Записан
verzer
Гость
« Ответ #11 : Август 04, 2009, 19:23 »

Почему не отображается на форуме оператор присваимания для buf_r - большая загадка???
потому что [i] - это bb-тег курсива
нужно оформлять код соответсвующими тегами ([code] ..код.. [/code], либо [code=cpp]..C++/Qt код..[/code]), тогда и проблем не будет
Записан
spectre71
Гость
« Ответ #12 : Август 04, 2009, 20:12 »

Телепаты все в отпуске!
Ты так ничего и не объяснил!
1) В каком виде приходят данные??
2) Что это за Code??
3) Что это такое
Code code = v.value<Code>();
switch (code) {
.......
}
что за Code и как с ним вообще может работать switch

Записан
VAP
Гость
« Ответ #13 : Август 04, 2009, 20:34 »

Код
C++ (Qt)
class Code  
{
public:
   Code() {}
   Code(const Code &code) { data = code; }
   Code(unsigned char ch) { data = ch; }
 
   operator unsigned char() const { return data & 0x1f; }
 
protected:
   unsigned char data;
};
 
Q_DECLARE_METATYPE(Code);
 
QDataStream &operator << (QDataStream &out, const Code &code);
QDataStream &operator >> (QDataStream &in, Code &code);
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #14 : Август 05, 2009, 08:04 »

и я шото не могу вникнуть в суть проблемы:  Улыбающийся

1. зачем вообще использовать этот Code Непонимающий
2. Зачем читать вот так:
Код:
for (qint64 i = 0; i < len; i++) {
       qint64 n = port->read((char*)&buf_r, 1024); // вычитать из буфера содержимое
       if (n <= len) 
.....             
Непонимающий?
3. Зачем вообще все эти преобразования???

ЗЫ: я так и не понял что хотят, т.к. от всех этих преобразований теряю мыслю Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.22 секунд. Запросов: 23.