兩種方法實現STM32F103向串列埠一直髮送資料(程式原始碼,已測試)
阿新 • • 發佈:2018-11-01
串列埠是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 */