Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ошибка чтения с портов 
V
    Опции темы
Severyanin
Дата 11.12.2008, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 31.7.2007
Где: Россия, Омск

Репутация: нет
Всего: 9



Работаю с железкой. напарник написал программу, которая работает корректно, но выполняет немного не те функции, которые мне нужны. я пишу свою. оба считываем с порта данные следующим образом:
Код

while(!finish)
          {
            DWORD num;
            DWORD num2;
            ReadFile(port, &buff[bytes_received], 2, &num, &Overlapp);
            if(WaitForSingleObject(Overlapp.hEvent, 10000) == WAIT_OBJECT_0)
              {

                GetOverlappedResult(port, &Overlapp, &num2, false);
                bytes_received = bytes_received + num;
                //data_to_rec = data_to_rec - num;
                if(bytes_received == 512)
                  {
                  //читаем CS
                    ReadFile(port, &Command[0], 3, &num, &Overlapp);
                    if(WaitForSingleObject(Overlapp.hEvent, 10000) == WAIT_OBJECT_0)
                      {
                        GetOverlappedResult(port, &Overlapp, &num, false);

                      }
                    finish = true;
                  }
              }

порт инициализирован одинаково абсолютно. проблема в том, что в том байте буфера, где у напарника хранится A6, у меня 0xFFFFFFA6. если честно. я не представляю, как такое число может храниться в переменной типа char, но отладчил Билдера показывает именно так. И при копировании в структуру данной информациии это. видимо приводит к тому, что у меня получается значение напряжений -38 порядка. подскажите, пожалуйста, в чем может быть проблема


--------------------
"Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл
"Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов 
PM MAIL WWW ICQ   Вверх
dumb
Дата 11.12.2008, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



unsigned char buff[n]?
PM MAIL   Вверх
Severyanin
Дата 11.12.2008, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 31.7.2007
Где: Россия, Омск

Репутация: нет
Всего: 9



да. я подозреваю, что в лданном случае процессор организовал выравнивание по границе двойного слова. Вот как это обойти, я не понимаю. стандаотные средства типа &0x000000FF не работают


--------------------
"Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл
"Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов 
PM MAIL WWW ICQ   Вверх
dumb
Дата 11.12.2008, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



выравнивание чего? - байта?!
ты привел не тот кусок. показывай все путешествие байта из буфера в структуру с описанием типа участвующих переменных. где-то по пути есть signed тип.
PM MAIL   Вверх
GremlinProg
Дата 11.12.2008, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



dumb, правильно подсказывает, у 0xa6 старший бит установлен, следовательно любое знаковое преобразование типов, например: (int)(char)0xa6 или (short)(char)0xa6 будет заполнять все последующие, при расширении, биты единицами
в коде ты приводишь только чтение данных, подозреваю, что при их обработке существуют преобразования типа
DWORD x = buff[i];
int y = buff[i];
или любые летучие вычисления с этими типами данных
поставь тип буфера в unsigned char и проблема решится


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Severyanin
Дата 11.12.2008, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 31.7.2007
Где: Россия, Омск

Репутация: нет
Всего: 9



Цитата

де-то по пути есть signed тип.

он не по пути, он - конечная цель. часть из этих данных становятся float, то есть копируются в поля структуры с плавающей точкой. с помощью memcpy
Код

memcpy(&measure,buff,512);
.
больше знаковых типов нет вроде. но этот фокус с выарвниванием происходит еще до копирования в структуру


--------------------
"Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл
"Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов 
PM MAIL WWW ICQ   Вверх
dumb
Дата 11.12.2008, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



стоп. а мы случаем не исключительно о "показе отладчиком" говорим? ибо билдер unsigned char'ы в форме hex'а просто неправильно показывает: расширение знаковое всегда делает.
PM MAIL   Вверх
Severyanin
Дата 12.12.2008, 07:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 31.7.2007
Где: Россия, Омск

Репутация: нет
Всего: 9



да, об отладчике. Но в структру данные попадают неправильно, так что, видимо, дополнение происходит не только в отладчике. Потому что появляются дикие цифры типа 2б45377785Е-35, хотя hex-представление считанных пакетов совпадает с верным, где в этом же поле записано что-то типа 15,2


--------------------
"Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл
"Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов 
PM MAIL WWW ICQ   Вверх
dumb
Дата 13.12.2008, 01:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



выравнивание убери в структуре:
Код

#pragma pack(push,1)
struct blabla {
 ...
};
#pragma pack(pop)


и в следующий раз приводи описание типов переменных, участвующих в порождении мистификационного зла.
PM MAIL   Вверх
Severyanin
Дата 13.12.2008, 05:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 31.7.2007
Где: Россия, Омск

Репутация: нет
Всего: 9



Сделал, но так и не работает. результат тот же.
Вот описание структуры:
Код

struct TOporaMeasures
{
 
  unsigned char UserName[24];
  unsigned char OporaNumber[24];
  unsigned short UstanovkaYear;
  unsigned short R_Zemli;
  unsigned char OporaType[24];
  unsigned short cur_year;
  unsigned char cur_month;
  unsigned char cur_day;
  
  
  unsigned long umd;


  float Measures_Per_Sec;   
 
  unsigned short ItokZero;
 
  unsigned short UameZero;
  
  unsigned short UateZero;
 
  unsigned short UapeZero;
  

  float qvU0;
  float U0;
  
  float skoU0;


  float qvUate;
  float Uate;
  
  float qvU0te;
  float U0te;
  
  float qvIte;
  float Ite;
 
  float Rte;




  
  float R_shunt;

  
  unsigned long qvT1;

 
  short qvI1;   
  float I1;
  
  float qvU1;
  float U1;
 
  float R_beton;
  
  float R_gran;
  
  float U2;
  
  float I2;
  
  float I3;
  float qvI3;
  
  float U3;
  float qvU3;
  
  unsigned long qvT3i;

  
  unsigned long qvT3u;

  
  unsigned long qvTau1i;
  float Tau1i;
 
  unsigned long qvTau1u;
  float Tau1u;
  
  float R_e;
  
  float C1i;
  
  float C1u;
  
  float DeltaU;
 
  unsigned char K2;   
  
  float R21;   

  
  float U0p;

  
  unsigned long qvT10;


  short qvI10;
  float I10;
 
  float qvU10;
  float U10;
 
  float R_beton0;
  
  float R_gran0;
  
  float U20;
 
  float I20;
 
  float I30;
  float qvI30;
  
  float U30;
  float qvU30;
  
  unsigned long qvT3i0;

 
  unsigned long qvT3u0;

  
  unsigned long qvTau1i0;
  float Tau1i0;
 
  unsigned long qvTau1u0;
  float Tau1u0;
  
  float R_e0;
 
  float C1i0;
 
  float C1u0;
 
  float DeltaU0;
 
  unsigned char K3;
  
  float R210;  


  unsigned long qvT4;

  //
  short qvUc;
  float Uc;
 
  unsigned long qvT5;


  float qvUc5;
  float Uc5;
  
  unsigned long qvTau2;
  float Tau2;
  
  float C2;

 
  
  float qvUop;
  float Uop;
  
  float qvU0op;
  float U0op;
 
  float qvIop;
  float Iop;
  
  float Rrast;

    
  float Istek;

 
  
  unsigned char K;

 
  float K1;
  char qvK1;
  
 
  unsigned char next_day;
  unsigned char next_month;
  unsigned short next_year;
};


Все переменные типа float  получают дикие значения
Буферный массив - тип unsigned char


--------------------
"Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл
"Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов 
PM MAIL WWW ICQ   Вверх
J0ker
Дата 13.12.2008, 06:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: -1
Всего: 14



Цитата(Severyanin @  11.12.2008,  14:05 Найти цитируемый пост)
часть из этих данных становятся float, то есть копируются в поля структуры с плавающей точкой. с помощью memcpy

что значит "становится"? каким образом? вы копируете целочисленное значение во float через memcpy?


--------------------
user posted image
PM MAIL   Вверх
Severyanin
Дата 13.12.2008, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 31.7.2007
Где: Россия, Омск

Репутация: нет
Всего: 9



я копирую буфер, который мне приходит с устройства в структуру с помощью memcpy


--------------------
"Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл
"Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов 
PM MAIL WWW ICQ   Вверх
dumb
Дата 13.12.2008, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



Цитата(Severyanin @  13.12.2008,  09:27 Найти цитируемый пост)
я копирую буфер, который мне приходит с устройства в структуру с помощью memcpy 
это что, структура выданная производителем девайса? - жуть.
вобщем налицо либо просто несоответствие структуры и приходящих данных, либо несоответствие выравнивания.
PM MAIL   Вверх
J0ker
Дата 13.12.2008, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: -1
Всего: 14



Цитата(Severyanin @ 13.12.2008,  08:27)
я копирую буфер, который мне приходит с устройства в структуру с помощью memcpy

формат чисел с плавающей точкой может отличаться
у вас есть спецификация интерфейса девайса?


--------------------
user posted image
PM MAIL   Вверх
Severyanin
Дата 15.12.2008, 06:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 31.7.2007
Где: Россия, Омск

Репутация: нет
Всего: 9



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


--------------------
"Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл
"Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов 
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0591 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.