跳转到主要内容

串口

串口,即串行接口(Serial Interface),是一种用于在设备之间进行数据传输的通信接口。它逐位传输数据,一次只传输一个比特,这种传输方式所需的传输线较少,适合长距离通信和一些对线路成本敏感的应用场景。以下为你详细介绍:

分类

异步串口(UART)

  • 工作原理:不需要时钟信号来同步发送方和接收方,而是通过约定好的波特率(每秒传输的比特数)来协调数据传输。数据以帧为单位进行传输,每帧包含起始位、数据位、奇偶校验位(可选)和停止位。

  • 应用场景:在嵌入式系统中广泛应用,如单片机与传感器、蓝牙模块、计算机等设备之间的通信。常见的波特率有 9600、115200 等。

同步串口

  • 工作原理:使用一个时钟信号来同步发送方和接收方的操作,确保数据的准确传输。时钟信号可以由发送方提供,也可以由外部时钟源提供。同步串口通常用于高速数据传输,能够实现更高的数据传输速率。

  • 应用场景:常用于一些对数据传输速率和同步性要求较高的场景,如 SD 卡接口、SPI(串行外设接口)、I²C(集成电路总线)等。

干货 | STM32串口发送数据和接收数据方式总结

cathy 提交于

串口发送数据

1、串口发送数据最直接的方式就是标准调用库函数 。

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);

第一个参数是发送的串口号,第二个参数是要发送的数据,但是用过的朋友应该觉得不好用,一次只能发送单个字符,所以我们有必要根据这个函数加以扩展:

void Send_data(u8 *s)
{
 while(*s!='\0')
 { 
  while(USART_GetFlagStatus(USART1,USART_FLAG_TC )==RESET); 
  USART_SendData(USART1,*s);
  s++;
 }
}

以上程序的形参就是我们调用该函数时要发送的字符串,这里通过循环调用USART_SendData来一 一发送我们的字符串。

【妙招】一份 " IO口模拟串口 " 独门秘籍

cathy 提交于

1、聊一聊

好了,今天为大家带来几种IO口模拟串口"硬核"操作,相信大家对类似于串口这样的电平类通信会有新的认识。

2、IO模拟串口需求

"IO模拟UART"是作者大一加入学校创新团队老师出的第一道题目。毕竟当时专业知识不够,心里想:“实验室老师怎么这么变tai,有现成的串口不用,非得整个模拟串口”,接到这个题目一头雾水,于是上网各种找资料,最后基本实现了该功能,实现办法算是最初级的实现方式,不过确实给我开启了嵌入式的大门,所以今天也把这方面的东西分享给大家,希望对大家有帮助。

IO模拟串口需求

● 很多小伙伴应该都了解到现在很多的高性能的MCU都有大量的串口外设,比如下图的stm32F103系列USART高达5个,然而在我们一般的项目中可能仅仅就使用了2个左右的样子,并且串口外设引脚还可以remap重新映射,这对于那些对串口资源需求量比较大的项目,或许带来了一些缓解的福音。

如何写一个健壮且高效的串口接收程序?

cathy /

学单片机的大概最先、最常写的通信程序应该就是串口程序了,但是如何写出一个健壮且高效的串口接收程序呢?接下来鱼鹰将根据多年的开发经验教你如何编写串口接收程序。

1、传入参数指针

2、互斥锁释放顺序

3、数据帧检查

4、串口空闲

5、通信吞吐量

万变不离其宗之单片机串口共性问题

cathy 提交于

[导读] 单片机开发串口是应用最为广泛的通信接口,也是最为简单的通信接口之一,但是其中的一些要点你是否明了呢?来看看本人对串口的一些总结,当然这个总结并不能面面俱到,只是将个人认为具有共性以及相对比较重要的点做了些梳理。

啥是串口?

首先这玩意儿分两种:

  • 通用异步收发器(UART)是用于异步串行通信的一种物理层标准,其中数据格式和传输速度是可配置的。
  • 通用同步收发器(USART)是一种串行接口设备,可以对其进行编程以进行异步同步通信。

数据格式

“”

线上空闲、无数据状态为常高电平,故逻辑低定义为起始位。

基于STM32的串口循环队列

cathy 提交于

先说串口,这个应该都知道吧!(不知道的童鞋,先把基本功学好)大部分单片机或者处理器都会带一个或者多个串口,方便进行数据的通信。

那么串口的循环队列是什么?这里以STM32的串口为例,进行解释说明。

假设串口一次只发一个数据,这倒是简单了,每次只对这一个数据进行判断,然后处理相关指令。但现实不会一直都这么美好,很多时候你收到的可能是一大串数据,你要先小心翼翼的把它们存好,然后再依次判断这里面有哪些指令要处理。

“”

假设你定义了一个30个元素的数组a[30],每次串口收到数据都往里面存,存的时候地址加一。这个操作很简单吧,应该是都会的。

但是取的时候怎么取?你收到的指令可能是2个数据,也可能是3个数据,几种长度不一样的指令混在一起。

一次从数组里读出几个数据?怎么快速腾出已读数据的位置?还是一次都读完,然后整个数组清零?

先说一次读完,然后清零的这个方法为什么不行。

1、读的时候,里面的数据不一定是完整的。有可能某组数据刚接收到一半儿。