串口发送代码讲解

新建bsp_usart.c和bsp_usart.h,添加到工程,魔术棒添加头文件所在的文件夹.

bsp_usart.c

#include "bsp_usart.h"

void USART_Config(void)
 {
     GPIO_InitTypeDef GPIO_InitStructure;
     USART_InitTypeDef USART_InitStructure;

    // 打开串口GPIO的时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

     // 打开串口外设的时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

    // 将USART Tx的GPIO配置为推挽复用模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     GPIO_Init(GPIOA, &GPIO_InitStructure);

  // 将USART Rx的GPIO配置为浮空输入模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
     GPIO_Init(GPIOA, &GPIO_InitStructure);

     // 配置串口的工作参数
    // 配置波特率
    USART_InitStructure.USART_BaudRate = 115200;
     // 配置 针数据字长
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
     // 配置停止位
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
     // 配置校验位
    USART_InitStructure.USART_Parity = USART_Parity_No ;
     // 配置硬件流控制
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
     // 配置工作模式,收发一起
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
     // 完成串口的初始化配置
    USART_Init(USART1, &USART_InitStructure);

  // 使能串口
    USART_Cmd(USART1, ENABLE);
 }

/* 发送一个字节 8 位*/
 /*STM32 USART只能一次发送8位*/
void Usart_SendByte(USART_TypeDef* pUSARTx, uint8_t data)
 {
     USART_SendData(pUSARTx, data);
     while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET );
 }

/* 发送两个字节的数据 * 16位*/
 /*分两次发送*/
void Usart_SendHalfWord(USART_TypeDef* pUSARTx, uint16_t data)
 {
     uint8_t temp_h,temp_l;/*高低8位*/

     temp_h = (data&0xff00) >> 8 ;
     temp_l = data&0xff;
     /*先发送高8位*/
     USART_SendData(pUSARTx, temp_h);
     while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET );
     /*在发送低8位*/
     USART_SendData(pUSARTx, temp_l);
     while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET );
 }

/* 发送8位数据的数组 */
void Usart_SendArray(USART_TypeDef* pUSARTx, uint8_t *array,uint8_t num)
 {
     uint8_t i;
     for( i=0; i<num; i++ )
   {
         Usart_SendByte(pUSARTx, array[i]);
     }
     //发送8位是判读,TXE,大于8位判断TC
     while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TC) == RESET );
 }

/* 发送字符串 */
void Usart_SendStr(USART_TypeDef* pUSARTx, uint8_t *str)
 {
     uint8_t i=0;
     do
   {
         Usart_SendByte(pUSARTx, *(str+i));
         i++;
     }while(*(str+i) != ‘\0‘);
     while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TC) == RESET );
 }

///重定向c库函数printf到串口,重定向后可使用printf函数
int fputc(int ch, FILE *f)
 {
         /* 发送一个字节数据到串口 */
         USART_SendData(USART1, (uint8_t) ch);

         /* 等待发送完毕 */
         while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);        

         return (ch);
 }

bsp_usart.h

#ifndef __BSP_USART_H
 #define __BSP_USART_H

#include "stm32f10x.h"
 #include <stdio.h>

void USART_Config(void);
 void Usart_SendByte(USART_TypeDef* pUSARTx, uint8_t data);
 void Usart_SendHalfWord(USART_TypeDef* pUSARTx, uint16_t data);
 void Usart_SendArray(USART_TypeDef* pUSARTx, uint8_t *array,uint8_t num);
 void Usart_SendStr(USART_TypeDef* pUSARTx, uint8_t *str);

#endif 

main.c

#include "stm32f10x.h"   // 相当于51单片机中的  #include <reg51.h>
#include "bsp_led.h"
#include "bsp_exit.h"
#include "bsp_usart.h"

int main(void)
{
    // 来到这里的时候,系统的时钟已经被配置成72M。

//USART和上位机交互
    uint8_t a[10]={100,2,3,4,5,6,7,8,9,10};//声明必须在前面
    USART_Config();

    //默认发送的是字符,当不是字符时候,会自动将其转换成相对于的ASCII值 100对应d
    //当然你也可以这样 ‘A‘ 当然你也可以在上位机上选择16进制
    //Usart_SendByte(USART1, 100);
    //Usart_SendByte(USART1,‘A‘);

    //Usart_SendHalfWord(USART1, 0xff56);
    //printf( "串口printf函数测试\n" );

    //Usart_SendStr(USART1, "欢迎使用秉火STM32F103开发板 \n");

    Usart_SendArray(USART1, a,10);

  while(1){

    }
}

原文地址:https://www.cnblogs.com/wenshinlee/p/8972399.html

时间: 2024-10-01 13:42:00

串口发送代码讲解的相关文章

C#串口通信—向串口发送数据,同步接收返回数据

最近写C#串口通信程序,系统是B/S架构.SerialPort类有一个DataReceived事件,用来接收串口返回的数据,但这种方式在C/S架构下很好用,但B/S就不好处理了.所以写了一个同步模式接收返回数据的方法,不使用DataReceived事件.经过测试,可以正常使用(不支持多线程调用). 一.Machine类 1.Machine类有一个静态变量,定义如下: private static SerialPort serialPort = null; 2.向串口发送数据,同步接收返回数据的方

C语言通过串口发送AT指令

以下代码是通过串口发送AT指令: atcmd.c: #include <stdio.h> #include <string.h> #include "atcmd.h" static HANDLE hCom; static char com_name[32] = {0}; static int BaudRate; FILE *fp; int AT_ComOpen() { fp = fopen("debug.txt", "w"

串口发送模块——1字节数据发送

此次试验旨在通过串口试验,讲述FPGA的硬件设计思想和通用设计流程.串口是电子设计中非常常见,可以说掌握了串口数据收发,就明白了最基本的时序操作.串口的数据收发过程有其固定的数据格式.下面是本次实验使用的数据格式,在满足串口格式规范前提下是可变的: 空闲状态下为高电平,当发送数据时,先发送低电平起始位,后从低位开始逐位发送有效数据比特,数据位位数由双方约定,此处设定为8位.可在数据位后添加数据校验位,但这不是必须的.发送完后发送高电平停止位并持续空闲状态直至下一次发送.虽然本次实验没有用到,但这

[ZigBee] 7、ZigBee之UART剖析(ONLY串口发送)

综述:USART0和USART1是串行通信接口,它们能够分别运行于异步UART模式或者同步SPI 模式.两个USART具有同样的功能,可以设置在单独的I/O 引脚. 1.UART 模式 UART 模式提供异步串行接口.在UART 模式中,接口使用2 线或者含有引脚RXD.TXD.可选RTS 和CTS 的4 线. UART 模式的操作具有下列特点: ● 8 位或者9 位负载数据● 奇校验.偶校验或者无奇偶校验● 配置起始位和停止位电平● 配置LSB 或者MSB 首先传送● 独立收发中断● 独立收发

RX232串口发送

在进行工程调试的时候有时候需要对变量进行观察,SingnaTap II Logic Analyzer 只能对管脚进行观察,所以要观察内部的变量必须把内部的变量进行输出.一种方法是直接把变量定义成管脚通过signaltap II观察,一种是用显示器显示,另外一种是通过串口进行观察.本文主要写了串口发送的一些代码. 时序图: 起始位0 数据8bit 结束位1 一共10bit 输入50MHz通过megawizard 生成9600Hz比例系数为3/15625; 代码如下: module RX232_IN

串口发送带有使能引脚的注意事项

多字节串口发送时,为提高发送速度,我们一般会去检测TXE: Transmit data register empty,当该位置1时,即发送下一个字符. for(i=0;i<len;i++) { USART_SendData(USART1,str[i]); while((USART_GetFlagStatus(USART1,USART_FLAG_TXE))==RESET); } 但是当存在读写使能端口时,最后一个while检测完毕即关闭使能端口,这样会存在最后一个数据在移位寄存器内但并没有发送出去

关于STM32 USART(串口)发送数据丢失第一帧的真实原因探索

自我介绍 为什么要写个自我介绍?俗话说,光说不练假把式,光练不说傻把式, 因为本人一直很自负,感觉什么东西都可以很快上手(当然非对口专业知识要求高的技能除外),如果我不把这自负表现出来,感觉会憋出内伤. 本人于2015年毕业于电子科技大学,开始的理想是进入一家国外的游戏公司,但理想很丰满,现实很骨感,给育碧.2k Game.Gameloft.EA都投了简历,但都被无情pass掉了(在此吐槽一下,这些公司真的是想在校园里招本科生吗?明明是研究生的计算机图形学却成了这些公司对本科生的要求).后来毕业

关于Matlab串口发送HEX格式字符

终于想起来更新一下关于使用Matlab串口发送HEX格式字符.这个用法主要来自于我使用Matlab对机器人进行实时轨迹跟踪的绘制,由于底层限制,自己又不想在中间增加转换模块,就需要直接发送HEX格式指令进行运动控制. 这个功能一开始一直没有实现,找了非常多国内论坛的资料,也没有好的解决办法,直到有一天谷歌出了一个国外论坛的网友给的方法,非常简单,三条指令搞定!现在列在下面: Str = 'FF55AACCDDEE00AA';     %字符串定义需要发送的十六进制内容 D = sscanf(St

进阶项目(3)UART串口通信程序设计讲解

写在前面的话 UART串行接口简称串口,是我们各类芯片最常用的一种异步通信接口,通过串口我们就可以建立起计算机和我们实验板之间的通信和控制关系,也就是我们通常所说的上下位机通信.串口可以说是不同平台互相通信.控制的一个最基本的接口. 项目需求 设计一个UART控制器,当控制器从上位机接收到数据以后,马上将数据输出,发送回上位机,完成“回环测试”.  UART的原理分析 要实现UART通信,首先我们需要用到一个外部的电平转换芯片MAX232,其具体配置电路如下: 注解: MAX232芯片是美信(M