Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года


Доработка примера 'ReadData' - нужна помощь чайнику

Вы не вошли.

 Поиск | Регистрация | Вход 

19.09.2014 17:31:22
#26

Участник
Здесь с 10.07.2014
Сообщений: 24

Re: Доработка примера 'ReadData' - нужна помощь чайнику

Тут обе переменные были локальными...
Теперь непонятно другое.
Задаю

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 и больше.
Где еще я некорректно мог использовать переменную, подскажите, пожалуйста?!?

19.09.2014 19:40:49
#27

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: Доработка примера 'ReadData' - нужна помощь чайнику

2 * DataStep - это количество байт, понятнее было бы sizeof(SHORT) * DataStep.
Это не количество каналов.

for (j = 0; j < DataStep; j+=2)
{
    fprintf(f_out, "%d\t%d\t%d\n", j,
        (int)IoReq[RequestNumber^1].Buffer[j],
        (int)IoReq[RequestNumber^1].Buffer[j + 1]);
}

И зачем Вы открываете и закрываете файл каждый раз в цикле???

22.09.2014 18:24:29
#28

Участник
Здесь с 10.07.2014
Сообщений: 24

Re: Доработка примера 'ReadData' - нужна помощь чайнику

Возможно я неверно трактовал значение DataStep. Это общее количество данных на все каналы (в моем случае по 3200 записей с каждого канала) или количество данных с каждого канала?

22.09.2014 19:38:48
#29

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: Доработка примера 'ReadData' - нужна помощь чайнику

Вы могли поменять что-то в коде, так что проверьте по тексту программы.
Судя по WriteFile, это количество элементов типа SHORT в одном буфере (= сколько 16-битных слов читается за одно чтение). Тогда, конечно, оно "суммарное для всех каналов" - точнее, разделения на каналы на этом уровне нет, это просто поток данных.

Кстати, если размер порции чтения (в 16-битных словах) не кратен количеству каналов, то в каждом буфере отсчет buf[0] будет попадать на разные каналы.