-
2021-11-19 12:08:41
#include "stdio.h"
void Uart1Init(void) //115200bps@11.0592MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器时钟1T模式
AUXR &= 0xFE; //串口1悬着定时器1为波特率发生器
TMOD &= 0x0F; //选择定时器模式
TL1 = 0xE8; //设置定时初始值
TH1 = 0xFF; //设置定时初始值
ET1 = 0; //禁止定时器%d中断
TR1 = 1; //定时器1开始计时
}void UART1_SendData(char dat)
{
ES=0; //关串口中断
SBUF=dat;
while(TI!=1); //等待发送成功
TI=0; //清除中断标志位
ES=1; //打开串口中断
}
void UART1_SendString(char *s)
{
while(*s)//检测字符串结束符
{
UART1_SendData(*s++);//发送当前字符 }
}//串口重定向
char putchar(char c)
{
UART1_SendData(c);
return c;
}
更多相关内容 -
stm32f103串口printf,scanf函数串口重定向
2021-05-21 14:23:27stm32f103串口printf,scanf函数串口重定向stm32f103串口printf,scanf函数串口重定向串口重定向的步骤:首先配置USART串口(初始化这些)重定向函数首先配置USART串口(初始化这些)先看代码uart.c中#include #include ...stm32f103串口printf,scanf函数串口重定向
stm32f103串口printf,scanf函数串口重定向
串口重定向的步骤:
首先配置USART串口(初始化这些)
重定向函数
首先配置USART串口(初始化这些)
先看代码
uart.c中
#include
#include
void usart2_init(unsigned long blud)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
//PA2-TX
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
//PA3_RX
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
GPIO_Init(GPIOA,&GPIO_InitStruct);
USART_InitTypeDef USART_InitStruct;
USART_InitStruct.USART_BaudRate = blud;
USART_InitStruct.USART_HardwareFlowControl =USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode =USART_Mode_Rx | USART_Mode_Tx;
USART_InitStruct.USART_Parity = USART_Parity_No;
USART_InitStruct.USART_StopBits = USART_StopBits_1;
USART_InitStruct.USART_WordLength =USART_WordLength_8b;
USART_Init(USART2,&USART_InitStruct);
USART_Cmd(USART2,ENABLE);
/*
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_Init(&NVIC_InitStruct);*/
}
void sendbit(USART_TypeDef* USARTx,unsigned char uchar)
{
USART_SendData(USARTx,uchar);
while(!USART_GetFlagStatus(USARTx,USART_FLAG_TXE));
}
void senstring(USART_TypeDef* USARTx,char* string)
{
char* str=string;
while(*str)
{
sendbit(USARTx,*str);
str++;
}
}
int fputc(int ch,FILE *f)
{
sendbit(UART_PRINTF,(uint8_t)ch);
return ch;
}
/*int fputc(int ch,FILE *f)
{
while(USART_GetFlagStatus(USART2,USART_FLAG_TC) != SET);
USART_SendData(USART2,(unsigned char)ch);
while(USART_GetFlagStatus(USART2,USART_FLAG_TC) != SET);
return (ch);
}
*/
int fgetc(FILE *f)
{
while(!USART_GetFlagStatus(USART_SCANF,USART_FLAG_RXNE));
return (int)USART_ReceiveData(USART_SCANF);
}
main函数中
int main(void)
{
int a;
usart2_init(115200);
while(1)
{
printf("Hello");
scanf("%d",&a);
printf("a+1=%d",a+1);
}
}
附上效果图吧
值得注意的是重定义函数之后之前定义的NVIC中断都不需要了
stm32f103串口printf,scanf函数串口重定向相关教程
-
输入输出重定向详解
2021-05-21 13:35:51输入重定向 输入重定向是指把命令(或可执行程序)的标准输入重定向到指定的文件中。也就是说,输入可以不来自键盘,而来自一个指定的文件。所以说,输入重定向主要用于改变一个命令的输入源,特别是改变那些需要...1. 标准输入与输出
我们知道,执行一个shell命令行时通常会
1. 标准输入与输出我们知道,执行一个shell命令行时通常会自动打开三个标准文件,即标准输入文件(stdin),通常对应终端的键盘;标准输出文件(stdout)和标准错误输出文件(stderr),这两个文件都对应终端的屏幕。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。
我们以cat命令为例,cat命令的功能是从命令行给出的文件中读取数据,并将这些数据直接送到标准输出。若使用如下命令:
$ cat config
将会把文件config的内容依次显示到屏幕上。但是,如果cat的命令行中没有参数,它就会从标准输入中读取数据,并将其送到标准输出。例如:
$ cat
Hello world
Hello world
Bye
Bye
$
用户输入的每一行都立刻被cat命令输出到屏幕上。
另一个例子,命令sort按行读入文件正文(当命令行中没有给出文件名时,表示从标准输入读入),将其排序,并将结果送到标准输出。下面的例子是从标准输入读入一个采购单,并将其排序。
$ sort
bananas
carrots
apples
apples
bananas
carrots
$
这时我们在屏幕上得到了已排序的采购单。
直接使用标准输入/输出文件存在以下问题:
输入数据从终端输入时,用户费了半天劲输入的数据只能用一次。下次再想用这些数据时就得重新输入。而且在终端上输入时,若输入有误修改起来不是很方便。
输出到终端屏幕上的信息只能看不能动。我们无法对此输出作更多处理,如将输出作为另一命令的输入进行进一步的处理等。
为了解决上述问题,Linux系统为输入、输出的传送引入了另外两种机制,即输入/输出重定向和管道。
输入重定向
输入重定向是指把命令(或可执行程序)的标准输入重定向到指定的文件中。也就是说,输入可以不来自键盘,而来自一个指定的文件。所以说,输入重定向主要用于改变一个命令的输入源,特别是改变那些需要大量输入的输入源。
例如,命令wc统计指定文件包含的行数、单词数和字符数。如果仅在命令行上键入:
$ wc
wc将等待用户告诉它统计什么,这时shell就好象死了一样,从键盘键入的所有文本都出现在屏幕上,但并没有什么结果,直至按下<ctrl+d>,wc才将命令结果写在屏幕上。
如果给出一个文件名作为wc命令的参数,如下例所示,wc将返回该文件所包含的行数、单词数和字符数。
$ wc /etc/passwd
20 23 726 /etc/passwd
$
另一种把/etc/passwd文件内容传给wc命令的方法是重定向wc的输入。输入重定向的一般形式为:命令$ wc < /etc/passwd
20 23 726
$
另一种输入重定向称为here文档,它告诉shell当前命令的标准输入来自命令行。here文档的重定向操作符使用
>this text forms the content
>of the here document,which
>continues until the end of
>text delimter
>delim
4 17 98
在<
由于大多数命令都以参数的形式在命令行上指定输入文件的文件名,所以输入重定向并不经常使用。尽管如此,当要使用一个不接受文件名作为输入参数的命令,而需要的输入内容又存在一个文件里时,就能用输入重定向解决问题。
阅读(8043) | 评论(0) | 转发(3) |
-
C库函数重定向c基础知识
2021-05-22 09:40:02#include 头文件 #ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define ... 这里是用来进行printf的重定向的,就是我们像用我们C语言标准库的的printf一样来适用prinf来作为串口的输出。#include 头文件
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
USART_SendData(EVAL_COM1, (uint8_t) ch);
while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET)
{}
return ch;
}
定义了以上的
然后就可以调用 printf("\n\rPlease enter valid number between 0
and 9");
===============================================================
C库函数重定向
用户能定义自己的C语言库函数,连接器在连接时自动使用这些新的功能函
数。这个过程叫做重定向C语言库函数,如下图所示。
举例来说,用户有一个I/O设备(如UART)。本来库函数fputc()是把字符输出
到调试器控制窗口中去的,但用户把输出设备改成了UART端口,这样一来,
所有基于fputc()函数的printf()系列函数输出都被重定向到UART端口上去
了。
下面是实现fputc()重定向的一个例子:
extern void sendchar(char*ch);
int fputc(intch,FILE*f)
{
char tempch=ch;
sendchar(&tempch);
return ch;
}这个例子简单地将输入字符重新定向到另一个函数sendchar(),sendchar()
假定是个另外定义的串口输出函数。在这里,fputc()就似乎目标硬件和标
准C库函数之间的一个抽象层。
这里是用来进行printf的重定向的,就是我们像用我们C语言标准库的的printf一样来适用prinf来作为串口的输出。
-
printf函数的重定向实现
2021-05-21 18:09:58printf函数的重定向实现(2014-09-05 13:50:29)标签:佛学在嵌入式系统中,串口常用来辅助调试输出一些调试信息。所以有必要实现串口的格式化输出功能,这可以由3种方法实现(就我目所知).1)使用系统库函数printf(),这... -
C语言的重定向fputc函数
2018-03-26 19:43:18重定向 即自己重写C的库函数 提示 链接器检查到用户编写了与C库函数相同名字的函数时,优先调用用户编写函数,这样就可实现重定向 重定向printf()函数 需重写fputc()这个c标准库函数(printf()在c标准... -
关于printf重定向到串口的问题分析 - 全文
2021-05-21 13:36:56关于printf重定向到串口的问题简单地说:想在mdk 中用printf,需要同时重定义fputc函数和避免使用semihosTIng(半主机模式),标准库函数的默认输出设备是显示器,要实现在串口或LCD输出,必须重定义标准库函数里调用... -
Linux 终端串口重定向
2022-03-29 10:42:17Linux 终端串口重定向 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <sys/ioctl.h> #include <unistd.h> #define LOG_FILE ... -
Linux c语言 如何将printf打印重定向到文件或者串口
2020-07-23 11:29:39使用printf打印信息是在程序调试环节非常重要的一种手段,但是printf默认是打印到终端的,实际使用过程中不一定能满足需求,那么能不能把printf的打印重定向到文件或者串口呢? 答案当然是可以的。使用如下代码,就... -
关于串口发送的重定向
2021-11-08 01:03:06这一节我们讲一讲怎样将串口的输出重定向到printf。 对应printf这个函数大家一定非常熟悉,这个函数用于打印输出。一般c语言编程的入门程序,就是用printf打印hello world。 而在单片机中,裸机编程的条件下,并... -
stm32C串口重定向学习笔记
2021-08-06 13:27:05如果在STM32中使用串口时,不能直接使用printf函数。...///重定向c库函数printf到串口,重定向后可使用printf函数 int fputc(int ch, FILE *f) { /* 发送一个字节数据到串口 */ USART_SendData(DEBUG_USARTx, (ui -
STM32—重定向printf和getchar函数到串口
2019-07-30 17:17:15在STM32测试串口的时候经常需要在开发板和上位机之间传输数据,我们可以用c语言中的printf()函数和getchar()函数来简化传输。 以printf()为例: printf()函数实际上是一个宏,最终调用的是 fputc(int ch,FILE *f)这... -
STM32H743+CubeMX-串口重定向printf
2021-05-18 22:16:33文章目录一、前言二、CubeMX2.1、选择串口2.2、Parameter Settings三、代码3.1、usart.h3.2、usart.cKeilIARSTM32CubeIDE3.3、main.c 一、前言 **printf是调试程序与打印信息的强大工具,必须要掌握。**在实际项目上... -
keil中串口重定向问题
2018-08-17 09:45:01重定向是指用户可以自己重写C语言的库函数,当连接器检查到用户编写了与C语言库函数相同名字的函数时,优先采用用户编写的函数,这样就可以对库函数进行修改了。 若要printf( )函数工作,需要把printf( )函数重新... -
STM32 的 printf() 函数串口重定向(HAL库标准库都适用)
2021-05-22 15:18:201.建立工程2.核心:添加新文件usar_fputc.c (名字随便自己命名),把文件添加到项目中去#include "stdio.h"#include "stm32f1xx_hal.h"extern ...//重写这个函数,重定向printf函数到串口/*fputc*/int fputc(int c, ... -
基于stm32cubemx的串口重定向printf实现
2021-08-01 09:17:51这段代码就是通过对库函数fputc的重新定义,且在fputc函数中调用HAL_UART_Transmit函数来实现库函数fputc的重定向(库函数printf内部要调用fputc函数)。 最后在再引入头文件stdio.h,就可以再main.c函数处使用... -
linux重定向串口打印到telnet
2018-01-25 18:09:16在嵌入式开发中,我们都是...需要一种方法把串口所有输出重定向到telnet。 这就涉及到一些终端概念,可以参考上篇博文linux下tty, ttyn, pts, pty, ttySn, console理解。主要是利用tty的ioctl重定向方法来实现重 -
CubeMX串口printf重定向配置解决方案
2022-02-20 18:38:272、Keil添加C语言头文件 #include "stdio.h" 3、Keil添加重定向语句 int fputc(int ch,FILE *f) { uint32_t temp = ch; HAL_UART_Transmit(&huart1,(uint8_t *)&temp,1,1000); //huart3是串口的句柄 ... -
STM32之串口重定向printf函数和scanf函数
2017-09-09 11:48:50在进行STM32开发时,需要将日志打印出来,直接使用C语言的库函数printf是不起作用的,此时就需要我们将串口重定向printf函数。首先我们需要在keil集成开发环境中勾选STM32官方的微库,如下图所示: 然后就是重写... -
重定向fputc函数实现printf串口发送
2021-03-28 20:28:062、重定向fputc 在usart.c里面 int fputc(int ch, FILE *f) { USART_SendData(USART1, (uint8_t)ch); //将字符强制转换为无符号整型 while(USART_GetFlagStatus(USARTx,USART_FLAG_TXE)==RESET); //检测 ... -
printf重定向
2021-05-29 20:23:20重定向printf函数到串口输出前言一、printf函数介绍二、重定向实现在MDK中使用MicroLib库总结 前言 在初学C语言时,最常用的一种调试方式或者显示数据方式就是利用printf函数将自己想看的数据显示出来,但是到了STM... -
重定向STM32串口输出,C语言实现过程!
2021-02-14 21:15:47提示:以前在学stm8的时候非常不解用printf串口打印为什么要加上重定义,它定义在了什么地方!为什么函数可以有不确定的参数(学了这么久,这也从没有见过啊!)在函数的参数中,今天来说明一下! 提示:文末有个... -
STM32使用串口重定向系统printf函数输出时出现一初始化或使用printf函数系统卡死的原因及解决办法
2020-08-15 23:29:55STM32使用串口重定向系统printf函数输出时出现一初始化或使用printf函数系统卡死的原因及解决办法 在STM32开发当中,会经常使用系统自带的printf函数来查看调试输出,通常是将系统的printf输出内容发往串口,具体... -
printf重定向,在STM32的IAR环境下的printf重定向实例程序
2012-03-06 13:49:29printf重定向,在STM32的IAR环境下的printf重定向实例程序 -
利用STM32F4串口重定向Printf()
2018-07-19 12:08:58我们需要将PA9和PA10当做USART1的Tx和Rx引脚来用,也就是说此节课的PA9和PA10已不是通用IO的作用了,而是芯片内部的外设的接口引脚。STM32将这种应用叫做“I0引脚复用”,这也就说PA9将被配置成“复用推挽输出模式... -
C语言中的格式化打印printf/sprintf以及嵌入式printf重定向进行DEBUG
2019-09-03 15:16:35在C语言中,打印函数主要包括printf/sprintf/fprintf/snprintf等等,目的是将“给定的内容”按照“指定的格式”输出到“指定目标内”。通常要使用时,需要包括#inlcude <stdio.h>头文件。 用法为:void ... -
printf 重定向
2014-04-17 09:25:47usart这部分代码我也是从网上copy出来的,一下是作者的解释: 简单地说:想在mdk 中用printf,需要同时重定义fputc函数和避免使用...例如:printf输出到串口,需要将fputc里面的输出指向串口(重定向),方法如下: -
关于stm32中串口重定向问题详解(找个时间好好理解下)
2013-03-11 18:12:43usart这部分代码我也是从网上copy出来的,一下是作者的解释: 简单地说:想在mdk 中用printf,需要同时重定义fputc函数和避免使用...例如:printf输出到串口,需要将fputc里面的输出指向串口(重定向),方法如下: -
STM32关于printf重定向到串口
2022-05-08 14:12:52STM32关于printf重定向到串口