Вести с полей
Спасибо за науку - переписал покрасивее. Только 1.5 момента: говорят, можно более красиво выделять 16-ричные разряды чем в лоб делением на 16, и второе - моя так горячо любимая функция int_to_string (которую я писал на ассемблере безо всяких сложностей - именно по такому же принципу как здесь) - не хочет вычислять при параметре >=int/2, хотя я делаю только вычитание! То есть, 32767 прожевывает, а 32768 - нет! Придется смотреть что там сделал компилятор
ЗЫ нет, мне конечно хватит и 32767, но хочется написать универсально на все времена
//-----------------------------------------------------------------------------------------------
char *int_to_string(char *s, int n)
{
int orders[] = {10000, 1000, 100, 10, 0};
int *order = orders;
char *begin = s;
char digit;
while(*order)
{
digit = 0;
while (n >= *order)
{
n = n - *order;
digit++;
}
if(digit || s!=begin) *s++ = '0' + digit;
order++;
}
*s++ = '0' + n;
return s;
}
//-----------------------------------------------------------------------------------------------
char *GPS_end_of_string(char *begin, char *end)
{
char *d;
char chek_summ = 0;
for(d=begin+1; d<end; d++) chek_summ = chek_summ^*d;
*d++ = GPS_char_multiply;
*d++ = '0' + chek_summ/16;
*d++ = '0' + (chek_summ - 16*(chek_summ/16));
*d++ = GPS_char_enter;
*d++ = GPS_char_return;
*d++ = 0;
return d;
}
//-----------------------------------------------------------------------------------------------
void GPS_send_command_RMC_call_freq(int call_freq)
{
//$PMTK314,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*2D<CR><LF>
char i;
char *d = GPS_command_buffer;
*d++='$';*d++='P';*d++='M';*d++='T';*d++='K';*d++='3';*d++='1';*d++='4';*d++=',';*d++='0';*d++=',';
d = int_to_string(d, call_freq);
for (i=0; i<17; i++)
{
*d++ = ',';
*d++ = '0';
}
GPS_end_of_string(GPS_command_buffer, d);
}
//-----------------------------------------------------------------------------------------------