|
- Участник
- Здесь с 12.03.2021
- Сообщений: 6
|
Простой опрос портов
Добрый день, сейчас в организации разбираемся с модулем E14-140M, хотим написать свою программу на C++, вроде все понятно, и драйвер и примеры все работают, но т.к. опыта с вашем устройством нет, хотелось бы уточнить, нет ли простого примера программы, которая просто бы опрашивала 1(или какой-нибудь еще порт), и выводила на экран числа, нам пока хватило бы, для дальнейшей работы. Из документации например скелет программы заработал, но вот нормально считать порт не получается. Спасибо.
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,487
|
Re: Простой опрос портов
А что конкретно Вы подразумеваете под портом?
|
|
- Участник
- Здесь с 12.03.2021
- Сообщений: 6
|
Re: Простой опрос портов
Ну канал куда поступают данные на АЦП, а с него на компьютер, на примере как это выводит LGraph, только там выдается график, а нам просто бы числовые значения считать, прошу прощения если не понятно, я бы мог прислать схему подключения и фото в реале, только не понял как у вас на форуме выкладывать картинки. По сути мне нужно то что у вас в одном из примере ReadData: / Поток, в котором осуществляется сбор данных
//------------------------------------------------------------------------
DWORD WINAPI ServiceReadThread(PVOID /*Context*/)
{
WORD i;
WORD RequestNumber;
DWORD FileBytesWritten;
// массив OVERLAPPED структур из двух элементов
OVERLAPPED ReadOv[2];
// массив структур с параметрами запроса на ввод/вывод данных
IO_REQUEST_LUSBAPI IoReq[2];
// остановим работу АЦП и одновременно сбросим USB-канал чтения данных
if (!pModule->STOP_ADC()) { ReadThreadErrorNumber = 0x1; IsReadThreadComplete = true; return 0x0; }
// формируем необходимые для сбора данных структуры
for (i = 0x0; i < 0x2; i++)
{
// инициализация структуры типа OVERLAPPED
ZeroMemory(&ReadOv[i], sizeof(OVERLAPPED));
// создаём событие для асинхронного запроса
ReadOv[i].hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
// формируем структуру IoReq
IoReq[i].Buffer = ReadBuffer + i * DataStep;
IoReq[i].NumberOfWordsToPass = DataStep;
IoReq[i].NumberOfWordsPassed = 0x0;
IoReq[i].Overlapped = &ReadOv[i];
IoReq[i].TimeOut = (DWORD)(DataStep / ap.AdcRate + 1000);
}
// делаем предварительный запрос на ввод данных
RequestNumber = 0x0;
if (!pModule->ReadData(&IoReq[RequestNumber])) { CloseHandle(ReadOv[0].hEvent); CloseHandle(ReadOv[1].hEvent); ReadThreadErrorNumber = 0x2; IsReadThreadComplete = true; return 0x0; }
// запустим АЦП
if (pModule->START_ADC())
{
// цикл сбора данных
for (i = 0x1; i < NDataBlock; i++)
{
// сделаем запрос на очередную порцию данных
RequestNumber ^= 0x1;
if (!pModule->ReadData(&IoReq[RequestNumber])) { ReadThreadErrorNumber = 0x2; break; }
if (ReadThreadErrorNumber) break;
// ждём завершения операции сбора предыдущей порции данных
if (!WaitingForRequestCompleted(IoReq[RequestNumber ^ 0x1].Overlapped)) break;
// if(WaitForSingleObject(ReadOv[RequestNumber^0x1].hEvent, IoReq[RequestNumber^0x1].TimeOut) == WAIT_TIMEOUT) { ReadThreadErrorNumber = 0x3; break; }
if (ReadThreadErrorNumber) break;
// запишем полученную порцию данных в файл
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;
}
if (ReadThreadErrorNumber) break;
else if (_kbhit()) { ReadThreadErrorNumber = 0x5; break; }
else Sleep(20);
Counter++;
}
// последняя порция данных
if (!ReadThreadErrorNumber)
{
RequestNumber ^= 0x1;
// ждём окончания операции сбора последней порции данных
if (!WaitingForRequestCompleted(IoReq[RequestNumber ^ 0x1].Overlapped)) ReadThreadErrorNumber = 0x3;
// if(WaitForSingleObject(ReadOv[RequestNumber^0x1].hEvent, IoReq[RequestNumber^0x1].TimeOut) == WAIT_TIMEOUT) ReadThreadErrorNumber = 0x3;
// запишем последнюю порцию данных в файл
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;
Counter++;
}
}
else { ReadThreadErrorNumber = 0x6; }
// остановим работу АЦП
if (!pModule->STOP_ADC()) ReadThreadErrorNumber = 0x1;
// прервём возможно незавершённый асинхронный запрос на приём данных
if (!CancelIo(ModuleHandle)) { ReadThreadErrorNumber = 0x7; }
// освободим все идентификаторы событий
for (i = 0x0; i < 0x2; i++) CloseHandle(ReadOv[i].hEvent);
// небольшая задержка
Sleep(100);
// установим флажок завершения работы потока сбора данных
IsReadThreadComplete = true;
// теперь можно спокойно выходить из потока
return 0x0;
}
Только вместо вывода в файл в функцию printf в числовом виде.
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,487
|
Re: Простой опрос портов
1. Штатный пример ReadData осуществляет потоковый сбор данных на частоте 400 кГц. Уверены, что вам необходимо выводить на экран каждую секунду по 400000 отсчётов? 2. Может быть под Вашу задачу больше подойдёт более медленный однократный сбор данных: Borland C++ 5.02\AdcSample или Borland C++ 5.02\AdcKadr.
|
|
- Участник
- Здесь с 12.03.2021
- Сообщений: 6
|
Re: Простой опрос портов
Тихомиров Сергей пишет:1. Штатный пример ReadData осуществляет потоковый сбор данных на частоте 400 кГц. Уверены, что вам необходимо выводить на экран каждую секунду по 400000 отсчётов? 2. Может быть под Вашу задачу больше подойдёт более медленный однократный сбор данных: Borland C++ 5.02\AdcSample или Borland C++ 5.02\AdcKadr.
Добрый день, попробовали эти программы, проблема решилась частично, AdcKadr, почему то не считывает и во все, числа со всех каналов, просто уходят в отрицательное значение и все, а вот AdcSample работает, но правда считывается только один канал, на второй он не реагирует хотя LGraph все видит и нормально анализирует, подключаем прям в соседний, предполагаю что ошибка кроется где то здесь, но не как могу понять: while(!kbhit())
{
if(!pModule->ADC_SAMPLE(&AdcSample1, (WORD)(0x00 | (0x0 << 4) | (InputRangeIndex << 6)))) { printf("\n\n ADC_SAMPLE(, 0) --> Bad\n"); break; }
else if(!pModule->ADC_SAMPLE(&AdcSample2, (WORD)(0x01 | (0x1 << 4) | (InputRangeIndex << 6)))) { printf("\n\n ADC_SAMPLE(, 1) --> Bad\n"); break; }
printf(" AdcSample Data (ADC code): %5d %5d\r", AdcSample1, AdcSample2);
}
|
|
- Участник
- Здесь с 24.08.2022
- Сообщений: 1
|
Re: Простой опрос портов
Efim91 пишет:Тихомиров Сергей пишет:1. Штатный пример ReadData осуществляет потоковый сбор данных на частоте 400 кГц. Уверены, что вам необходимо выводить на экран каждую секунду по 400000 отсчётов? 2. Может быть под Вашу задачу больше подойдёт более медленный однократный сбор данных: Borland C++ 5.02\AdcSample или Borland C++ 5.02\AdcKadr.
Добрый день, попробовали эти программы, проблема решилась частично, AdcKadr, почему то не считывает и во все, числа со всех каналов, просто уходят в отрицательное значение и все, а вот AdcSample работает, но правда считывается только один канал, на второй он не реагирует хотя LGraph все видит и нормально анализирует, подключаем прям в соседний, предполагаю что ошибка кроется где то здесь, но не как могу понять: while(!kbhit())
{
if(!pModule->ADC_SAMPLE(&AdcSample1, (WORD)(0x00 | (0x0 << 4) | (InputRangeIndex << 6)))) { printf("\n\n ADC_SAMPLE(, 0) --> Bad\n"); break; }
else if(!pModule->ADC_SAMPLE(&AdcSample2, (WORD)(0x01 | (0x1 << 4) | (InputRangeIndex << 6)))) { printf("\n\n ADC_SAMPLE(, 1) --> Bad\n"); break; }
printf(" AdcSample Data (ADC code): %5d %5d\r", AdcSample1, AdcSample2);
}
Разобрались в итоге с этим вопросом? Столкнулся с такой же проблемой.
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,487
|
Re: Простой опрос портов
А можно немного поконкретней описать именно Вашу проблему?
|