两种方法实现STM32F103向串口一直发送数据

发布者:幸福时刻最新更新时间:2019-04-12 来源: eefocus关键字:STM32F103  串口  发送数据 手机看文章 扫描二维码
随时随地手机看文章

串口是STM32最为重要的资源,在平时的硬件调试和软件调试中都是不可或缺的工具,最近在测试一块板子的通信功能是否正常,我打算用板子A的串口USART1一直向串口发送数据,用板子B的串口1接收数据,并将接收到的数据经过处理后显示在LCD液晶上。所以就写了下面的串口发送程序,发送的是数组函数。


Main.c


#include "led.h"

#include "delay.h"

#include "key.h"

#include "sys.h"

#include "usart.h"

u8 USART_fasong_Buf[8]={12,35,00,12,12,34,90,00}; // 接收缓冲区字节长度200

//u16 res=9;

void USART1_Send_Data(u8 *buf,u8 len);

/*************************方法2*******************

void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...);

*********************************************/

 int main(void)

 {

delay_init();     //延时函数初始化   

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级

uart_init(115200); //串口初始化为115200

  LED_Init();      //LED端口初始化

KEY_Init();          //初始化与按键连接的硬件接口


  while(1)

{

 

USART1_Send_Data(USART_fasong_Buf,8);

delay_ms(1000);

/***********************方法2**************/

// USART_OUT(USART1,"12");  

//  USART_OUT(USART1,"*  STM32F103-USART1串口一直发送数据*rn");   

//  USART_OUT(USART1,"1234567890rn");   

//  USART_OUT(USART1,"fufufufu1019rn"); 

//  USART_OUT(USART1,"rn"); 

//  USART_OUT(USART1,"rn");


}  

 }

 

 

void USART1_Send_Data(u8 *buf,u8 len)   //发送数据函数,带发送长度

{

u8 t;

  for(t=0;t

{    

while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);   

USART_SendData(USART1,buf[t]);

}  

 

while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);

}

   Usart.c


char *itoa(int value, char *string, int radix);

typedef struct __va_list { void *__ap; } va_list;

/****************************************************************************

* 名    称:void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...)

* 功    能:格式化串口输出函数

* 入口参数:USARTx:  指定串口

Data:   发送数组

...:     不定参数

* 出口参数:无

* 说    明:格式化串口输出函数

        "r" 回车符    USART_OUT(USART1, "abcdefgr")   

"n" 换行符    USART_OUT(USART1, "abcdefgrn")

"%s" 字符串    USART_OUT(USART1, "字符串是:%s","abcdefg")

"%d" 十进制    USART_OUT(USART1, "a=%d",10)

* 调用方法:无 

****************************************************************************/

void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...)

const char *s;

    int d;

    char buf[16];

    va_list ap;

    va_start(ap, Data);

 

while(*Data!=0){                           //判断是否到达字符串结束符

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_TC)==RESET);

                }

Data++;

                break;

            case 'd':   //十进制

                d = va_arg(ap, int);

                itoa(d, buf, 10);

                for (s = buf; *s; s++) {

                    USART_SendData(USARTx,*s);

while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);

                }

Data++;

                break;

default:

Data++;

    break;

}  

}

else USART_SendData(USARTx, *Data++);

while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);

}

}

/******************************************************

整形数据转字符串函数

        char *itoa(int value, char *string, int radix)

radix=10 标示是10进制 非十进制,转换结果为0;  

 

    例:d=-379;

执行 itoa(d, buf, 10); 后


buf="-379"       

**********************************************************/

char *itoa(int value, char *string, int radix)

{

    int     i, d;

    int     flag = 0;

    char    *ptr = string;

 

    /* This implementation only works for decimal numbers. */

    if (radix != 10)

    {

        *ptr = 0;

        return string;

    }

 

    if (!value)

    {

        *ptr++ = 0x30;

        *ptr = 0;

        return string;

    }

 

    /* if this is a negative value insert the minus sign. */

    if (value < 0)

    {

        *ptr++ = '-';

        /* Make the value positive. */

        value *= -1;

    }

    for (i = 10000; i > 0; i /= 10)

    {

        d = value / i;

 

        if (d || flag)

        {

            *ptr++ = (char)(d + 0x30);

            value -= (d * i);

            flag = 1;

        }

    }

 

    /* Null terminate the string. */

    *ptr = 0;

 

    return string;

 

} /* NCL_Itoa */



关键字:STM32F103  串口  发送数据 引用地址:两种方法实现STM32F103向串口一直发送数据

上一篇:STM32f103之流水灯
下一篇:stm32f103串口实现重映射功能

推荐阅读最新更新时间:2024-03-16 16:27

STM32 不断进入串口中断问题 解决方法
STM32 有时候会不断进入中断,解决方法如下 1.串口初始化配置时,需要打开ORE 溢出中断,如下红色代码所示 void Usart_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); // 开启串口时钟 GPIO_PinA
[单片机]
单片机 MSP430 串口 计算 波特率
软件计算波特率地址: http://software-dl.ti.com/msp430/msp430_public_sw/mcu/msp430/MSP430BaudRateConverter/index.html MSP430怎么计算波特率在各手册都有提到,但始终不清楚,直到看了官网的一篇文章: https://processors.wiki.ti.com/index.php/USCI_UART_Baud_Rate_Gen_Mode_Selection The formulas for calculating USCI UART Baud Rate Register Values are basically available
[单片机]
单片机 MSP430 <font color='red'>串口</font> 计算 波特率
10、STM32的串口(UART)及串口通信原理(内附代码)
一、通信接口介绍 1、处理器与外部设备通信的两种方式: 并行通信 - 传输原理:数据各个位同时传输。 -优点:速度快 -缺点:占用引脚资源多 串行通信 - 传输原理:数据按位顺序传输(一位一位传输)。 -优点:占用引脚资源少 -缺点:速度相对较慢 2、串行通信三种传送方式: 单工: 数据传输只支持数据在一个方向上传输 半双工: 允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切
[单片机]
10、STM32的<font color='red'>串口</font>(UART)及<font color='red'>串口</font>通信原理(内附代码)
基于STM32F103C8T6单片机的计步器设计
一.系统设计 由 STM32F103C8T6 单片机 最小系统 + AD XL345 + L CD1602 显示屏。通过ADXL345 检测 震动和移动并完成计数。累加的步数会传输到LCD1602上进行显示,可以直观的观察自己的步数。 图1 系统框图 二. 硬件 设计 系统内的主要电路有单片机最小系统电路,步数采集电路、显示电路,系统的内的电路并不复杂,只实现的步数的采集累加以及显示的功能。对于计步器而言,本系统的步数采集能力较为不错,有较高的灵敏度。 图2 硬件电路 三.软件设计 系统的软件逻辑清晰,首先先进行一次系统初始化,此时就开始进行计步检测。当完成计步后会将采集到的步数 信息 在显示屏上进行显示,判断是否完成
[单片机]
基于<font color='red'>STM32F103</font>C8T6单片机的计步器设计
基于STM32的HAL库学习(2)UART串口学习
1、串口的模式有3种,一是查询模式,二是中断模式,三是DMA模式 HAL_UART_Transmit();串口轮询模式发送,使用超时管理机制 HAL_UART_Receive();串口轮询模式接收,使用超时管理机制 HAL_UART_Transmit_IT();串口中断模式发送 HAL_UART_Receive_IT();串口中断模式接收 HAL_UART_Transmit_DMA();串口DMA模式发送 HAL_UART_Transmit_DMA();串口DMA模式接收 2、阻塞传输是调用这个函数并在等待时间内一直等待操作完成。 HAL_UART_Transmit HAL_UART_Receive
[单片机]
cotex_m3内核提供的ITM串口打印调试
cotex_m3内核的ARM提供了ITM串口打印观测的功能,可以不用ARM单片机自己的串口就可在开发时候串口打印调试.节约了宝贵的内部资源,同时也为调试提供了方便.使用方法如下: 1 将下面的SWO_Printf.c加入到工程中 /*SWO_Printf*/ #include stdio.h /*1 ÔÚkeil mdkÖÐÑ¡ÔñʹÓÃswo; 2http://blog.csdn.net/xiaolei05/article/details/8526021 */ //Add ITM Port register definitions to your source code. #define ITM_Port8(n) (*((vo
[单片机]
cotex_m3内核提供的ITM<font color='red'>串口</font>打印调试
搬运原作之一—DIY PL2303转串口
现在这个鼻涕串口还在我的实验台上工作的好好的。没有任何不稳定现象哟~ 首先上PL2303,要经过特殊处理哟。注意引脚 毕竟SSOP28 0.6MM的脚距太难操作,我只好这样了。现在掰弯一边了 这个其实已经掰完,飞线+内部连线了。毕竟有一部分GND脚是连在一起的 上已经焊好部分元件的洞洞板比划位置。那几个大洞是因为搞错了USB方向导致的 现在所以飞线已经焊接。检查 无误 后通电 这里一定要检查VBUS和GND/D+/D-是否短路,如果短路可能有烧毁南桥(或MCH)的危险! 结果是识别不出。后来发现D+要2.2K上拉到3.3V才能启动枚举过程,于是掰开VO 3V3飞线。 已经飞完了2.2k的
[单片机]
搬运原作之一—DIY PL2303转<font color='red'>串口</font>
TMS320C32扩展异步串口的方法
摘要:介绍了TMS320C32 DSP实现异步串行通信接口的三种方法:软件模拟实现、硬件实现、专用协议芯片实现。给出了具体实现的硬件接口和软件编程。在接口的第二种和第三种实现方法中,都使用了FPGA实现逻辑接口。 关键词:数字信号处理 异步串行接口 现场可编程逻辑阵列 电气传动控制 高速数字信号处理器(DSP)在现代工业控制中,特别是电气传动控制中的应用非常广泛。大量文献介绍的应用于电气传动控制的DSP使用的是TI公司的,TMS320系列DSP芯片,这其中又以TMX210C3X和TMS320F24X为主流应用产品。TMS320C32(以下简称为C32)是TMS320C3X系列产品中应用比较多的一种。主工业控制中,常常需要使用
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved