Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Склейка шестнадцатиричных чисел, чтение с COMпорта


Автор: mdlv 1.2.2013, 10:35
Здравствуйте!
Нужно читать шестнадцатиричные числа с com порта:
Код

....
unsigned char res[4096];
ReadFile(Cport[comport_number], res, size, (LPDWORD)((void *)&n), NULL);
...
for(i=0; i < n; i++){
 .... res[i] ....
}

1) Как будет выглядеть каждый элемент полученного массива res: "FF", "F" или 0xFF?

2)Нужно склеить их в одно шестнадцатиричное число вида:
0xFF008F750592,
причем числа, у которых впереди ноль (00, 05 и т.п.), нужно записывать с этим нулем.
Как это можно сделать на Си (не плюсах)?

Спасибо!

Автор: feodorv 1.2.2013, 12:58
Цитата(mdlv @  1.2.2013,  11:35 Найти цитируемый пост)
Как будет выглядеть каждый элемент полученного массива res: "FF", "F" или 0xFF?

Каждый элемент массива будет представлять собой число в диапазоне 0-255, а уж как Вы его представите, в виде ли "FF" или 0xFF - это уже от Вас зависит)))

Цитата(mdlv @  1.2.2013,  11:35 Найти цитируемый пост)
Нужно склеить их в одно шестнадцатиричное число вида

Вам 64-битное число или его строковое представление?


Цитата(mdlv @  1.2.2013,  11:35 Найти цитируемый пост)
(LPDWORD)((void *)&n)

Что это??? Какого типа у Вас переменная n?

Автор: mdlv 1.2.2013, 13:48
Цитата(feodorv @  1.2.2013,  12:58 Найти цитируемый пост)
Вам 64-битное число или его строковое представление?

Надо число.

Цитата(feodorv @  1.2.2013,  12:58 Найти цитируемый пост)

(LPDWORD)((void *)&n)

Что это??? Какого типа у Вас переменная n?


Переменная типа int. 

Формат функции ReadFile:
BOOL ReadFile(
  HANDLE       hFile, // описатель CОМ порта
  LPVOID       lpBuffer, // Указатель на буфер, который принимает прочитанные данные из порта
  DWORD        nNumberOfBytesToRead,// Число байтов, которые читаются из порта
  LPDWORD      lpNumberOfBytesRead, // Указатель на переменную, которая получает число прочитанных байтов
  LPOVERLAPPED lpOverlapped    // Указатель на структуру OVERLAPPED.
);

Автор: feodorv 1.2.2013, 16:07
Цитата(mdlv @  1.2.2013,  14:48 Найти цитируемый пост)
Надо число.

Код

unsigned __int64 num = 0;
...
// Вариант1
if( n >= 8 )
  num = *(unsigned __int64 *) res;

// Вариант 2.1
if( n >= 8 )
  num = ((unsigned __int64) res[0] << 56) | ((unsigned __int64) res[1] << 48) |
        ((unsigned __int64) res[2] << 40) | ((unsigned __int64) res[3] << 32) |
        ((unsigned __int64) res[4] << 24) | ((unsigned __int64) res[5] << 16) |
        ((unsigned __int64) res[6] << 8) | ((unsigned __int64) res[7]);

// Вариант 2.2
if( n >= 8 )
  for( num = 0, i =0; i <8; i++) num = (num << 8) | (unsigned __int64) res[i];

// Вариант 3.1
if( n >= 8 )
  num = ((unsigned __int64) res[7] << 56) | ((unsigned __int64) res[6] << 48) |
        ((unsigned __int64) res[5] << 40) | ((unsigned __int64) res[4] << 32) |
        ((unsigned __int64) res[3] << 24) | ((unsigned __int64) res[2] << 16) |
        ((unsigned __int64) res[1] << 8) | ((unsigned __int64) res[0]);

// Вариант 3.2
if( n >= 8 )
  for( num = 0, i =0; i <8; i++) num = (num << 8) | (unsigned __int64) res[8-i-1];

в зависимости от порядка посылаемых байт...


Цитата(mdlv @  1.2.2013,  14:48 Найти цитируемый пост)
Формат функции ReadFile:
BOOL ReadFile(
  HANDLE       hFile, // описатель CОМ порта
  LPVOID       lpBuffer, // Указатель на буфер, который принимает прочитанные данные из порта
  DWORD        nNumberOfBytesToRead,// Число байтов, которые читаются из порта
  LPDWORD      lpNumberOfBytesRead, // Указатель на переменную, которая получает число прочитанных байтов
  LPOVERLAPPED lpOverlapped    // Указатель на структуру OVERLAPPED.
); 

И что? Это как-то оправдывает такое:
Цитата(mdlv @  1.2.2013,  11:35 Найти цитируемый пост)
(LPDWORD)((void *)&n)


Писали бы сразу 
Код
DWORD i, n;

На худой конец 
Код
unsigned int i, n;

А то эти преобразования типа указателя до добра не доведут...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)