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
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 */