|
|
  |
Работа printf(), Помогите кто чем сможет |
|
|
|
Sep 21 2007, 23:01
|

Местный
  
Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606

|
Цитата(defunct @ Sep 22 2007, 02:02)  Достаточно написать свой putchar() совместимый с прототипом: int putchar(int ch) То-же самое написано в мануале. В С Я новичок. Обьясните пожалуйста чайнику про этот прототип? Почему есть возвращаемое значение? И почему putchar(int ?) а не char?
|
|
|
|
|
Sep 21 2007, 23:19
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(Т.Достоевский @ Sep 22 2007, 02:01)  а не char? Для AVR было бы лучше char, но низя, т.к. по стандарту int, и прототип этот уже объявлен в stdio.h, его вызывает функция printf при печати символов. (по крайней мере в IAR'е так). Цитата Почему есть возвращаемое значение? чтобы возвращать код ошибки. putchar предназначен для вывода символов в любое последовательное устройсво вывода, например в файл. Как пример кода ошибки может быть - нет доступа/устройство не готово и т.п., но этим можно пренебречь. простейший вариант putchar для отправки символов по UART'у может быть таким: Код int putchar(int ch) { while( !(UCSRA & (1 << UDRE) ) ); UDR = ch; return 0; }
|
|
|
|
|
Sep 21 2007, 23:47
|

Местный
  
Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606

|
Цитата(defunct @ Sep 22 2007, 03:19)  Для AVR было бы лучше char, но низя, т.к. по стандарту int, и прототип этот уже объявлен в stdio.h, int для совместимости, понял. Функцию так и сделал. Вопрос по С. Можно ли реализовать: Код putchar(char) //типа собирает ф буффер а потом передаёт через прерывание UDRE { if (a<large_buffer) { buffer[a++]=char; if ( ! (USCRB & UDRIE0)) { USCRB |= UDRIE0;//разрешить прерывание b=0;//для работы как указатель в прерывании по UDRE (если сравняется с а то ждать окончания по TXC } return 0;
} else return -1; } чтоб максимально быстро собрал, и уже потом аппаратно передавал. Или есть более правильное решение?
|
|
|
|
|
Sep 22 2007, 00:04
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(Т.Достоевский @ Sep 22 2007, 02:47)  чтоб максимально быстро собрал, и уже потом аппаратно передавал. Конечно, так и надо делать. Цитата Или есть более правильное решение? разве что с технической стороны организации буфера - есть кольцевой буфер, и он больше подходит для этой задачи. А идеологически - вполне нормальное решение у вас.
|
|
|
|
|
Sep 22 2007, 00:22
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(defunct @ Sep 22 2007, 05:19)  простейший вариант putchar для отправки символов по UART'у может быть таким: Код int putchar(int ch) { while( !(UCSRA & (1 << UDRE) ) ); UDR = ch; return 0; } Вообще-то putchar при нормальной операции должен возвращать тот же символ, что и в аргументе указан. А EOF возвращает только в случае НЕуспешной операции. Цитата из стандарта ANSI C (C99) Цитата 7.19.7.9 The putchar function Synopsis 1 #include <stdio.h> int putchar(int c); Description 2 The putchar function is equivalent to putc with the second argument stdout. Returns 3 The putchar function returns the character written. If a write error occurs, the error indicator for the stream is set and putchar returns EOF.
|
|
|
|
|
Sep 22 2007, 00:25
|

Местный
  
Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606

|
Цитата(defunct @ Sep 22 2007, 04:04)  Конечно, так и надо делать. разве что с технической стороны организации буфера - есть кольцевой буфер, и он больше подходит для этой задачи. А идеологически - вполне нормальное решение у вас. Спасибо. Осталась одна непоняная вещь. Что значит возвращает ошибку? Можно ли это использовать в случае если сообщение болше чем буфер? Printf() ждёт, или просто прекращает передачу? ЗЫ. Про кольцевые буфера помню, прикручу.
|
|
|
|
|
Sep 23 2007, 20:51
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Т.Достоевский @ Sep 22 2007, 03:25)  Что значит возвращает ошибку? Значит сообщает вызывающей функции, что вывод не удался и не имеет смысла выводить остальные символы (если они есть). printf() в этом случае завершается и остаток строки не выводится. Цитата(Т.Достоевский @ Sep 22 2007, 03:25)  Можно ли это использовать в случае если сообщение болше чем буфер? Printf() ждёт, или просто прекращает передачу? Если сообщение больше чем буфер - вы можете просто ждать в putchar() пока не появится место в буфере. Код int putchar (int byte) { uint8_t Tmp = TxHead; uint8_t Tmp1 = (Tmp + 1) & (RS232_TXBUFF_SIZE - 1); while(Tmp1 == TxTail); // Buffer full, wait TxBuffer[ Tmp ] = byte; TxHead = Tmp1; UCSRB |= (1 << UDRIE); return byte }
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 24 2007, 07:39
|
Бывалый
    
Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615

|
Цитата(Т.Достоевский @ Sep 22 2007, 04:25)  ЗЫ. Про кольцевые буфера помню, прикручу. FIFO придумал заядлый собаковод, выгуливающий свою шавку вокруг большого столба. Он понял 3 правила: 1. собачка бежит бежит по кругу в одном направлении 2. нельзя обгонять собачку 3. поводок должен быть меньше длины окружности столба. Это моя шутка. All right reserved.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|