历史上的今天
返回首页

历史上的今天

今天是:2025年04月12日(星期六)

2019年04月12日 | 两种方法实现STM32F103向串口一直发送数据

2019-04-12 来源:eefocus

串口是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 */



推荐阅读

史海拾趣

Ferranti Electric Inc公司的发展小趣事

Ferranti Electric Inc公司的历史可追溯到1880年,由Sebastian Ziani de Ferranti(塞巴斯蒂安·齐亚尼·德·费兰蒂)在英国创立。作为发电机及壳式变压器的发明者之一,费兰蒂博士不仅拥有交流发电机、高压电缆、断路器等176项专利,而且他的创新精神也为公司的创立和发展奠定了坚实的基础。初创时期,公司就专注于电气产品的研发和生产,逐渐在电气行业崭露头角。

Excelsys公司的发展小趣事

Excelsys公司自创立之初,就致力于电源管理技术的研发。在电子行业中,电源管理一直是影响产品性能和可靠性的关键因素。公司团队通过不断的技术创新,推出了一系列高性能、高效率的电源管理产品,赢得了市场的广泛认可。特别是在智能设备日益普及的背景下,Excelsys的电源管理解决方案为各种智能设备提供了稳定可靠的电力支持,助力了行业的发展。

AverLogic公司的发展小趣事

随着电子行业的不断发展,市场竞争也日益激烈。面对行业的变革和挑战,AverLogic公司及时调整战略,加大在研发和创新方面的投入,以适应市场的变化。同时,公司还积极开拓新的应用领域,如智能家居、自动驾驶等,以寻求新的增长点。这些战略调整不仅帮助公司应对了市场的挑战,也为其未来的发展奠定了坚实的基础。

ALLIED [Allied Electronics]公司的发展小趣事

除了关注业务发展外,AverLogic公司还积极履行企业社会责任,推动可持续发展。公司注重环保和节能,采用环保材料和生产工艺,减少对环境的影响。同时,公司还积极参与公益事业,为社会做出贡献。这些举措不仅提升了公司的社会形象,也为其在电子行业中树立了良好的口碑。

需要注意的是,这些故事是基于一般性的电子行业趋势和公司可能的发展路径构建的,并不代表AverLogic公司的实际发展历程。如需了解AverLogic公司的具体发展故事,建议查阅相关的行业报告、公司年报或新闻报道。

ELM Technology Corporation公司的发展小趣事

ELM Technology Corporation非常重视企业文化的建设。公司倡导“创新、协作、诚信、责任”的企业精神,鼓励员工积极创新、勇于担当。同时,公司还为员工提供了良好的工作环境和福利待遇,增强了员工的归属感和凝聚力。这种积极向上的企业文化为ELM的持续发展提供了强大的动力。

请注意,以上故事仅为概述,具体细节和事实需要根据ELM Technology Corporation的实际情况进行补充和完善。

Continental公司的发展小趣事

随着汽车工业的发展,大陆集团开始将业务扩展到汽车轮胎领域。1901年,马牌轮胎首次与德国戴姆勒·奔驰汽车公司合作参加汽车竞赛,这标志着大陆集团正式进入汽车轮胎市场。仅仅三年后,大陆集团就生产出了全世界第一条带花纹的汽车轮胎,这一创新大大提高了轮胎的抓地力和安全性。1908年,大陆集团又生产出了全世界第一个可拆装的车轮,使车轮和车轴分开,由此大大节省了换轮胎的时间。这些技术创新使得大陆集团在汽车轮胎市场上占据了重要地位。

问答坊 | AI 解惑

一起来学MODELSIM

有对学习MODELSIM感举的朋友,一起来学习吧,欢迎访问我的博客,共同学习,共同进步…

查看全部问答>

很苦恼的GPS座标比对

现有固定座标100个(路径是一个大椭圆形,公交車的行駛路線) 和 现在座标1个(移动的) 如何得知目前的座标是往哪个固定座标移动中? 这问题看似简单,可是很复杂阿! 找出现在座标离最近的一站是可以找的出来,没啥, 就是比对100个固定座标和现在 ...…

查看全部问答>

为什么GPIO中有的Pin要设为Pull_Up/Pull_Down?

如题,其中有的pin为输入pin,有的pin为输出pin,但是为什么要设置一些pin的属性为pull up或者为pull down,pull up/pull down到底是干吗用的?根据什么来设的呢,聆听各位大虾的教诲!!…

查看全部问答>

uc/OSII中关于消息队列的疑惑,望大虾们指教

INT8U OSQPost (OS_EVENT *pevent, void *msg) 1、这个函数是发送消息的函数,如果每次都发送一个消息过来,这个消息是指针,那么我认为这个消息一定是一个占一定内存空间的结构。 2、而清空消息队列的函数只是将消息队列的信息给置成空了,但是 ...…

查看全部问答>

寒假想给自己补充些知识

看了DIY板块,发现自己对一些小制作十分有兴趣,高手可以推荐自己动手做一些东西方便入门嘛~~在学校学习了数模电,但是由于课程安排,实验在下个学期上,我想自己在寒假的时候也能进行些小实验。。  手头上有个avr的学习版,  不知道能不 ...…

查看全部问答>

2011年3月1日 有点惊喜

   今天早上九点多查看六级成绩,过了!呵呵·····    今天晚上在外边吃饭,刚吃完手机响了,原来是在论坛申请的“eZ430-RF2500开发套件”到了!    今天我们学校的一卡通正式开通了;    今天重庆 ...…

查看全部问答>

wince6.0无法启动

利用TQ2440开发板做应用,IO口连接到FPGA时,wince无法启动了,怎么回事啊?新手求指教,我是想用camera接口当成普通IO口使用…

查看全部问答>

S52单片机P0口的问题

为啥S52单片机的P0口是开漏的,AD采集必须接到这个口么,为什么,是因为高阻抗么?如果不用这个口,是不是在ADC的电压采集口加上电压跟随器就行了?…

查看全部问答>

关于CAN发送的问题

我在用CAN发送报文的时候,模式设置和初始化部分 我能确定都没有问题   但是报文发送时始终出现错误  我读取寄存器时,发现发送错误位检测为1. 问各位一个问题报文发送期间会发生总线错误有哪些原因呢    我用的是MSP430操作MC ...…

查看全部问答>

照相手机闪光灯LED驱动的新思路

replyreload += \',\' + 1340057;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>