两种方法实现STM32F103向串口一直发送数据(程序源码,已测试)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/FUBIN0000/article/details/78335449
       串口是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串口一直发送数据*\r\n");   
//  USART_OUT(USART1,"1234567890\r\n");    	 	
//  USART_OUT(USART1,"fufufufu1019\r\n"); 
//  USART_OUT(USART1,"\r\n"); 
//  USART_OUT(USART1,"\r\n");
		
	}	 
 }
 
 
void USART1_Send_Data(u8 *buf,u8 len)   //发送数据函数,带发送长度
{
	u8 t;
  	for(t=0;t<len;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, "abcdefg\r")   
			"\n"	换行符	   USART_OUT(USART1, "abcdefg\r\n")
			"%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 */






猜你喜欢

转载自blog.csdn.net/FUBIN0000/article/details/78335449