STM32下多串口用法
一个项目用到32下的多个串口,一般STM32C8T6型号拥有3个USART,串口的配置都很简单,但是要使用的话就得解决他们之间的矛盾,
printf函数到底输出在哪一个串口中?
先看这函数:
//重定义fputc函数,方便使用printf
int fputc(int Data, FILE *f)
{
while(!USART_GetFlagStatus(USART1,USART_FLAG_TXE)); //USART_GetFlagStatus:得到发送状态位
//USART_FLAG_TXE:发送寄存器为空 1:为空;0:忙状态
USART_SendData(USART1,Data); //发送一个字符 return Data; //返回一个值
}
在我们使用printf函数的时候,首先必须重定义fputc函数,在这个函数中,实现数据的发送,然后在 USART_SendData(USART1,Data); 中选择需要的串口。一般是选择串口1,所以这种情况下,
使用printf函数会打印到串口1。
那么我要用到串口2的printf函数该怎么办呢 ?
配置什么的还是和串口1一样,
1.配置usart2的串口配置,gpio,rcc enable。。。。
2.勾选usb micro lib,
3.添加头文件#include <stdarg.h>,编写USART2的printf函数:
void USART2_printf (char *fmt, ...)
{
char buffer[CMD_BUFFER_LEN+]; // CMD_BUFFER_LEN长度自己定义吧
u8 i = ; va_list arg_ptr;
va_start(arg_ptr, fmt);
vsnprintf(buffer, CMD_BUFFER_LEN+, fmt, arg_ptr);
while ((i < CMD_BUFFER_LEN) && buffer)
{
USART_SendData(USART2, (u8) buffer[i++]);
while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
}
va_end(arg_ptr);
}
仔细看我们会发现,其实这个函数中包含了fputc,然后吧 USART_SendData(USART1,Data); 改为 USART_SendData(USART2,(u8)buffer[i++]); 循环通过串口2发送。
还有一种方法就是自己实现 printf的源码(参考秉火程序):
/*
* 函数名:USART2_printf
* 描述 :格式化输出,类似于C库中的printf,但这里没有用到C库
* 输入 :-USARTx 串口通道,这里只用到了串口2,即USART2
* -Data 要发送到串口的内容的指针
* -... 其他参数
* 输出 :无
* 返回 :无
* 调用 :外部调用
* 典型应用USART2_printf( USART2, "\r\n this is a demo \r\n" );
* USART2_printf( USART2, "\r\n %d \r\n", i );
* USART2_printf( USART2, "\r\n %s \r\n", j );
*/
void USART2_printf ( USART_TypeDef * USARTx, char * Data, ... )
{
const char *s;
int d;
char buf[]; va_list ap;
va_start(ap, Data); while ( * Data != ) // 判断是否到达字符串结束符
{
if ( * Data == 0x5c ) //'\'
{
switch ( *++Data )
{
case 'r': //回车符
USART_SendData(USARTx, 0x0d);
Data ++;
break; case 'n': //换行符
USART_SendData(USARTx, 0x0a);
Data ++;
break; default:
Data ++;
break;
}
} else if ( * Data == '%')
{ //
switch ( *++Data )
{
case 's': //字符串
s = va_arg(ap, const char *); for ( ; *s; s++)
{
USART_SendData(USARTx,*s);
while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );//程序死在了这
} Data++; break; case 'd':
//十进制
d = va_arg(ap, int); itoa(d, buf, ); for (s = buf; *s; s++)
{
USART_SendData(USARTx,*s);
while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );
} Data++; break; default:
Data++; break; }
}
else USART_SendData(USARTx, *Data++);
while ( USART_GetFlagStatus ( USARTx, USART_FLAG_TXE ) == RESET ); }
}
然后在这里面修改串口号就可以。
参考资料:https://blog.csdn.net/xzongyuan/article/details/28626163
STM32下多串口用法的更多相关文章
- Mac下的串口通信-ORSSerialPort
================================2015/11/05======================================= 最近在工作中遇到有关Mac下串口通信 ...
- STM32 USB虚拟串口(转)
源:STM32 USB虚拟串口 串口调试在项目中被使用越来越多,串口资源的紧缺也变的尤为突出.很多本本人群,更是深有体会,不准备一个USB转串口工具就没办法进行开发.本章节来简单概述STM32低端芯片 ...
- 【原创】STM32下波特率计算详解
波特率的计算 STM32下的波特率和串口外设时钟息息相关,USART 1的时钟来源于APB2,USART 2-5的时钟来源于APB1.在STM32中,有个波特率寄存器USART_BRR,如下: ...
- stm32中assert_param的用法说明
stm32中assert_param的用法说明 首先是要知道条件判断语句 这个运算符分成三部分: (条件) ? (条件成立执行部分) :(条件不成立执行部分) 就这么简单 例如:a=(x>y ...
- 使用 VSCode 给STM32配置一个串口 printf 工程
使用 VSCode 给STM32配置一个串口 printf 工程 gcc 重定向 printf 和 keil 不一样. 文件准备 先从以前的工程中拷过一份串口的代码来,然后在 main 函数中初始化串 ...
- Linux下的串口编程及非阻塞模式
本篇介绍了如何在linux系统下向串口发送数据.包括read的阻塞和非阻塞.以及select方法. 打开串口 在Linux系统下,打开串口是通过使用标准的文件打开函数操作的. #include < ...
- xss其他标签下的js用法总结大全
前段时间我遇到一个问题,就是说普通的平台获取cookie的语句为↓ Default <script src=js地址></script> 1 <scr ...
- [小技巧] shell 下查看串口是否工作正常
在 Linux 下调试串口,是个麻烦的事情,尤其是嵌入式环境,很多时候要借助另一台设备来进行调试. 这里琢磨出一种可行的串口调试方法,可以简单的查看串口是否在正确工作. 1. 短接 tx 和 rx,让 ...
- linux下查看串口信息
rs232串口通信接口:当通信距离较近时(<12m),可以使用电缆线直接连接,若距离较远,需附加调制解调器. 9个脚针的定义: CDC数据载波检测,RXD接收数据,TXD发送数据,DTR数据中断 ...
随机推荐
- activeMq的helloword
http://blog.csdn.net/clj198606061111/article/details/38236679 点对点的同步消息模型 http://blog.csdn.net/jiuqiy ...
- linux环境中,如何使用tar来创建压缩包?解压缩?
需求说明: 今天需要将一个tomcat目录打成压缩包,使用zip感觉有点慢,所以就想用tar来试试,之前一直使用tar的解压缩命令, 今天试试tar的压缩命令 操作过程: 1.通过tar的zcf选项进 ...
- 【原】list<T>排序
继承IComparable #region IComparable public int CompareTo(object obj) { if(obj is Sce ...
- php查找之二分查找
二分查找,往往是针对有序的数组进行查找,我们假设一个序列是数组有序,然后给定一个数字,查出它应该在这个数组中的排序位置 百度百科中讲到 二分查找也称折半查找(Binary Search),它是一种效率 ...
- 启动vue项目,npm run dev服务起不来报错Error: listen EACCES 0.0.0.0:8080
端口被占用,所以才会报这个错误,解决方法: 方法1:释放端口8080 方法2:换一个新端口
- linux关闭喇叭
beep时常响起有时是很烦人的一件事情,在登录linux的时候关闭喇叭可以进行如下操作:在 Linux 控制台下(没有 X11),你可以使用一下命令:在 ~/.bash_profile中写入sette ...
- U3D 使用VS编程组件
http://visualstudiogallery.msdn.microsoft.com/6e536faa-ce73-494a-a746-6a14753015f1 http://visualstud ...
- jinja语法
<!--base.html--> <!DOCTYPE html> <html lang="en"> <head> <!--ht ...
- linux系统cpu和内存占用率
1.top 使用权限:所有使用者 使用方式:top [-] [d delay] [q] [c] [S] [s] [i] [n] [b] 说明:即时显示process的动态 d :改变显示的更新速度,或 ...
- java十年技术栈[总结复习用]
以下摘自http://www.tvtv223.com/so/8/default/8.html#36-数据库的分库分表mycat java技术栈 参考了众多资料,这里就不再详细列举了,可以自行去搜索 1 ...