我有一些我試圖理解的其他人撰寫的代碼。我對 c 足夠熟悉,可以制作基本/中級函式,但從未真正學會使用 FILE 處理程式。該代碼與我如何在 ATMEL 微控制器上使用/初始化 USART 相關,并且我正在為每一行添加注釋以幫助跟蹤,但我對此有點掙扎。
#include <stdio.h>
int USART_0_printCHAR(char character, FILE *stream) // character = the received character, FILE = reference file, *stream = pointer
{
USART_Transmit_Char(character); //send the character over USART
return 0; // return 0 to the caller for exit success.
}
FILE USART_0_stream = FDEV_SETUP_STREAM(USART_0_printCHAR, NULL, _FDEV_SETUP_WRITE); //what do these arguments mean? is it replacing a standard output stream with the character that is written to the buffer.
void USART_Transmit_Char(char data)
{
// code omitted:
// check the Transmit buffer
// wait for free space in the buffer
// put the character into the buffer
// enable the Data Register Empty Interrupt for TX
}
謝謝。
uj5u.com熱心網友回復:
您的示例初始化標準 IO 設施的默認流。它創建一個只寫流,將其輸出寫入USART_0_printCHAR.
請參閱標準 IO 設施
提供了標準流 stdin、stdout 和 stderr,但與 C 標準相反,由于 avr-libc 不了解適用的設備,因此這些流在應用程式啟動時尚未預初始化。此外,由于 avr-libc 沒有任何“檔案”的概念,因此沒有可用于將流關聯到某個設備的函式 fopen()。(見注 1。)相反,提供函式 fdevopen() 將流與設備相關聯,其中設備需要提供發送字符、接收字符或兩者的函式。
作為 fdevopen() 的替代方法,宏 fdev_setup_stream() 可用于設定用戶提供的 FILE 結構。
#include <stdio.h>
static int uart_putchar(char c, FILE *stream);
static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL,
_FDEV_SETUP_WRITE);
static int
uart_putchar(char c, FILE *stream)
{
if (c == '\n')
uart_putchar('\r', stream);
loop_until_bit_is_set(UCSRA, UDRE);
UDR = c;
return 0;
}
int
main(void)
{
init_uart();
stdout = &mystdout;
printf("Hello, world!\n");
return 0;
}
此示例使用初始化程式形式 FDEV_SETUP_STREAM()而不是類似函式的 fdev_setup_stream(),因此所有資料初始化都發生在 C 啟動期間。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/468829.html
上一篇:除了文本檔案或csv檔案之外,還有其他方法可以將資料存盤在c中嗎?
下一篇:從WNDPROC轉換為LONG
