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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: не могу "отловить" константу 0x00 из COM порта  (Прочитано 12279 раз)
ритт
Гость
« Ответ #15 : Август 05, 2009, 08:12 »

2. как этот код вообще работает? говоришь, что Code обрабатывает по пять бит, а читаешь килобайтовыми кусками...
или я что-то не доглядел?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


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

2 VAP ,

ты хоть сам понимаешь что хочешь? (что делаешь) ? Улыбающийся
Записан

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

 Привожу результаты моих исследований:
 
Код
C++ (Qt)
qint len = port->bytesAvailable();
//возвращает количество байт, которые доступны для чтения.
1. Из порта считываю количество байт, равное количеству приходящих символов(байтов). Символы 5 битовые в hex-формате. Все эти данные должны считываться через буфер. Размышления на счет размера буфера. Его размер, в моем случае  критичен, если будет меньше количества доступных для чтения байт (len). Большее количество символов, чем 1024 отправлено не будет. Еще можно поставить ограничение условием:
     
Код
C++ (Qt)
if (len > sizeof(buf_r))
                              len = sizeof(buf_r);
 

2. Если считывать побайтно, т.е.
 
Код
C++ (Qt)
qint64 n = port->read((char*)&buf_r, 1);
if (n <= len)                
     dataPtr = (unsigned char*)&buf_r;                
     Code c(*dataPtr);
     v = qVariantFromValue(c);                                                
     Code code = v.value<Code>();
     switch (code) {
     case 0x1B: // не определяет
         mode = 1;
         stk.push(mode);
     break;
     case 0x1F: // не определяет
         mode = 2;
         stk.push(mode);
     break;
     default:  
     marker = stk.top();
     decode(marker, code);
 
     QTextStream out(stdout);
     out << code;
     [\code]              
Служебные маркеры в этом случае не определяются. В варианте 1 и варианте 2 на консоль данные выводятся в десятичном формате, но в первом определяются по case маркеры, а во втором нет. Ну и общее, для обоих вариантов, почему удаляет нули в начале комбинации и добавляет их потом в конец всей комбинации.
0x1F     0x03   0x1B    0x16
000031 00003 000027 000022    будет  принято как  31000030000270000220000.
 
0x00     0x03   0x1B    0x16
00000   00003 000027 000022    принят так              0000030000270000220000.
 
хотя доверяя "выводу на консоль" в общем-то, все правильно: нули впереди просто удаляются за ненадобностью в десятичном представлении, а добавляясь в конец комбинации, сам нуль ничего не значит(хотя зачем тогда добавляет?).
Записан
f-r-o-s-t
Гость
« Ответ #18 : Август 05, 2009, 21:07 »

Код
C++ (Qt)
qint len = port->bytesAvailable();
//возвращает количество байт, которые доступны для чтения.
не знаю типа что слева от присваивания, но это не суть =)

Код
C++ (Qt)
 
     dataPtr = (unsigned char*)&buf_r;                
     Code c(*dataPtr);
     v = qVariantFromValue(c);                                                
     Code code = v.value<Code>();
 
Может все таки расскажешь смысл этих магических преобразований ?

нули впереди просто удаляются за ненадобностью в десятичном представлении, а добавляясь в конец комбинации, сам нуль ничего не значит(хотя зачем тогда добавляет?).
Ничего не удаляется и сзади не приписывается, это порядок байт меняется.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


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

Цитировать
Символы 5 битовые в hex-формате.
1. режим порта 5 Data Bits ?
2. если символ в hex формате , например "0x00", "0x01" и т.п. то это уже по 4 символа! Улыбающийся
3. Если делаешь case 0x1B - то это значит что ЗНАЧЕНИЕ = 27 DEC! и т.п.
4. Если ты принимаешь байт = 0x1B - он определится по любому

Цитировать
Служебные маркеры в этом случае не определяются. В варианте 1 и варианте 2 на консоль данные выводятся в десятичном формате, но в первом определяются по case маркеры, а во втором нет. Ну и общее, для обоих вариантов, почему удаляет нули в начале комбинации и добавляет их потом в конец всей комбинации.
0x1F     0x03   0x1B    0x16
000031 00003 000027 000022    будет  принято как  31000030000270000220000.
 
0x00     0x03   0x1B    0x16
00000   00003 000027 000022    принят так              0000030000270000220000

если тебе передают байты с значениями  1F     0x03   0x1B    0x16 - то ты их так и примешь с этими же значениями и в этом же порядке!

ВЫВОД: значит ты что-то неправильно делаешь!

так что тебе конкретно передается? данные в виде:

[00][00][1F][00][00][03][00][00][1B][00][00][16] Непонимающий??

Скачай для начала сниффер COM портов и проверь в нем что тебе приходит! А потом уже разбирайся!
ЗЫ: и не путай тут нас Улыбающийся
Записан

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

передают байты со значениями  от 0x00 до 0x1F (32 комбинации). Что-то не правильно делаю, без сомнения.
Спасибо за подсказки и что такое сниффер COM портов?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


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

Цитировать
Спасибо за подсказки и что такое сниффер COM портов?
это такие программулины, которые позволяют:
1. Либо вручную набирать пакет данных и писать его в порт
2. Либо читать пакеты данных из порта
3. Либо, если у тебя есть неизвестный девайс и он работает с неизвестным приложением (имеется ввиду с неизвестным протоколом обмена) - то сниффер может трассировать (т.е. внедряться и показывать листинг обмена данными между неизвестным девайсом и неизвестным приложением) Улыбающийся

В твоем случае нужен п.2. т.е ты береш сниффер, настраиваеш его на прием данных от девайса и смотриш что по настоящему приходит тебе от девайса.. А потом добиваешься такого же приема данных, используя не сниффер - а твое приложение.. т.е. подгоняешь под сниффер Улыбающийся , ищеш ошибки и т.п.
Записан

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


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