历史上的今天
今天是: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 */
上一篇:STM32f103之流水灯
史海拾趣
|
现有固定座标100个(路径是一个大椭圆形,公交車的行駛路線) 和 现在座标1个(移动的) 如何得知目前的座标是往哪个固定座标移动中? 这问题看似简单,可是很复杂阿! 找出现在座标离最近的一站是可以找的出来,没啥, 就是比对100个固定座标和现在 ...… 查看全部问答> |
|
为什么GPIO中有的Pin要设为Pull_Up/Pull_Down? 如题,其中有的pin为输入pin,有的pin为输出pin,但是为什么要设置一些pin的属性为pull up或者为pull down,pull up/pull down到底是干吗用的?根据什么来设的呢,聆听各位大虾的教诲!!… 查看全部问答> |
|
INT8U OSQPost (OS_EVENT *pevent, void *msg) 1、这个函数是发送消息的函数,如果每次都发送一个消息过来,这个消息是指针,那么我认为这个消息一定是一个占一定内存空间的结构。 2、而清空消息队列的函数只是将消息队列的信息给置成空了,但是 ...… 查看全部问答> |
|
看了DIY板块,发现自己对一些小制作十分有兴趣,高手可以推荐自己动手做一些东西方便入门嘛~~在学校学习了数模电,但是由于课程安排,实验在下个学期上,我想自己在寒假的时候也能进行些小实验。。 手头上有个avr的学习版, 不知道能不 ...… 查看全部问答> |
|
今天早上九点多查看六级成绩,过了!呵呵····· 今天晚上在外边吃饭,刚吃完手机响了,原来是在论坛申请的“eZ430-RF2500开发套件”到了! 今天我们学校的一卡通正式开通了; 今天重庆 ...… 查看全部问答> |
|
我在用CAN发送报文的时候,模式设置和初始化部分 我能确定都没有问题 但是报文发送时始终出现错误 我读取寄存器时,发现发送错误位检测为1. 问各位一个问题报文发送期间会发生总线错误有哪些原因呢 我用的是MSP430操作MC ...… 查看全部问答> |




