Меню

+7 (495) 785-95-25
sale@lcard.ru
sale@lcard.ru
Страницы 1
Возможно я неверно трактовал значение DataStep. Это общее количество данных на все каналы (в моем случае по 3200 записей с каждого канала) или количество данных с каждого канала?
Тут обе переменные были локальными...
Теперь непонятно другое.
Задаю
DWORD DataStep = 6400;
Каналов
ap.ChannelsQuantity = 0x2;
Управляющая таблица
ap.ControlTable[0]=2; //2-й канал, +-5В
ap.ControlTable[1]=3; //3-й канал, +-5В
В потоке записываю данные в файлы:
1)
// запишем полученную порцию данных в файл
if(!WriteFile( hFile, // handle to file to write to
IoReq[RequestNumber^0x1].Buffer, // pointer to data to write to file
2*DataStep, // number of bytes to write
&FileBytesWritten, // pointer to number of bytes written
NULL // pointer to structure needed for overlapped I/O
))
{ ReadThreadErrorNumber = 0x4; break; }
2)
f_out=fopen ("out.prn","a");
for (j=0;j<2*DataStep;j=j+2) //2 канала по DataStep отсчетов
{
fprintf (f_out,"%d\t",j);
fprintf (f_out,"%d\t",(int)IoReq[RequestNumber^0x1].Buffer[j]); //0,2,4,6...
fprintf (f_out,"%d\n",(int)IoReq[RequestNumber^0x1].Buffer[j+1]);//1,3,5,7...
}
fclose (f_out);
Первый кадр записывается в оба файла нормально.
Во время записи второго кадра сообщение об ошибке на строке записи
fprintf (f_out,"%d\t",(int)IoReq[RequestNumber^0x1].Buffer[j]); //0,2,4,6...
Ошибка: access violation at 9x32665a50: read of adress 0xf87f100c.
В файл Test.dat записывается только первый кадр.
В файл out.prn записывается примерно полтора кадра, каждый запуск по-разному. То 10558 (из 12800), то 10582, то 10536, то 10550 значений.
Отладчик показывает, в момент ошибки
j=10634, а
IoReq[RequestNumber^0x1].Buffer[j]=???.
Если смотреть данные, которые успели записаться в out.prn, то второй (неполный) кадр выглядит липой: скачки значений от 0 от 25000 и больше.
Где еще я некорректно мог использовать переменную, подскажите, пожалуйста?!?
Александр, добрый день!
Спасибо за помощь.
Нашел ошибку в коде. Целиком и полностью моя вина, глупейшая ошибка. Использовал "бездумно" Ваш код:
for (i = 0; i < DataStep; i++) { fprintf(fp, "%d\n", (int)Buffer [ i ]); }
при этом не обратил внимание на то, что i уже используется в цикле сбора данных, внутри которого я работаю:
for(i = 0x1; i < NDataBlock; i++)
Замена переменной i на j решила эту проблему!
Спасибо еще раз большое!
Добавлю. Запись идет "рядом" с WriteFile-ом, то есть, как я полагаю, в том же потоке...
Проблема, которую я описал в 17 посте для меня пока неясна. там же простой вывод в файл fprintf, почему не работает?!?
Прошу прощения, снимаю 18 пост: запись не шла из-за наличия kbhit!
Вдобавок, не удается "переписать" этот пример в виде формы с кнопкой "старт". Дальше первого кадра запись не идет:(
http://www.lcard.ru/forums/img/members/42/My1.zip
for (i = 0; i < DataStep; i++) { fprintf(fp, "%d\n", (int)Buffer [ i ]); }
Сделал в ReadData такую запись в файл (параллельно с
if(!WriteFile( hFile, // handle to file to write to
IoReq[RequestNumber^0x1].Buffer, // pointer to data to write to file
2*DataStep, // number of bytes to write
&FileBytesWritten, // pointer to number of bytes written
NULL // pointer to structure needed for overlapped I/O
)) { ReadThreadErrorNumber = 0x4; break; }
При этом счетчик на экране "Counter=...from.." не идет дальше 0.
В файл fp что-то постоянно записывается.
Куда копать, подскажите, пожалуйста!
Станислав пишет:ap.ControlTable[0]=1;
ap.ControlTable[1]=3;
Верно?
Или нумерация каналов АЦП начинается с нуля и второй канал это 0000 0001, а третий 0000 0010?Нумерация начинается с нуля в ControlTable и с единицы на разъеме, т.е. для каналов 2 и 3 ControlTable[] = { 1, 2 }
А что за прибор программируете? E154?
Понял, спасибо, E154
Поправьте, пожалуйста,если ошибаюсь.
Планирую использовать дваканала, 2 и 3,
а) задаю
ap.ChannelsQuantity = 0x2;
б) устанавливаю первый логический номер канала для второго канала АЦП, диапазон +-5В (00000010):
ap.ControlTable[0]=1;
в) устанавливаю логический номер канала для третьего канала АЦП, диапазон +-5В (00000011):
ap.ControlTable[1]=3;
Верно?
Или нумерация каналов АЦП начинается с нуля и второй канал это 0000 0001, а третий 0000 0010?
Спасибо за разъяснения,буду разбираться!
Спасибо за пояснения,обязательно прочту.
Хотелось бы прояснить.
В этом же примере.
1. Если я хочу-таки записать результаты измерений по всем каналам в различные файлы с указателями fp1, fp2, fp3,fp4, то как мне переписать приведенную выше строчку:
for (i = 0; i < DataStep; i++)
{
fprintf(fp, "%d\n", (int)Buffer[i]);
}
Где указать номер канала?
2. Могу ли я опрашивать только 2 и 3 канал, не опрашивая первый? Где указывать номер канала, если такой запрос возможен?
Заранее спасибо за помощь!
Подскажите,пожалуйста, в строках примера:
*********
// формируем необходимые для сбора данных структуры
for(i = 0x0; i < 0x2; i++)
{
// инициализация структуры типа OVERLAPPED
ZeroMemory(&ReadOv[i], sizeof(OVERLAPPED));
*********
0x2 - это число опрашиваемых каналов АЦП (2 штуки)?
Спасибо!
Александр,если не сложно, подскажите, чем можно смотреть файлы данных,создаваемых ReadData?
именно fprintf, чтобы текстовым редактором удобно было смотреть данные
Спасибо большое за ответ, обязательно попробую!
Добрый день!
Помогите, пожалуйста, с заменой WriteFile на fprintf в примере 'ReadData':
if(!WriteFile(hFile,IoReq[RequestNumber^0x1].Buffer, 2*DataStep, &FileBytesWritten,NULL)) { ReadThreadErrorNumber = 0x4; break; }
Заранее спасибо!
не хватает lib/borland/lusbapi.lib
Project-Add to project...
Добрый день!
Помогите, пожалуйста, чайнику.
Пробую перевести консольный пример работы с E154 в форму.
По нажатию кнопки старт на форме должна запуститься запись данных в файл, как в примере ReadData.
Ошибка при вызове первой же функции:
***
if((DllVersion = GetDllVersion()) != CURRENT_VERSION_LUSBAPI)
***
Вот ошибка:
[Linker Error] Unresolved external 'GetDllVersion' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\MY1\UNIT1.OBJ
Вот целиком проект:
https://cloud.mail.ru/public/c9fbee92a931/My1.7z
Заранее спасибо!
Перешел на 6-й билдер. Он нормально открывает проект.
Спасибо за подсказки!
Спасибо за ответ!
Теперь ошибка:
[Linker Fatal Error] Fatal: Unable to open file 'RTL50.LIB'
Нет.
Я открываю демо-проект, скачанный с вашей страницы:
http://www.lcard.ru/download/examples/l … der_50.zip
Файл-архив называется
lusbapi_e154_borland_c_builder_50.zip
Вроде бы это 5 версия, поправьте, если ошибаюсь
Добрый день!
Запускаю Borland C++Builder 5, открываю Examples.bpg, активирую проект Synchro.exe. При компиляции вылезает ошибка Unable to open file "RTL.LIB".
Файла такого и правда нет на компьютере.
Подскажите, пожалуйста, что делать!
Страницы 1