Хочу записывать в текстовые файлы на карте памяти данные, поступающие по UART. CodeVision AVR.
По UART вопросов нет.
С картой раньше не работал. Использую FATFS, встроенную в CVAVR. Карта памяти 4Gb.
Начал с теста карты памяти. И сразу наткнулся на ошибку - f_open возвращает FR_NO_FILE.
Перед открытием файла выполняю disk_initialize и f_mount - все нормально.
Делаю все, как в тысяче примеров в сети и в хэлпе CVAVR, и в примерах CVAVR.
Путь к файлу char path[]="0:/file.txt";
res=f_open(&file,path, FA_OPEN_ALWAYS | FA_WRITE ); В этом месте res=1(FR_DISK_ERR). Также в параметры ставил FA_CREATE_NEW, для существующего файла ставил FA_OPEN_EXISTING | FA_READ - результат один.
Точно такой же ответ и на f_mkdir(path), где char path[]="0:/files"; Пишет FR_DISK_ERR.
В общем - любые процедуры с файлами/папками - FR_DISK_ERR.
Цель кода - быстро проверить как работает карта, поэтому на реализацию ругаться не нужно.
То есть я нажимаю на кнопку и при каждом нажатии с картой что-то происходит.
1 - монтируется диск,
2 - открывается файл,
3 - указатель в конец файла,
4 - пишется какой-то текст,
5 - закрывается файл.
По флагам - какая-то индикация светодиодами.
Есть две карты: SD 2Gb и SDHC 4Gb. Карты форматировал всеми известными способами, то есть разные наборы "фатов" и размеров кластеров.
Когда в case 1:...... не появился FR_OK - вычислил, что возвращается ошибка FR_DISK_ERR.
initialize (в самом начале) и f_mount проходят нормально.
часов нет, поэтому библиотеку часов немного поправил:
rtc_get_time возвращает нули (hour, min, sec). rtc_get_date возвращает date - 1, month - 1, year - 2000.
Когда пойму как работают все эти функции - буду писать нормальную программу.
/* FAT function result */
FRESULT res;
/* number of bytes written/read to the file */
unsigned int nbytes;
/* will hold the information for logical drive 0: */
FATFS fat;
/* will hold the file information */
FIL file;
/* will hold file attributes, time stamp information */
FILINFO finfo;
/* file path */
char path[]="0:/log.txt";
/* text to be written to the file */
char text[]="<TEST_test>";
// Timer1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
TCNT1H=0x00;
TCNT1L=0x00;
//
disk_timerproc();
}
//
while(1)
{
//set leds
if (++blinkCr>=BLINK_DELAY)
{
blinkCr=0;
//disk init and mount indic
if ((~flags1&diskStatusF)&&(~flags1&diskMountF)) cb(PORTF,ledRed);
if ((flags1&diskStatusF)&&(~flags1&diskMountF)) PORTF^=ledRed;
if ((flags1&diskStatusF)&&(flags1&diskMountF)) sb(PORTF,ledRed);
//file indic
if (flags1&fileOpenF) sb(PORTE,ledE1); else PORTE^=ledE1;
if (flags1&fileLseekF) sb(PORTE,ledE2);
if (flags1&fileWrF) sb(PORTB,ledB);
if (flags1&fileCloseF) sb(PORTD,ledD);
}
//read button
if ((~PINF&sbRec)&&(~flags1&butPressF))
{
if (++butCr>=BUT_DELAY)
{
butCr=0; sb(flags1, butPressF);
PORTF^=ledGreen;
//
switch (pressNum)
{
case 0: if ((res=f_mount(0,&fat))==FR_OK) sb(flags1,diskMountF); break;
case 1: if ((res=f_open(&file,path, FA_OPEN_ALWAYS | FA_WRITE ))==FR_OK) sb(flags1,fileOpenF); break;
case 2: if ((res=f_lseek(&file,file.fsize))==FR_OK) sb(flags1,fileLseekF); break;
case 3: if ((res=f_write(&file,text,sizeof(text)-1,&nbytes))==FR_OK) sb(flags1,fileWrF); break;
case 4: if ((res=f_close(&file))==FR_OK) sb(flags1,fileCloseF); break;
}
if (pressNum<4) pressNum++;
}
}
if (PINF&sbRec)
{
cb(flags1,butPressF); butCr=0;
mir_ds писал(а):Цель кода - быстро проверить как работает карта ...
М-да... Именно так формулируется цель написания большинства программ, состоящих, в основном, из ошибок... Исходных данных нет, результатов каких-либо проверок - тоже нет...
Че-то, как-то... повеяло не то безысходностью, не то скукой. Пойду посмотрю КВН от 95 года.
Pnjom-Penb писал(а):Полностью разделяю Вашу низкую оценку гуану по имени CVAvr, но все же... чем еще может оканчиваться массив char, заданный таким обазом:
можно тут разговаривать, а конкретно о Вас - нет ?
Можно Вам тот-же вопрос : И чем же может оканчиваться массив char path[]="0:/file.txt"; в CVAVR?
Ну и вообще, чем оканчиваются массивы в Си, инициализированные строкой ?
Мне просто даже интересно, куда Вы там заглядываете и какую информацию об этом вопросе держите в голове. Может мы просто ошибаемся. Тогда поправьте нас и прикрепите свои поправки аргументами, а не домыслами о том, куда мы все заглядываем, а куда нет. Тогда будет уже конструктивный разговор.
Увы, одни люди, аргументируя свою позицию, ссылаются на Re'альные знания, другие - на Im'нимые... Отношение числа первых к числу вторых, что вполне ожидаемо, повторяет отношение числа действительных чисел к числу комплексных.
Читать DATASEG черех HEX, это хорошо забытый старый изврат. Над ним стебались еще во времена "Настоящие программисты не используют Паскаль". Но что гораздо хуже - это поооолное непонимание строк в Си.