USART串口通信

同步通信和异步通信

通信,最少要有两个对象,一个收,一个发。根据数据通信是否同步,可分为同步通信和异步通信

同步通信:一般情况下同步通信指的是通信双方根据同步信号进行通信的方式。比如通信双方有一个共同的时钟信号,通讯中通常双方会统一规定在时钟信号的上升沿或下降沿对数据线进行采样。

异步通信:是指数据传输速度匹配依赖于通信双方有自己独立的系统时钟,大家约定好通信的速度。异步通信不需要同步信号,但是并不是说通信的过程不同布

即同步通信的两个设备中间有时钟线连接,两个设备按照相同的时序发送或接收数据

异步通信的两个设备使用的是自己内部的时钟,但是通过约定好的通讯速率即波特率发送或接收数据

串行通信和并行通信的区别

串行通信:指的是同一时刻只能收或发一个bit位信息。因此只用1根信号线即可。

串行通信占用引脚资源少,但是速度较慢

并行通信:指的是同一时刻可以收或发多个bit位的信息,因此需要多根信号线才行

并行通信传输速度快但是占用引脚资源较多

单工、半双工、全双工

单工:要么收,要么发,只能做接收设备或者发送设备。比如收音机

半双工:可以收,可以发,但是不能同时收发, 比如对讲机

半双工实际上就是一个可以转换方向的单工

全双工:可以在同一时刻既接收,又发送。 如手机

全双工实际上就是两个方向相反的单工的集合

常见通信总结

 

USART: Universal Synchronous Asynchronous Receiver and Transmitter的缩写,即通用同步异步收发器可以灵活地与外部设备进行全双工数据交换。

UART 外设(Universal Asynchronous Receiver and Transmitter),它是在 USART基础上裁剪掉了同步通信功能,只有异步通信。

串口通信协议介绍

 

 

波特率

在串行通信中,用“波特率”来描述数据的传输速率。所谓波特率,既每秒传送的二进制位数,其单位为bps(bits per second)。它是衡量串行数据速度快慢的重要指标。

国际上规定一个标准的波特率系列:110、300、600、1200、1800、2400、4800、9600、115200、14.4Kbps、19.2Kbps、……

例如:115200bps、指每秒传送115200位。通信双方必须设置同样的同学速率才能正常通信

注意:实际的数据没这么多,还包括起始位,结束位,校验位

串口寄存器介绍

控制寄存器——USART_CR

波特率寄存器——USART_BRR

状态寄存器——USART_SR

数据寄存器——USART_DR

奇偶校验:例如将发送的数据中1的个数加起来,如果选择奇校验,但是1的个数为偶数,则检验位为1,收到数据后将数据中1的个数和校验位加起来,如果是奇数则数据正确否则重发,偶校验与此类似

STM32 USART寄存器介绍

串口寄存器-USART_CR1

串口寄存器-USART_CR2

串口寄存器-USART_BRR

串口寄存器-USART_SR

串口寄存器-USART_DR

STM32实现串口数据的收发

 

 

 

 

串口发送一个字符

void Uart1_Putchar(uint8_t ch)
{
    while(!(USART1->SR &(1<<7)));    //等待发送寄存器空
    USART1->DR = ch;//发送字符
}
void Uart1_Putstring(uint8_t *str)
{
    while(*str != '\0')
    {
        Uart_Putchar(*str);
        str++;
    }
}

串口接收一个字符

uint8_t Uart1_Getchar(void)
{
    while(!(USART1->SR & (1<<5))); //等待收到一个字符的数据
    return    USART1->DR;//返回收到的字符
}

HAL库中串口的收发函数

Stm32f0xx_hal_uart.c文件中

串口的发送函数

HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

串口的接收函数

HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

Printf()实现—串口重定向

printf函数调用的是c库中的fputc函数。因此我们如果重新写了fputc函数,就可以改变printf函数的功能,可以向串口打印输出。

int fputc(int ch,FILE * f)
{
    while((USART1->SR&(1<<7))==0);
    USART1->DR=(uint8_t)ch;
    return ch;
}

  • 19
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值