STM32 atoi и strtol иногда пропускают первые 2 цифры

Я читаю значение, отправленное через RS485, которое является значением кодировщика. Сначала я проверяю, вернул ли он символ E (кодировщик сообщает об ошибке), и если нет, то выполните следующие действия.

    *position = atoi( buffer ); 
    // Also tried *position = (s32) strtol(buffer,NULL,10);

Значение в буфере 4033536, а позиция устанавливается на 33536, это не происходит каждый раз в этой функции, возможно, 1 из 1000 раз, хотя я не считаю. Установка обратного счетчика программы и повторное выполнение строки, если она не удалась, возвращает тот же результат, но повторный запуск отладчика приводит к правильному преобразованию значения.

Я использую keil uvision 4, это специальная плата, использующая stm32f103vet6 и библиотеку stm32f10 V2.0.1. Это действительно поставило меня в тупик, я никогда не сталкивался с чем-то подобным, прежде чем любая помощь будет очень признательна.

Спасибо


person user1898428    schedule 12.12.2012    source источник


Ответы (1)


Поскольку никто не знает, я просто опубликую то, что я в итоге сделал, а именно написал свою собственную функцию для преобразования, не идеальную, но сработавшую.

bool cdec2s32(char* text, s32 *destination)
{
    s32 tempResult = 0;
    char currentChar;
    u8 numDigits = 0;
    bool negative = FALSE;
    bool warning = FALSE;

    if(*text == '-')
    {
      negative = TRUE;
      text++;
    }

while(*text != 0x00 && *text != '\r') //while current character not null or carridge return
{
    numDigits++;
    if(*text >= '0' && *text <= '9')
    {
        currentChar = *text;
        currentChar -= '0';

        if((warning && ((currentChar > 7 && !negative) || currentChar > 8 && negative )) || numDigits > 10) // Check number not too large
        {
            tempResult = 2147483647;
            if(negative)
                tempResult *= -1;

            *destination = tempResult;
            return FALSE;
        }

        tempResult *= 10;
        tempResult += currentChar;
        text++;
        if(numDigits >= 9)
        {
            if(tempResult >= 214748364)
            {
                warning = TRUE; //Need to check next digit as close to limit
            }
        }
    }
    else if(*text == '.' || *text == ',')
    {
        break;
    }
    else
        return FALSE;
}
if(negative)
    tempResult *= -1;

*destination = tempResult;
return TRUE;

}

person user1898428    schedule 06.08.2013