Почему мой sprintf с USB-связью не очень хорошо работает? - PullRequest
0 голосов
/ 19 февраля 2020

Я хочу отправить двойную форму u C на P C. Например: в u C у меня есть double pi = 3.1415 после отправки его в P C, консоль (в P C) должна показывать 3.1415. Мне нужно преобразовать double в char, поэтому я использовал sprintf () для его преобразования. Если честно, я не уверен, что sprintf () конвертирует double в char [], но это моя единственная идея. После отправки пи на P C моя консоль показывает:? <00> <00> 4f <00> ˙˙. Вот мой код:

#define F_CPU 16000000UL

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdio.h>

void print_char(char letter)
{
    if( bit_is_set(UCSRA, UDRE) )
    {
        _delay_ms(10);
        UDR=letter;
        loop_until_bit_is_set(UCSRA, TXC);
    }
}

int main(void)
{
    UBRRL = 103; //9600 16mhz
    UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
    UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);

    double pi=3.1415;
    char cpi[8];

    sprintf(cpi,"%#.4f", pi);

    while(1)
    {
        for(int i=0; i<8; i++) print_char(cpi[i]);

        UDR=0x0D;
        UDR=0x0A;
        _delay_ms(1000);
    }
}

Как это исправить или как правильно конвертировать double в char [].

1 Ответ

0 голосов
/ 19 февраля 2020

sprintf и друзья довольно дорогие, в частности, полноценные версии с поддержкой float. С этой целью avr-lib c предоставляет различные версии vfprintf, где версия по умолчанию поддерживает / не поддерживает float и просто печатает ?, если видит ее.

Если вы хотите поддержка float, ссылка с

avr-gcc ... -Wl,-u,vfprintf -lprintf_flt

см. avr-lib c: vfprintf . Кроме того, в stdlib.h .

есть поддержка преобразования простых чисел с плавающей точкой . В маловероятном случае вы используете avr-g cc с поддержкой 64-битной double: avr-lib c не поддерживает их, независимо от того, какую версию vfprintf вы связываете.

...