0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何在嵌入式系统上实现异步串口通信

MCU开发加油站 来源:未知 作者:佚名 2017-12-04 09:51 次阅读

从软件的角度来看,所有的通信都是一串字节(叫做数据帧)的连续传输。软件需要采用适当的机制来保证接收端能够正确识别出一个完整的数据帧、能够检查接收到的数据帧是正确的、在传输发生错误时有合适的恢复机制。为此就需要定义一个合适的数据帧格式。

数据帧的提取

为了识别出一个完整的数据帧,基本上有两个机制:一是在软件上规定字节之间的间隔最大值,一旦两个字节间的间隔超过某个阈值,就认为一个数据帧结束;另一种机制不对字节间的间隔作规定,而是用特殊的字节来定义数据报的开始和结束,当收到该特殊字节时,就认为一个数据帧的传输已完成。采用第一种机制的,比如Modbus-RTU。就是规定了同一个数据帧的字节间隔不能大于1.5个字节的传输时间,一旦大于该间隔,则认为前一个帧的传输已经结束,或者出错。同时为了保证不同数据帧之间有足够的间隔,还规定了两个数据帧之间最少插入3.5个字节的空闲位。下图摘自Modbus协议,表示了一个正确的数据帧、错误的数据帧以及数据帧之间的间隔。同时在数据报中引入了CRC,用于检出数据帧层面的传输错误。

第二种机制需要选用一个特殊字节作为帧头帧尾(也可以给帧头帧尾选用不同的字节),比如说,选用0xFF作为帧头帧尾字节,也即发送端在每个数据帧的头尾都插入至少一个0xFF,接收端收到该字节就结束上一个帧的接收,同时从下一个非0xFF字节开始一个新的数据帧的接收。但该机制有一个问题,那就是所选的特殊字节(此处是0xFF)也可能是数据帧中的一个有效字节,如果不作特殊处理,接收端就可能把这个数据帧中的字节误认为是数据帧的结束标识,从而导致接收错误。因此,此处采取字节替换的特殊处理,以消除在数据帧的中间出现的特殊字节,以下是一个例子。

在此处,选0xFE作为字节替换的标识字节,将0xFF替换成0xFE 0x0F。由于0xFE是字节替换的标志,也成了一个特殊字符,同样需要进行替换。在上图中,将0xFE替换成0xFE 0x0E。

采用该机制时,发送端对数据帧中的所有0xFF,0xFE进行替换。在接收端则进行反向替换。如果在接收端的0xFE后面的字节收到非0x0F,0x0E的字符,说明发生了传输错误,丢弃已经接收的内容,重新搜索帧头字符开始一个新数据帧的接收。

数据帧的校验

考虑到串口通信有一定的误码率,无论是采用那种传输方式,必须有错误帧检出机制。通常选用的是CRC。一般用2个字节或4个字节。

串口驱动的实现

嵌入式系统中,串口驱动的实现一般有两个途径:一个是通过串口的收发中断与串口控制器的Buffer直接交换数据;另一种是通过DMA,利用DMA与串口Buffer交互自动收发数据。

与串口控制器直接交互的方式,实现简单,既可以实时进行字节替换以节省内存,也可以方便设置字节间的定时器。但频繁打断CPU,对有一定BUFFER大小的串口,还可以利用BUFFER进行性能优化,而对一些只有一个字节或两个字节BUFFER的串口,就需要一个字节起一次中断,如果CPU负荷较重,很容易由于中断处理不及时而导致字节丢失,特别是在高波特率的情况。

利用DMA与串口控制器交互的方式,由于不能实时进行字节替换,需要在放入DMA之前完成字节替换,导致占用较大内存空间。另外对于字节间间隔敏感的传输策略,需要用另外的机制,比如PRS,去操作定时器。用DMA的另一个问题是在接收时无法实时确定帧尾(采用帧头帧尾模式时),一般只能采用定时器与DMA配合,用字节流的方式处理接收。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

原文标题:嵌入式系统上的异步串口通信的实现

文章出处:【微信号:mcugeek,微信公众号:MCU开发加油站】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    嵌入式热门发展方向有哪些?

    良好的感知能力,能够根据复杂的环境作出优良的决策。此外,嵌入式系统在计算机视觉方面的应用,可以有效的识别和定位目标,采集相关的信息,能够实现人脸识别、行车辅助、运动跟踪等实时视觉应用。在多媒体中
    发表于 04-11 14:17

    简谈Xilinx Zynq-7000嵌入式系统设计与实现

    ,而用HDL语言描述硬件的具体实现的设计方法,这也是基于全可编程SoC和传统基于SoC器件实现嵌入式系统设计的最大区别,即真正
    发表于 04-10 16:00

    嵌入式系统发展前景?

    的发展前景也十分广阔。 随着物联网和智能设备的快速发展,嵌入式系统将更为普遍地应用于各种设备和设施,包括家用电器、医疗设备、交通工具等。这些设备将通过嵌入式系统
    发表于 02-22 14:09

    嵌入式软件开发应该掌握哪些知识?

    掌握的知识 1.基础知识 1.1 c/c++编程语言和数据结构 C/C++ 是嵌入式系统中常用的编程语言,因为它们提供了直接访问硬件的能力。通过使用特定的编译器和调用硬件相关的接口,可以实现对各种外设
    发表于 02-19 11:23

    嵌入式操作教程:2-12 RS232串口通信实验(查询方式)

    通信,但传输速度慢的应用场合。在嵌入式设计中,UART用于主机与辅助设备通信,如PC机通信包括与监控调试器和其它器件。 UART特点 (1)通用异步
    发表于 02-07 14:37

    嵌入式学习步骤

    开发板测试固件以及在实际设备上进行测试。 嵌入式系统的多样化发展,它将更为广泛地应用于各个领域,实现智能化、网络化、自动化的目标。同时,随着人工智能和机器学习技术的发展,
    发表于 02-02 15:24

    S3C2410嵌入式系统串口通讯设计

    电子发烧友网站提供《S3C2410嵌入式系统串口通讯设计.pdf》资料免费下载
    发表于 10-13 09:16 0次下载
    S3C2410<b class='flag-5'>嵌入式</b><b class='flag-5'>系统</b>多<b class='flag-5'>串口</b>通讯设计

    什么是嵌入式Linux?

    Linux到底是什么呢? 嵌入式linux 是将日益流行的Linux操作系统进行裁剪修改,使之能在嵌入式计算机系统运行的一种操作系统。简单
    发表于 10-11 13:47

    STM32嵌入式操作系统介绍

    嵌入式操作系统的特点• 嵌入式操作系统是一种用途广泛的系统软件,通常包括与硬件相关的底层驱动软件、系统
    发表于 09-28 06:59

    嵌入式软PLC系统研究和实现

    、可靠的操作、可连接的各种UO系统及网络接口。嵌入式软PLC由软PLC开发系统和软PLC运行系统组成,开发系统负责梯形图的编辑编译,运行
    发表于 09-25 07:15

    基于dsp嵌入式uiptcp_ip协议栈的应用研究

    系统接入网络实现音频传输的功能。 本文首先搭建了一个基于DSP嵌入式系统的以太网接入硬件平台,具体阐述了便携
    发表于 09-25 07:11

    STM32嵌入式操作系统介绍

    嵌入式操作系统的特点• 嵌入式操作系统是一种用途广泛的系统软件,通常包括与硬件相关的底层驱动软件、系统
    发表于 09-11 07:24

    嵌入式系统串口UART接口为啥没有数据输出

    :通用异步收发器)。雷卯电子工程师了解到嵌入系统UART是一种很普通的异步串行通信接口,常通过UART这个接口调试PCB板的硬件电路及软件程
    的头像 发表于 08-16 11:47 529次阅读
    <b class='flag-5'>嵌入式</b><b class='flag-5'>系统</b><b class='flag-5'>串口</b>UART接口为啥没有数据输出

    嵌入式系统串口UART接口为啥没有数据输出

    大家常说嵌入式里面的串口,一般是指UART(Universal Asynchronous Receiver Transmitter:通用异步收发器)。雷卯电子工程师了解到嵌入
    的头像 发表于 08-15 10:24 570次阅读
    <b class='flag-5'>嵌入式</b><b class='flag-5'>系统</b><b class='flag-5'>串口</b>UART接口为啥没有数据输出

    嵌入式教程_创龙教仪_实验操作:2-11 RS485 串口通信实验

    传输线将资料一位位地顺序传送,特点是通信线路简单,利用简单的线缆就可实现通信,降低成本,适用于远距离通信,但传输速度慢的应用场合。在嵌入式
    发表于 06-21 09:51