11.10.2013, 21:44
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Вариантов не так уж много. Невнимательное чтение:
http://elm-chan.org/fsw/ff/en/open.html
Слепое копирование чужих примеров без понимания происходящего - не лучший путь к изучению.
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
11.10.2013, 22:47
|
|
Гражданин KAZUS.RU
Регистрация: 16.03.2009
Адрес: Украина, Харьков
Сообщений: 762
Сказал спасибо: 108
Сказали Спасибо 67 раз(а) в 67 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Почему же сразу слепое копирование. Взял пример только со считыванием, разбираюсь в нем плюс добавляю еще и запись.
Просто я не пойму, почему при закрытии возвращается ошибка. Получается нет возможности записать файл.
Сделал для чтения один указатель, для записи второй. И все равно при закрытии файла после записи выдает ошибка 1. A hard error occurred in the low level disk I/O layer */
|
|
|
|
11.10.2013, 23:58
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Код:
|
res = f_open(&fdst, "test.txt", FA_OPEN_EXISTING | FA_WRITE); |
Это у вас. При этом совершенно неясно, есть у вас этот файл в системе или его еще нет. По крайней мере в приведенном примере похоже на попытку открыть несуществующий файл. Не видно его создания.
А у Чана по моей ссылке однозначно сказано про примененный вами метод открытия:
FA_OPEN_EXISTING Opens the file. The function fails if the file is not existing. (Default)
Если вы создали файл в другом устройстве и он уже есть на носителе, то и методы открытия должны быть иные, и типы доступа...
FA_OPEN_ALWAYS Opens the file if it is existing. If not, a new file is created. To append data to the file, use f_lseek() function after file open in this method.
Это вы читали? Зачем я ссылку давал?
Непонятно одно. Как это вам удалось меня втянуть в обсуждение темы FS в теме STM32? Эти вопросы вообще-то никакого отношения к STM32 не имеют. FAT FS может жить на любой платформе.
Так что в дальнейшем я не принимаю участия. Больше читайте, старайтесь понять. Уж куда понятнее, чем у Чана. Классика.
__________________
С уважением,
Vic / ut1wpr
Последний раз редактировалось ut1wpr; 12.10.2013 в 00:13.
|
|
|
|
12.10.2013, 11:43
|
|
Временная регистрация
Регистрация: 12.09.2006
Сообщений: 69
Сказал спасибо: 2
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Изучаем STM32 Cortex M3
я тоже в этом новичёк, но попробовал вставить кусочек в свою тест прогу - работает. В дебаггере видно, что считалось в буфер.
|
|
|
|
12.10.2013, 17:46
|
|
Гражданин KAZUS.RU
Регистрация: 16.03.2009
Адрес: Украина, Харьков
Сообщений: 762
Сказал спасибо: 108
Сказали Спасибо 67 раз(а) в 67 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Файл созданный. Если в начале его прочитать, а потом записать - то все хорошо, после ресета читает новую строку из файла. Но если вначале записать, а потом попробовать считать - ничего. Буфер пустой.
А пишу тут, т.к. пробую на СТМ.
banzayy, переписал ваш пример - буфер пустой. ничего не читает....
Ладно, буду разбираться дальше. Думал может есть какая - нибудь определенная последовательность операций для чтения после записи...
|
|
|
|
12.10.2013, 19:18
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от swat24
|
после ресета читает новую строку из файла. Но если вначале записать, а потом попробовать считать - ничего
|
Если действия выполняются именно в таком порядке, то всё правильно - читаться и не должно, т.к. файловый указатель находится в самом конце файла.
Сообщение от swat24
|
может есть какая - нибудь определенная последовательность операций для чтения после записи...
|
lseek в начало.
__________________
There's always more than one way to skin a cat.
|
|
|
|
12.10.2013, 20:14
|
|
Гражданин KAZUS.RU
Регистрация: 16.03.2009
Адрес: Украина, Харьков
Сообщений: 762
Сказал спасибо: 108
Сказали Спасибо 67 раз(а) в 67 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Про возврат указателя я знаю. По этому и спрашиваю, т.к. варианты закончились
Вот полный код, который пробую:
Код:
|
printf("Инициализация диска %i\r\n",disk_initialize(0));
printf("Монтирование диска %i\r\n",f_mount(&fs,"0",1));
if (f_opendir(&dirs, path) == FR_OK)
{
res = f_open(&fdst, "0:test.txt",FA_OPEN_ALWAYS | FA_WRITE);
printf("Открытие файла %i\r\n",res);
br=0;
res = f_lseek(&fdst,0);
printf("Перевод курсора %i\r\n",res);
res = f_write(&fdst, "45612\r\n",7, &br);
if (res || br == 0) return 1;
//res = f_printf(&fdst,"Hello %d", 7362);
printf("Запись в файл %i, %i\r\n",res,br);
res = f_close(&fdst);
printf("Закрытие файла %i\r\n",res);
res = f_open(&fsrc, "0:test.txt", FA_OPEN_EXISTING | FA_READ);
br=0;
//f_sync(&fdst);
for(a=0; a‹512; a++) buffer[a]=0;
res = f_lseek(&fsrc,0);
printf("Перевод курсора %i\r\n",res);
res = f_read(&fsrc, buffer, sizeof(buffer), &br);
printf("Чтение файла %i\r\n",res);
printf("Содержимое файла: %s\r\n",buffer);
res = f_close(&fsrc);
printf("Закрытие файла %i\r\n",res);
f_mount(NULL, "0:", 0);
} |
Результат работы:
Код:
|
Открытие файла 0
Перевод курсора 0
Запись в файл 0, 7
Закрытие файла 1
Перевод курсора 0
Чтение файла 1
Содержимое файла:
Закрытие файла 0 |
А вот так работает (разбил запись/чтение на разные подпрограммы. И в каждом своя инициализация с последующим удалением диска) :
Код:
|
int write(void)
{
unsigned int a;
FRESULT res;
FILINFO finfo;
DIR dirs;
char path[16]={""};
#if _USE_LFN
finfo.lfname = Fs_LongFileName;
finfo.lfsize = sizeof(Fs_LongFileName);
#endif
printf("Инициализация диска %i\r\n",disk_initialize(0));
printf("Монтирование диска %i\r\n",f_mount(&fs,"0",1));
if (f_opendir(&dirs, path) == FR_OK)
{
res = f_open(&fdst, "0:test.txt",FA_OPEN_ALWAYS | FA_WRITE);
printf("Открытие файла %i\r\n",res);
br=0;
res = f_lseek(&fdst,0);
printf("Перевод курсора %i\r\n",res);
res = f_write(&fdst, "test1\r\n",7, &br);
if (res || br == 0) return 1;
//res = f_printf(&fdst,"Hello %d", 7362);
printf("Запись в файл %i, %i\r\n",res,br);
res = f_close(&fdst);
printf("Закрытие файла %i\r\n",res);
f_mount(NULL, "0:", 0);
}
}
int read(void)
{
unsigned int a;
FRESULT res;
FILINFO finfo;
DIR dirs;
char path[16]={""};
#if _USE_LFN
finfo.lfname = Fs_LongFileName;
finfo.lfsize = sizeof(Fs_LongFileName);
#endif
printf("Инициализация диска %i\r\n",disk_initialize(0));
printf("Монтирование диска %i\r\n",f_mount(&fs,"0",1));
if (f_opendir(&dirs, path) == FR_OK)
{
res = f_open(&fsrc, "0:test.txt", FA_OPEN_EXISTING | FA_READ);
br=0;
//f_sync(&fdst);
for(a=0; a‹512; a++) buffer[a]=0;
res = f_lseek(&fsrc,0);
printf("Перевод курсора %i\r\n",res);
res = f_read(&fsrc, buffer, sizeof(buffer), &br);
printf("Чтение файла %i\r\n",res);
printf("Содержимое файла: %s\r\n",buffer);
res = f_close(&fsrc);
printf("Закрытие файла %i\r\n",res);
f_mount(NULL, "0:", 0);
}
} |
Работает если второй раз смонтировать диск. Если не монтировать, то уже не читает...
Последний раз редактировалось swat24; 12.10.2013 в 21:15.
|
|
|
|
13.10.2013, 21:43
|
|
Прописка
Регистрация: 31.08.2008
Сообщений: 183
Сказал спасибо: 25
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
как прозводить измерение двух каналов одиночными ADC преобразованиями. делаю так: изменить канал (IN1) - произвести преобразование - математическое действие, затем изменить канал (IN2) - произвести преобразование - математическое действие.
при этом получается полная ерунда, как будто на входе не постоянное напряжение, в шум. так делать нельзя? почему? если закоментировать, например, "изменить канал (IN2)" - видно что канал 1 выставляется правильно и напряжение меряется правильно и математика с измерением выполняется правильно, а если разкоментировать - на индикаторе опять шум какой то
__________________
Kvsrk85(Андрей)
|
|
|
|
13.10.2013, 22:39
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.02.2008
Сообщений: 1,809
Сказал спасибо: 124
Сказали Спасибо 604 раз(а) в 421 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
kvark85, шум на обоих каналах? Я делал так, четыре канала. Включаю один светодиод, жду немного, потом преобразование с фотодиода. Выключаю первый СД, включаю второй СД. Жду немного, преобразование с о второго ФД. и так далее. Правда все пары немного отличаются, но в целом близко. И нормально реагируют на изменение прохождение света. Каждый канал отдельное преобразование. Из-за переключения СД. Математику после. И так каждую 1мс. А почему у Вас не идет?
|
|
|
|
14.10.2013, 01:08
|
|
Прописка
Регистрация: 31.08.2008
Сообщений: 183
Сказал спасибо: 25
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
у меня время между преобразованиями 50 микросекунд. может из за этого? завтра покажу код
__________________
Kvsrk85(Андрей)
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:20.
|
|