1. 程式人生 > >兩種方法實現STM32F103向串列埠一直髮送資料(程式原始碼,已測試)

兩種方法實現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串列埠一直髮送資料*\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 */