Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблемы с выравниванием...  (Прочитано 9177 раз)
0 Пользователей и 1 Гость смотрят эту тему.
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« : 26-05-2006 12:35 » 

Пришу модуль для связи с приборами, так как   потом прибется писать кучу простеньких тестилок, изначально взял следующую структуру
Есть ATL модуль содержащий различные спецефичесике функции и преобразования и есть проект на VB6 который используя этот модуль опращивает через сокет  приборы и визуализирует данные.

Итого на форме есть компонент ВинСоск, через который цепляемся к порту утстроства, есть загруженный мой atl модуль. Схема работы Создается описаная в АТЛ структура, заполняются значения, вызывается соотвествующий метод, который из этой структуры формирует пакет для отправки на прибор и возвращает в виде строки, строка отправляется через сокет, чрез негоже получаем ответ передаем полученую строку методу по котрой он формирует и возвращает структуру.

Код VB
Код:
Dim dls As New DLS_ClientsLib.VzletArh
Dim ds As dls_Query_Pak

ds.Start = &H11
ds.id_pak = &HF000000F
ds.id_counter = &HE000000E
ds.id_param = &HA00A
ds.id_RetType = &H99
ds.m_LenData = &H88
ds.m_Data(0) = &H77
ds.m_Data(1) = &H66
ds.Stop = &H22
s = dls.dls_DlsPakToStr(ds)

WinS.SendData   s
     
описание типа данных в MIDL
Код:
typedef struct dls_Query_Pak
    {
    BYTE Start;
    long id_pak;
    long id_counter;
    short id_param;
    BYTE id_RetType;
    BYTE m_LenData;
    BYTE m_Data[ 2 ];
    BYTE Stop;
    } dls_Query_Pak;

Как сформировать пакет на основании структуры, так как прибор умный то нужно только уложить все поля структуры  в буфер сформировать из нее строку и вернуть в бейсик
getpak(dls_Query_Pak * pPak)
{
char b[sizeof  dls_Query_Pak+1];
memcpy(b,pPak,sizeof  dls_Query_Pak]);

...
}

Но тут начинается трабл ... оказывается структура не монолитна  после выполнения memcpy b содержит  лишние байты......

   [0x0]   0x11 '?'   char
   [0x1]   0x00   char
   [0x2]   0x00   char
   [0x3]   0x00   char

   [0x4]   0x0f '?'   char
   [0x5]   0x00   char
   [0x6]   0x00   char
   [0x7]   0xf0 'р'   char
   [0x8]   0x0e '?'   char
   [0x9]   0x00   char
   [0xa]   0x00   char
   [0xb]   0xe0 'а'   char
   [0xc]   0x0a '?'   char
   [0xd]   0xa0 ' '   char
   [0xe]   0x99 '™'   char
   [0xf]   0x88 '?'   char
   [0x10]   0x77 'w'   char
   [0x11]   0x66 'f'   char
   [0x12]   0x22 '"'   char
   [0x13]   0x00   char
   [0x14]   0xcc 'М'   char
Есть идеи как с этим бороться ?

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


« Последнее редактирование: 15-12-2007 19:29 от Алексей1153++ » Записан

Да да нет нет все остальное от лукавого.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 26-05-2006 13:03 » 

PSD, таки не понятно, где не правильно (в памяти или еще где) и какой ты хаос создал? Суть примерно ясна. Просто расскажи что, где и когда тебе нужно получить.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 29-05-2006 04:51 » 

Я вобщемто это и пытался сделать... но видимо 8 часаов дебага сделали свое дело....

Структура ПО

1) Сервер связи, VC7.0, рабатает не посредственно с "тупыми" приборами, с точки зрения клиента это TCP/IP порт к которому можно присоеденися и отсылая структуры вида 

рис 1
Код:
#define DLS_DATA_FRAME 32
typedef struct dls_Query_Pak
{   BYTE Start; //Признак начала пакета
long id_pak;//индатификатор пакета
long id_counter;//Индатификатор прибора
short id_param;//индатификатор параметра
BYTE id_RetType;//код ожидаемого типа данных
BYTE m_LenData;// Длина поля данных для команд требующих пересылки параметра
BYTE m_Data[DLS_DATA_FRAME];//собственно поле данных
    BYTE Stop;//признак конца пакета

}dls_Query_Pak;
Получить данные в виде пакета тогоже формата при этом в поле данных будет лежать значение запрошеного параметра в формате согласно значениею поля
id_RetType. Особенность заключается в том что не которые наши контролеры специально  запрограмированы и поддерживают этот же протокол(TCP/IP порт и запросы указаного вида.... те клиент должен бы в итоге работать как через сервер так и на прямую с утройством)


2) ATL модуль (VC7.0) имплементирующий ряд функций, восновном перобразования структуры в строку и наоборот  (вижуал бейсик не умеет этого делать а принимать в качестве параметра метода me.Winsock1.SendData труктуру отказывается...)

3)Тестовое приложение на VB которое  имеет несколько объектов Winsock(один к серверу другие напрямую к устроствам )  и загруженный ATL модуль.
Схема работы такая
1) из ATL библиотеки берется стркутура  (рис 1), заполняется,
2) вызывается метод(из ATL) который выполняет преобразование структуры с строку(на самом деле просто копирует область памяти и говорит "Это строка" ),
3)строка передается  в качестве параматра Winsock1.SendData,
4) на принимающей стороне сервер накладывает на буфер этуже структуру
(описана в одном файле и инклюдятся и в проект сервера и в проект ATL),
5)формирует ответ, отсылает клинету,     
6)клиет принимает пакет (опятьже в виде строки) и передает ее другой функции ATL объекта
7) Функция копирует строку в другую область памяти и говорит  "Это структура" и возвращает ее



Эта схема великолепно работала при обмене через сревер, но при попыке присоеденится к устройству начались проблемы... разбор показал что на устройство приходит пакет длиней чем должен быть...
Расмотрев ситуацию я обнаружил что по какойто причине структура не монолинатна, и содержить не используемые ячейки памяти (что привел в табличке с дамбом) при этом количество байт прибавляемыхк структуре меняется взависимости от длинны структуры. Выравнивание? Но если это вы равнивание то какого рожна появляются те три байта в начале структуры?Не понял





 




 
« Последнее редактирование: 29-05-2006 04:53 от PSD » Записан

Да да нет нет все остальное от лукавого.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 29-05-2006 05:19 » 

Варианты:
a) Заяви выравнивание 1 для этой структуры.
б) Сделай аналогичную структуру, но с выравниванием 1, перед посылкой и после передачи перекидывай между ними данные.
в) Сделай ф-ию-конвертор, которая скопирует из выровненной таблицы в буфер byte[] по заранее известным позициям.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 29-05-2006 05:36 » 

а)  пробовал .... в этом случае структура в сишной компоненте не накладывается на данные сформированные бейсиком  (изза тех самых 3х байт в начале, откуда они берутся ? в каком месте написано что такое вообще может быть ), сейчас на свежую голову поробую пересобрать все проекты может чего упустил....


б) А как указать выравнивание для отдельно взятой структуры?

в) Такой варинт я рассматривал как последний, ибо дополнительные накладные расходы в узком месте ....



Записан

Да да нет нет все остальное от лукавого.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 29-05-2006 06:02 » 

PSD, вспомнил. Васик наверно variant или string передал - у него в начале 4 байта длины всего блока, включая эти 4 байта.

б) см. директивы компилятора и какие атрибуты можно навесить.

в) Не так уж много. Думаю васик больше тормозит.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 29-05-2006 06:51 » 

Б) а это в принципе возможно изменить выравнивание для отдельной структуры? Меня учили что это распостроняется на всесь модуль.....
Записан

Да да нет нет все остальное от лукавого.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 29-05-2006 07:43 » 

PSD, лучше доку почитать.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 29-05-2006 07:50 » 

вопрос закрыт (покрайней мере надеюсь)
Папашу дорсера спасло

#pragma pack(push, 1)
.....

#pragma pack(pop)


плюс ручное убивание компеляций, плюс акуратная пересборка всех проектов в правельном порядке......
Записан

Да да нет нет все остальное от лукавого.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines