文章目录

  • 1 概述
    • 1.1 串口通信是什么
    • 1.2 波特率
    • 1.3 串口通信的用途
  • 2 串口收发
    • 2.1 波特率发生器
    • 2.2 收发FIFO
    • 2.3 DMA
  • 3 串口收发程序设计
    • 3.1 串口发送数据
    • 3.2 串口接收

1 概述

1.1 串口通信是什么

串口通信是指外部设备与主控芯片之间,通过数据信号线、地线等,按位进行数据传输的一种通信方式,属于串行通信方式。串行通信是指使用一条数据线依次逐位传输数据,每一位数据占据固定长度的时间。可以看一下简单的串行通信示意图。

串口通信只需几条线即可在两个系统间交换信息,特别适用于计算机与计算机、计算机与外设之间的通信,常用的串口通信接口标准有很多,比如RS-232C、RS-232、RS-485等。

但是放在单片机开发里,最简单的串口通信就是用四根线VCC、GND、TXD和RXD实现通信。


一般串口通信是一种异步半双工的通信方式,当然也有同步的,也有全双工的。至于这些都是什么意思,大家可以自行搜索一下。

1.2 波特率

引用专业的说法,波特率表示单位时间内传送的码元符号的个数,它是对符号传输速率的一种度量。其实意思就是波特率表示1s内传输码元的个数。在单片机中数字都是二进制的01表示的,所以波特率可以说是1s内传输01的个数。常见的波特率有38400、9600和115200等。

1.3 串口通信的用途

串口通信的用途有很多,这里只是简单分享一下博主接触到的用途。首先就是最简单的单片机与外设的通信,其次上位机与单片机的通信也可以通过串口通信。比如利用上位机通过串口给单片机烧写程序。其他还有接触到串口转高速红外,利用红外给单片机烧写程序。

2 串口收发

2.1 波特率发生器

串口要想实现收发首先要有波特率发生器,网上介绍波特率发生器的作用是输入时钟转换出需要的波特率CLK。个人理解,波特率发生器就是提供一个时钟,这样才能发送出正确波特率的信息,比如1和0需要多久的高/低电平表示。

在串口通信时如果收发双方波特率不相同会导致通信失败,要么是接收不到,要么是接收到的是乱码。

2.2 收发FIFO

其实FIFO可以理解成一个水管,先进先出,后进后出,用来存储要发送或者接收的信息。或者干脆拿数组做收法内容的存储也可以。

博主接触到的芯片收发FIFO是共用的。比如CPU想通过串口发送信息给外设,需要发送的内容会先送进FIFO,然后发送给外设。通常会有FIFO非空中断、FIFO全满中断或者FIFO半满中断这些,用来告知CPU某一时刻FIFO的状态。

2.3 DMA

其实在串口收发是DMA算是老朋友了。主要原因是使用DMA不需要CPU的干预,这样CPU就可以去处理别的事务,可以提高系统的效率。

通常在准备发送数据时会可以触发DMA,DMA将需要发送的数据直接搬运到发送的寄存器。在需要接收时会触发接收中断,也可以配置DMA,直接将接收数据搬运到内存。也可以根据DMA中的TCNT寄存器来观察数据是否搬运完成。但是值得注意的是,DMA搬运完成并不代表接收或者发送完成,个人觉得还是要看FIFO的状态才能判断此时是否收发完成。

3 串口收发程序设计

这里以STM32为例简单介绍一下串口收发的程序设计。

3.1 串口发送数据

//串口发送函数
void USART1_Send(u8*str)
{u8 index=0;do{USART_SendData(USART1,str[index++]);while(USART1,str[index++]);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);}while(str[index]!=0);
}

其实这里最根本的USART_SendData()本质就是将数据搬运到串口发送的寄存器。

当然除了直接用发送函数发送,也可以直接重定向之后用printf发送,这里就不详细介绍了,有需要的友友可以直接去看普中或者正点的教程视频。

3.2 串口接收

串口接收一般是在中断中进行,比如接收到消息时会有一个串口接收中断,此时会在接收中断的中断服务函数中接收数据。

u32 receCount = 0;   // 接收计数变量
u32 clearCount = 0;   // 清空接收数组计数变量
u8 receFifo[1500];   // 接收数组
u8 receEndFlag = 0;   // 接收完成标志位void USART1_IRQHandler(void)
{if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)   //接收到一个字节  {receFifo[receCount++] = USART_ReceiveData(USART1);}else if(USART_GetITStatus(USART1,USART_IT_IDLE) != RESET)   //接收到一帧数据{USART1->SR;//先读SRUSART1->DR;//再读DRreceEndFlag = 1;   // 接收完成标志置1 }
}

需要注意的是在解析完接收函数后要对接收数据进行清0。

void Uart_Rece_Pares(void)   // 串口接收内容解析函数
{if (receEndFlag  == 1)   // 如果接收完成{// 解析接收内容}// 清空接收数组for (clearCount = 0;clearCount < receCount;clearCount ++){receFifo[clearCount] = ' ';}receCount = 0;   // 清零接收计数变量
}

在解析接收帧时可以自己定义帧结构,比如简单的帧头帧尾判断这种。

嵌入式开发—串口通信相关推荐

  1. 基于VC++开发串口通信的方法

    串行通信中的关键是串行通信设备的初始化.数据的发送和接收及其实现方式. 在Dos环境下,用户可以直接对通信设备编程,可以通过查询中断的方式使用通信设备.但是Windows不提倡应用程序直接控制硬件,而 ...

  2. C#上位机开发串口通信编程——倒计时器开发

    C#上位机开发串口通信编程--倒计时器开发 一.介绍 这是我按照B站上的一个上位机开发视频教程开发的倒计时器开发,本来只有开始计时功能,没有停止计时功能,停止计时功能后面我自己添加了. 视频网址:C# ...

  3. 嵌入式学习——串口通信小试

    嵌入式学习--串口通信小试 目录 嵌入式学习--串口通信小试 1.了解串口协议和RS-232.485标准,以及RS-232.485电平与TTL电平的区别 1.1 什么是串口协议 1.2 RS-232标 ...

  4. Linux ROS与嵌入式的串口通信

    1.根据ros wiki的官方教程 学习即可,并且有许多例子可供学习 http://wiki.ros.org/rosserial_arduino/Tutorials 2.用ASIO读写设备串行口 AS ...

  5. 用VC开发串口通信dll控件

    VC串口通信技术网<VC串口上位机编程方法简介>介绍了串口编程的常见方法,其中就有使用串口dll控件的方法,dll是一种动态链接库,使用起来非常方便. 本文利用VC编程工具,对Window ...

  6. C#上位机开发串口通信

    一.创建一个Winform窗体,制作一个5s定时器 using System; using System.Windows.Forms;namespace 计时器 {public partial cla ...

  7. linux下QT开发串口通信助手

    串口通信的应用十分广泛,所以在QT下编写一个串口通信程序就显得尤为重要.下面将一步一步叙述开发过程: 1.下载第三方QT串口类,免积分 http://download.csdn.net/detail/ ...

  8. python开发串口通信界面_python串口编程实例

    Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public License)协议. Python具有丰富和强大的库.它常被昵称为胶水语言,能够把用其 ...

  9. linux串口助手开发,linux下QT开发串口通信助手

    串口通信的应用十分广泛,所以在QT下编写一个串口通信程序就显得尤为重要.下面将一步一步叙述开发过程: 1.下载第三方QT串口类,免积分 http://download.csdn.net/detail/ ...

最新文章

  1. SLAM综述|激光与视觉融合SLAM
  2. Lua与Redis交互
  3. as it exceeds the max of 500KB._IT狂人第一季 | 如何考察员工
  4. python替换所有标点符号 正则_python 把标点符号替换为空
  5. JAVA知识基础(五):深入理解final关键字
  6. Javaslang 3.0之路
  7. APUE习题[实现dup2函数功能,不使用fcntl]
  8. zTree模糊搜索(子级和父级都不匹配时隐藏节点)
  9. 2020中国联通软件研究院秋招笔试编程题
  10. ns-3 教程 —— 入门
  11. C#酒店客房管理系统设计与实现
  12. Python:体脂计算
  13. 智能穿戴及传感器调研
  14. 梅隆大学计算机专业申请,卡耐基梅隆大学计算机专业申请要求及研究方向
  15. 梯度下降-5463. 服务中心的最佳位置
  16. Android 如何加载网页、图片以及PDF文件之项目实战
  17. 【论文阅读】2021中国法研杯司法考试数据集研究(CAIL2021)
  18. Solidworks如何标注垂直度,平行度
  19. 还在埋头干活?给程序员的几个忠告
  20. 数据结构与算法图解——树

热门文章

  1. Android之动画全讲-刘志远-专题视频课程
  2. Android仿QQ通讯录分组展示ExpandableListView
  3. 关于python的常量和变量下列描述正确的是_下面关于数据类型说法正确的是?
  4. 汽车类稿件撰写:介绍一款汽车的稿子怎么写?
  5. 云存储中不可不知的五个安全问题及应对措施
  6. 简单的flask+nginx项目助你开阔思路
  7. 【飞桨PaddlePaddle学习心得】被遗忘的8张图片(day2爬虫的王姝慧的问题)
  8. 北京2022年高考数学题纯手工排版
  9. 原来当年发葫芦娃种子的才是真正的老司机
  10. MD5是什么?如何使用MD5?