Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Чтение из SD карты и передача по UART
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
andrew1985
Задача состоит в том что бы читать по строке в буфер МК из стандартного файла hex, который расположен на карте памяти, затем буфер hex из вида ASCII преобразовать в численый вид. Далее над этим численым массивом произвести некие действия и передать из по UART. Сломал всю голову что не так!!!, первую строчку кажет как надо, а отальные составляет из частей первой, как буд то массивы наезжают в памяти друг на друга. Компилятор CodeVisionAVR? МК, ATmega128.
CODE

void prog(void)
{
char buffer[64];
char line_hex[64];
char buf[64];
char i;
char str_count;
char x;
char y;

str_count=0;
i=0;
x=0;
nbytes=0;
while(f_open(&file,path,FA_READ)!=FR_OK){};
do
{
i=0;
str_count=0;
x=0;
while (i!=64) //почистим буферы
{
line_hex[i]=0;
buffer[i]=0;
buf[i]=0;
i++;
}
do
{
while (f_read(&file,buf,1,&nbytes)!=FR_OK){}; //читаем из файла посимвольно
if ((buf[0]!=0x0D)&&(buf[0]!=0x0A)&&(buf[0]!=0x3A)){line_hex[str_count]=buf[0];str_count++;}//не учитываем : и знаки конца строки
}
while ((buf[0]!=0x0D)&&(buf[0]!=0x0A)); //пока не нашли конец строки
if ((strcmp(line_hex,"00000001FF"))!=0) //если не последняя строка то будем конвертировать в другой формат
{
i=0;
while (i!=str_count) //сначала переведем в hex из ascii
{
if (line_hex[i]==0x30)buffer[i]=0x00;
if (line_hex[i]==0x31)buffer[i]=0x01;
if (line_hex[i]==0x32)buffer[i]=0x02;
if (line_hex[i]==0x33)buffer[i]=0x03;
if (line_hex[i]==0x34)buffer[i]=0x04;
if (line_hex[i]==0x35)buffer[i]=0x05;
if (line_hex[i]==0x36)buffer[i]=0x06;
if (line_hex[i]==0x37)buffer[i]=0x07;
if (line_hex[i]==0x38)buffer[i]=0x08;
if (line_hex[i]==0x39)buffer[i]=0x09;
if (line_hex[i]==0x41)buffer[i]=0x0A;
if (line_hex[i]==0x42)buffer[i]=0x0B;
if (line_hex[i]==0x43)buffer[i]=0x0C;
if (line_hex[i]==0x44)buffer[i]=0x0D;
if (line_hex[i]==0x45)buffer[i]=0x0E;
if (line_hex[i]==0x46)buffer[i]=0x0F;
i++;
}
i=0;
while (i!=64) //почистим буферы
{
buf[i]=0;
i++;
}
i=0;
x=0;
while (i!=str_count) //окончательно формируем hex строку
{
buf[x]=buffer[i]<<4;
i++;
buf[x]=buffer[i]|buf[x];
i++;
x++;
}
i=0;
while (i!=64) //почистим буфер в котором будем формировать строку прошивки
{
buffer[i]=0;
i++;
}
buffer[0]=0x07;
buffer[1]=0x0E;
buffer[2]=((buf[0])+4);
buffer[3]=0x57;
buffer[4]=0x00;
buffer[5]=buf[1];
buffer[6]=buf[2];
putchar(buffer[0]);
putchar(buffer[1]);
putchar(buffer[2]);
putchar(buffer[3]);
putchar(buffer[4]);
putchar(buffer[5]);
putchar(buffer[6]);
}
}
while ((strcmp(line_hex,"00000001FF"))!=0); //будем выполнять действия пока не найдем последнюю строку hex
}
alexeyv
где-то так:
CODE

#define MAX_LEN 64

void clear_buf(char * buf, char len)
{
while(len--) *buf++ =0;
}

char prog(void)
{
char buffer [MAX_LEN];
char buf [MAX_LEN];

char * pts1; // рабочие указатели на строки
char * pts2;

char str_count;
char in_ch;

//nbytes=0; // где определение? + зачем надо!?

// А если не можем открыт для чтения, то будем вечно здесь висеть?
//while(f_open(&file,path,FA_READ)!=FR_OK){};
if(f_open(&file,path,FA_READ)!=FR_OK) return 0;

do
{
//почистим буферы
// хотя зачем это надо !?
clear_buf(buffer, MAX_LEN);
clear_buf(buf, MAX_LEN);

pts1 = buffer;
do
{
// А если достигли конца файла без знаков конца строки, так здесь и повиснем?
//while (f_read(&file,buf,1,&nbytes)!=FR_OK){}; //читаем из файла посимвольно
if (f_read(&file,&in_ch,1,&str_count)!=FR_OK) break; //читаем из файла посимвольно
*pts1++ = in_ch;
}
while (in_ch!=0x0A); //пока не нашли конец строки
//В Windows для завершения строки используется 0x0D+0x0A, где 0x0A - последняя
//иначе "0D0A" будет считаться ПУСТОЙ строкой
//while ((buf[0]!=0x0D)&&(buf[0]!=0x0A)); //пока не нашли конец строки

str_count = pts1 - buffer;
if (!str_count) break;

//если не последняя строка то будем конвертировать в другой формат
if (!strcmp(buffer,":00000001FF/0D/0A")) break; // выход из основного цикла

// переводим цифры в hex из ascii
// + не учитываем ":" и знаки конца строки и все остальные символы
// + окончательно формируем hex строку
pts1 = buffer;
pts2 = buf;

while (str_count--)
{
byte sxor = 0;
if(sxor)
{
if ( (*pts1>0x2F) && (*pts1<0x3A) ) *pts2++ = *pts1 - 0x30;
if ( (*pts1>0x40) && (*pts1<0x47) ) *pts2++ = *pts1 - 0x37;
}
else
{
if ( (*pts1>0x2F) && (*pts1<0x3A) ) *pts2 = (*pts1 - 0x30)<<4;
if ( (*pts1>0x40) && (*pts1<0x47) ) *pts2 = (*pts1 - 0x37)<<4;
}
*pts1++;
sxor ^=1;
}
str_count = pts2 - buf; // длина итоговой строки

// а зачем оно надо !?
clear_buf(buf, MAX_LEN);
clear_buf(buffer, MAX_LEN);

// делаем с результатом что надо

buffer[0]=0x07;
buffer[1]=0x0E;
buffer[2]=((buf[0])+4);
buffer[3]=0x57;
buffer[4]=0x00;
buffer[5]=buf[1];
buffer[6]=buf[2];
putchar(buffer[0]);
putchar(buffer[1]);
putchar(buffer[2]);
putchar(buffer[3]);
putchar(buffer[4]);
putchar(buffer[5]);
putchar(buffer[6]);
}
}
while (1);
}



на грамматические/синтаксические ошибки не проверял

Для проверки библиотеки SD карты, считайте исходный файл и запишите в другой при помощи этих функций
Где-то так:
CODE

char prog(void)
{
char str_count;
char in_ch;

if(f_open(&file,path,FA_READ)!=FR_OK) return 0;
if(f_open(&filewr,path,FA_WRITE)!=FR_OK) return 0;

do
{
if (f_read(&file,&in_ch,1,&str_count)!=FR_OK) break; //читаем из файла посимвольно
if (f_write(&filewr,&in_ch,1,1)!=FR_OK) break; //записываем, синтаксис ф-ции не знаю
}
while (1);

f_close(&file);
f_close(&filewr);
}

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.