精华内容
下载资源
问答
  • 串口通信基本原理.pdf

    2020-03-15 21:09:40
    串行端口的本质功能是作为CPU的串行设备间的编码转换器。当数据从CPU经过串行端口发送出去时,字节数据转换为串行的位。在接收数据时,串行的位被转换为字节数据。
  • 串口通讯基本原理 【详细】

    万次阅读 多人点赞 2018-11-17 08:54:36
    串口通信的基本知识 本文介绍了串口通讯的基本概念、数据格式、通讯方式、典型的串口通讯标准等内容。 串口通讯,RS232,RS485,停止位,奇校验,偶校验 1 串口通讯  串口通讯(Serial Communication),是指外设和...

    串口通信的基本知识

    本文介绍了串口通讯的基本概念、数据格式、通讯方式、典型的串口通讯标准等内容。

    串口通讯,RS232,RS485,停止位,奇校验,偶校验

    1 串口通讯
        串口通讯(Serial Communication),是指外设和计算机间,通过数据信号线、地线等,按位进行传输数据的一种通讯方式。
        串口是一种接口标准,它规定了接口的电气标准,没有规定接口插件电缆以及使用的协议。


    2 串口通讯的数据格式


        一个字符一个字符地传输,每个字符一位一位地传输,并且传输一个字符时,总是以“起始位”开始,以“停止位”结束,字符之间没有固定的时间间隔要求。
        每一个字符的前面都有一位起始位(低电平),字符本身由7位数据位组成,接着字符后面是一位校验位(检验位可以是奇校验、偶校验或无校验位),最后是一位或一位半或二位停止位,停止位后面是不定长的空闲位,停止位和空闲位都规定为高电平。实际传输时每一位的信号宽度与波特率有关,波特率越高,宽度越小,在进行传输之前,双方一定要使用同一个波特率设置。

    3 通讯方式
        单工模式(Simplex Communication)的数据传输是单向的。通信双方中,一方固定为发送端,一方则固定为接收端。信息只能沿一个方向传输,使用一根传输线。
    半双工模式(Half Duplex)通信使用同一根传输线,既可以发送数据又可以接收数据,但不能同时进行发送和接收。数据传输允许数据在两个方向上传输,但是,在任何时刻只能由其中的一方发送数据,另一方接收数据。因此半双工模式既可以使用一条数据线,也可以使用两条数据线。半双工通信中每端需有一个收发切换电子开关,通过切换来决定数据向哪个方向传输。因为有切换,所以会产生时间延迟,信息传输效率低些。
        全双工模式(Full Duplex)通信允许数据同时在两个方向上传输。因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。在全双工模式中,每一端都有发送器和接收器,有两条传输线,信息传输效率高。
        显然,在其它参数都一样的情况下,全双工比半双工传输速度要快,效率要高。

    4 偶校验与奇校验
        在标准ASCII码中,其最高位(b7)用作奇偶校验位。所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。

    5 停止位
        停止位是按长度来算的。串行异步通信从计时开始,以单位时间为间隔(一个单位时间就是波特率的倒数),依次接受所规定的数据位和奇偶校验位,并拼装成一个字符的并行字节;此后应接收到规定长度的停止位“1”。所以说,停止位都是“1”,1.5是它的长度,即停止位的高电平保持1.5个单位时间长度。一般来讲,停止位有1,1.5,2个单位时间三种长度。

    6 波特率
        波特率就是每秒钟传输的数据位数。
        波特率的单位是每秒比特数(bps),常用的单位还有:每秒千比特数Kbps,每秒兆比特数Mbps。串口典型的传输波特率600bps,1200bps,2400bps,4800bps,9600bps,19200bps,38400bps。
        PLC/PC与称重仪表通讯时,最常用的波特率是9600bps,19200bps。PLC/PC或仪表与大屏幕通讯时,最常用的波特率是600bps。

    7 典型的串口通讯标准
        EIA RS232(通常简称“RS232”): 1962年由美国电子工业协会(EIA)制定。
        EIA RS485(通常简称“RS485”): 1983年由美国电子工业协会(EIA)制定。

    8 RS232串口
        RS232是计算机与通信工业应用中最广泛一种串行接口。它以全双工方式工作,需要地线、发送线和接收线三条线。RS232只能实现点对点的通信方式。
    8.1 RS232串口缺点
        ●接口信号电平值较高,接口电路芯片容易损坏。
        ●传输速率低,最高波特率19200bps。
        ●抗干扰能力较差。
        ●传输距离有限,一般在15m以内。
        ●只能实现点对点的通讯方式。
    8.2 RS232串口接口定义
        RXD:接收数据,TXD:发送数据,GND/SG:信号地。
    8.3 电脑DB9针接口定义
        电脑DB9针接口是常见的RS232串口,其引脚定义如下:
        2号脚:RXD(接收数据)
        3号脚:TXD(发送数据)
        5号脚:SG或GND(信号地)
        其它脚:我们不用

        

        电脑RS232串口与仪表串口连接图:
     
        

    9 RS485串口
    9.1 RS485串口特点
        ●RS485采用平衡发送和差分接收,具有良好的抗干扰能力,信号能传输上千米。
        ●RS485有两线制和四线制两种接线。采用四线制时,只能实现点对多的通讯(即只能有一个主设备,其余为从设备)。四线制现在很少采用,现在多采用两线制接线方式。
        ●两线制RS485只能以半双式方式工作,收发不能同时进行。
        ●RS485在同一总线上最多可以接32个结点,可实现真正的多点通讯,但一般采用的是主从通信方式,即一个主机带多个从机。
        ●因RS485接口具有良好的抗干扰能力,长的传输距离和多站能力等优点使其成为首选的串行接口。
    9.2 485抑制共模干扰示意图
        
    9.3 RS485串口接口定义
        A或Data+(D+)或+:信号正;
        B或Data-(D-)或-:信号负。
    9.4 计算机与RS485仪表通讯
        计算机自带的串口只有RS232,没有RS485,如果计算机要与RS485串口的仪表进行通讯,必须使用串口转换器或装上RS485串口转换卡后才能进行通讯。
    9.5 RS485串口的终端电阻
        ●一般情况下不需要增加终端电阻,只有在RS485通信距离超过100米的情况下,要在RS485通讯的开始端和结束端增加终端电阻,RS485典型终端电阻是120欧。
        ●终端电阻是为了消除在通信电缆中的信号反射在通信过程中,有两种信号因导致信号反射:阻抗不连续和阻抗不匹配。
        阻抗不连续,信号在传输线末端突然遇到电缆阻抗很小甚至没有,信号在这个地方就会引起反射。消除这种反射的方法,就必须在电缆的末端跨接一个与电缆的特性阻抗同样大小的终端电阻,使电缆的阻抗连续。由于信号在电缆上的传输是双向的,因此,在通讯电缆的另一端可跨接一个同样大小的终端电阻。
        引起信号反射的另一原因是数据收发器与传输电缆之间的阻抗不匹配。这种原因引起的反射,主要表现在通讯线路处在空闲方式时,整个网络数据混乱。要减弱反射信号对通讯线路的影响,通常采用噪声抑制和加偏置电阻的方法。在实际应用中,对于比较小的反射信号,为简单方便,经常采用加偏置电阻的方法。

    10 串口通讯硬件常见的注意事项
        ●通讯电缆端子一定接牢,不可有任何松动,否则,可能会烧坏仪表或上位机的通讯板。
        ●不可带电拔插通讯端子,否则,可能会烧坏仪表或上位机的通讯板,一定要关闭仪表电源后才能去拔插通讯端子或接通讯线。
        ●通讯用的屏蔽电缆最好选用双层隔离型屏蔽电缆,其次选用单层屏蔽电缆,最好不要选用无屏蔽层的电缆,且电缆屏蔽层一定要能完全屏蔽,有些质量差的电缆,屏蔽层很松散,根本起不到屏蔽的作用。单层屏蔽的电缆屏蔽层应一端接地,双层屏蔽的电缆屏蔽层其外层(含铠装)应两端接地,内层屏蔽则应一端接地。
        ●仪表使用RS232通讯时,通讯电缆长度不得超过15米。
        ●一般RS485协议的接头没有固定的标准,可能根据厂家的不同引脚顺序和管脚功能可能不尽相同,用户可以查阅相关产品RS485的引脚图。
        ●RS485通讯电缆最好选用阻阬匹配、低衰减的RS485专用通讯电缆(双绞线),不要使用普通的双绞电缆或质量较差的通讯电缆。因为普通电缆或质量差的通讯电缆,可能阻抗不匹配、衰减大、绞合度不够、屏蔽层太松散,这样会导致干扰将非常大,会造成通讯不畅,甚至通讯不上。
        ●仪表使用RS485通讯时,每台仪表必须手牵手地串下去,不可以有星型连接或者分叉,如果有星型连接或者分叉,干扰将非常大,会造成通讯不畅,甚至通讯不上。

        

        ●485总线结构理论上传输距离达到1200米,一般是指通讯线材优质达标,波特率9600,只有一台485设备才能使得通讯距离达到1200米,而且能通讯并不代表每次通讯都正常,所以通常485总线实际的稳定通讯距离远远达不到1200米。负载485设备多,线材阻抗不同时,通讯距离更短。
        ●仪表使用RS485通讯时,必要时,请接入终端电阻,以增强系统的抗干扰性,典型的终端电阻阻值是120欧。

    11 串口通讯软件设置要点
    11.1 有关通讯的一些基本概念
        ●主机与从机:在通讯系统中起主要作用、发布主要命令的称为主机,接受命令的称为从机。
        ●连续方式:指主机不需要发布命令,从机就能自动地向主机发送数据。
        ●指令方式:指主机向从机发布命令,从机根据指令执行动作,并将结果“应答”给主机的模式。
        ●输出数据类型:指在连续方式通讯时,从机输出给主机的数据类型。
        ●通讯协议:指主机与从机通讯时,按哪一种编码规则来通讯。
        ●波特率:主从机之间通讯的速度。
        ●数据位:每次传输数据时,数据由几位组成。
        ●校验位:数据传输错误检测,可以是奇校验、偶校验或无校验。
        ●地址:每一台从机的编号。
    11.2 主从机之间通讯设置要点
        ●要点一:主/从RS232/485硬件有无设置正确,通讯线有无接对。有些通讯板卡是RS422与RS485共用的,依靠板上跳线来实现的,有些仪表RS232/485也需要通讯跳线来实现。
        ●要点二:主机上的通讯端口有无设置正确;超时(一般设置为2s)、通讯延时(一般设置为5~20ms)、ACK信号延时(一般设置为0ms)有无设置正确。
        ●要点三:主/从机通讯协议有无选择正确。
        ●要点四:主/从机波特率有无选择正确。
        ●要点五:主/从机数据位有无选择正确。数据位可以选择7位,8位。
        ●要点六:主/从机校验位有无选择正确。校验位一般可选择偶校验、奇校验、无校验。
        ●要点七:主/从机停止位有无选择正确。停止位可以选择1位、1.5位还是2位。
        ●要点八:从机地址有无选择正确。
        ●要点九:主/从机的通讯方式有无选择正确。

     

    进行通讯测试的时候经常会进行线路测试,测试所用的串口线是否可用,方法有二如下:

     

    1  把串口线接到不同的串口,用串口调试工具从一个串口发数据,另一个能正常收到说明串口线是OK的。

    2  把串口线的一端短接(用金属把2,3号脚连通),用万用表测另一端的2,3号如果正常的话会有嘀嘀的短接报警声。

    展开全文
  • STM32-串口通讯工作原理

    千次阅读 2018-07-18 16:53:22
    STM32芯片具有多个USART外设用于串口通讯,USART(通用同步异步收发器)能够灵活地与外部设备进行全双工通讯。USART的全称“通用同步异步收发器”,也就是说他可以同步通信也可以异步通信。但是我们实现串口打印调试...

    STM32 USART 简介

    STM32芯片具有多个USART外设用于串口通讯,USART(通用同步异步收发器)能够灵活地与外部设备进行全双工通讯。USART的全称“通用同步异步收发器”,也就是说他可以同步通信也可以异步通信。但是我们实现串口打印调试信息到电脑,其实只用到了他的异步通信的功能。

    USART除了有串口功能,它满足外部设备对工业标准NRZ 异步串行数据格式的要求,并且使用了小数波特率发生器提供了多种波特率,使得它的应用更加广泛。它还支持同步单向通信和半双工单线通信;还支持 LIN(局域互连网络)、智能卡协议与 IrDA(红外线数据协会) SIR ENDEC 规范,以及调制解调器操作 (CTS/RTS)。而且,它还支持多处理器通信。所以说USART还是很强悍的,我们不可能一一讲解这些功能,其他功能还有待大家一起去研究。具体这些功能的详细介绍可查看《STM32F4xx中文参考手册》26章通用同步异步收发器(USART)。

    USART框图分析

    USART程序框图

    此图我们可以分为四部分讲解分为引脚讲解、波特率发生器、USART控制单元、数据交换相关寄存器。

    1.USART功能引脚

    Tx:发送数据输出引脚

    Rx接收数据输入引脚

    SW_Rx:数据接收引脚,只用于单线和智能卡模式,属于内部引脚,没有具体外部引脚。

    nRST请求以发送(Request To Send), n 表示低电平有效。如果使能 RTS 流控制,当USART 接收器准备好接收新数据时就会将 nRTS 变成低电平;当接收寄存器已满时,nRTS 将被设置为高电平。该引脚只适用于硬件流控制。

    nCTS:清除以发送(Clear To Send), n 表示低电平有效。如果使能 CTS 流控制,发送器在发送下一帧数据之前会检测 nCTS 引脚,如果为低电平,表示可以发送数据,如果为高电平则在发送完当前数据帧之后停止发送。该引脚只适用于硬件流控制。

    SCLK:发送器时钟输出引脚。这个引脚仅适用于同步模式。

    STM32F411CCU6一共有3个USART,USART1和USART6时钟来源与APB2总线时钟,其最大频率为100MHz, USART2来源于APB1总线时钟,其最大频率为50MHz。也就意味着他们的最大通讯速率也是不同的。

    2.USART波特率发生器

    看USART内部框图2部分,USART的发送器速率控制与接收器速率控制共用一个波特率寄存器(USART_BRR),波特率寄存器里存放的是时钟分频值它一共16位,分为整数部分DIV_Mantissa[16:5]和小数部分DIV_Fraction[4:0]两部分。 USART通信所需波特率是对相应总线时钟分频然后一系列计算所得到的。USART波特率计算公式如下:

    波特率计算公式波特率计算公式

    fck:系统总线时钟。USART1和USART6在APB2总线下,USART2在APB1总线下

    0VER8:是由USART_CR1的第15位设置。O:16倍过采样;1:8倍过采样

    USARTDIV:波特率分频系数,USART_BRR配置得到。USARTDIV的计算公式

    USARTDIV = DIV_Mantissa + (DIV_Fraction/8 * (2-OVER8))

     

    以下例题:

    1.知USARTDIV(10进制)算出USART_BRR(16进制)的值

    例如:如果OVER8=0, USARTDIV=25.62,求USART_BRR?

    DIV_Fraction = 16*0.62 = 9.92 约等于10 = 0xA;

    DIV_Mantissa = 25 = 0x19;

    则USART_BRR = 0x19A;

     

    2.知USART_BRR(16进制)算出USARTDIV(10进制)的值

    例如:如果OVER8=0, USART_BRR=0x1BC,求USARTDIV?

    DIV_Mantissa = 0x1B = 27;

    DIV_Fraction = 12/16 = 0.75;

    则USARTDIV = 27.75;

    3.USART波特率计算

    例如:USART1通信的波特率位115200,0VER8=0,fck = 100Mhz,求USARTDIV?

    解得USARTDIV = 54.253472,可根据上面公式算出DIV_Mantissa = 0x36, DIV_Fraction = 0x4,那么USART_BRR = 0x364

    在计算 DIV_Fraction 时经常出现小数情况,经过我们取舍得到整数,这样会导致最终输出的波特率较目标值略有偏差。下面我们从 USART_BRR 的值为 0x364 开始计算得出实际输出的波特率大小。

    由 USART_BRR 的值为 0x364,可得 DIV_Fraction=4, DIV_Mantissa=54,所以USARTDIV=54+4/16 =54.25,所以实际波特率为: 115207;这个值跟我们的目标波特率误差为 0.03%,这么小的误差在正常通信的允许范围内。

    0VER8=1时,8 倍过采样时计算情况原理是一样的。此部分内容不必全部搞懂,波特率具体计算在库函数中都已完成,不用我们一一计算。

    4.USART控制单元

    看USART内部框图3部分,是整个USART外设的控制单元,包括发送控制器、唤醒单元、接收控制器,我们通过配置寄存器相应位来设置这些控制器的工作模式,USART的配置寄存器一共有三个我们在这里不一一讲解,我们看这个框图只需理解USART的大致工作过程即可,具体寄存器的配置我们直接调用库函数即可配置,无需我们一位一位的手动配置,如想仔细了解各寄存器的位详细意义,可参考《STM32f4xx中文参考手册》和《RM0383_STM32F411CCU6_Reference manual》。

    发送控制器:工作在发送模式,它将按照程序设置的波特率、帧格式将CPU的数据或者DMA总线上的数据一位一位送到Tx引脚。

    接收控制器:工作在接收模式,它将按照程序设置的波特率、帧格式将数据从Rx引脚一位一位的接收外部发来的数据并上传给CPU或者DMA。

    5.USART数据寄存器和移位寄存器

    看USART内部框图4部分,此部分是USART外设外部与内部总线和DMA联系的接口,4部分一共四个寄存器,发送模式用的“发送数据寄存器(TDR)”和“发送移位寄存器”,接收模式用的“接收数据寄存器(RDR)”和“接收移位寄存器”。其实TDR和RDR都属于数据寄存器(USART_DR)具体寄存机介绍看《STM32F4xx中文参考手册》。我们用的时候可以当成两个用。

    USART发送过程:

         内部总线有数据需要发送时,

    • 首先要使能发送即USART_CR1的TE位置1;
    • 接着内部总线的数据的一个字节写入“发送数据寄存器(TDR)”;(该操作将清零TXE位也就是发送数据寄存器非空,数据其他数据不可以写入)
    • 紧接着“发送数据寄存器(TDR)”中的数据一次性复制进入“发送移位寄存器”;(将TXE位置既发送数据寄存器为空,后续数据可以接着写入)
    • “发送移位寄存器”将刚才“发送数据寄存器(TDR)”复制得数据一位一位的送到Tx引脚
    • 循环执行上面的操作,直到总线将最后一个数据写入“发送数据寄存器(TDR)”后,等待TC=1。这表明最后一帧的传送已完成。

         USART接收过程:

          Rx引脚有数据输入时,

    • 首先要使能接收即USART_CR1的RE位置1;

    • 然后Rx引脚移入数据的最低有效位,到“接收移位寄存器”;

    • 当“接收移位寄存器”8位满时,将数据一次性写入“接收数据寄存器(RDR)”;(该操作将RXNE置1既接收数据寄存器非空,总线可读取)

    • 总线发现RXNE=1时立即读取数据并将RXNE置零(注意接收期间每接收一个字节RXNE都置1)

    循环执行上面操作,直到Rx引脚将最后一字节数据传送入“接收数据寄存器(RDR)”后,等待总线读取完成。

     

    展开全文
  • 利用MiniSTM32F103RCT6开发板V3版本的HAL库开发串口1与串口3通讯串口1与串口3互相通讯 串口1给串口3发送数据,串口3接收后打印“串口1给串口3发送数据” 串口3给串口1发送数据,串口1接收后打印“串口1给串口3...
  • 串行通信的基本原理

    2020-02-05 22:19:51
    串行通信的基本原理 串行端口的本质功能是作为CPU和串行设备间的编码转换器。当数据从 CPU经过串行端口发送出去时,字节数据转换为串行的位。在接收数据时,串行的位被转换为字节数据。 在Windows环境(Windows NT...

    一.串行通信的基本原理

    串行端口的本质功能是作为CPU和串行设备间的编码转换器。当数据从 CPU经过串行端口发送出去时,字节数据转换为串行的位。在接收数据时,串行的位被转换为字节数据。

    在Windows环境(Windows NT、Win98、Windows2000)下,串口是系统资源的一部分。

    应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。

    串口通信程序的流程如下图:

    二.串口信号线的接法

    一个完整的RS-232C接口有22根线,采用标准的25芯插头座(或者9芯插头座)。25芯和9芯的主要信号线相同。以下的介绍是以25芯的RS-232C为例。

    ①主要信号线定义:

     2脚:发送数据TXD; 3脚:接收数据RXD; 4脚:请求发送RTS; 5脚:清除发送CTS;

     6脚:数据设备就绪DSR;20脚:数据终端就绪DTR; 8脚:数据载波检测DCD;

    1脚:保护地;  7脚:信号地。

    ②电气特性:

    数据传输速率最大可到20K bps,最大距离仅15m.

    注:看了微软的MSDN 6.0,其Windows API中关于串行通讯设备(不一定都是串口RS-232C或RS-422或RS-449)速率的设置,最大可支持到RS_256000,即256K bps! 也不知道到底是什么串行通讯设备?但不管怎样,一般主机和单片机的串口通讯大多都在9600 bps,可以满足通讯需求。

    ③接口的典型应用:

    大多数计算机应用系统与智能单元之间只需使用3到5根信号线即可工作。这时,除了TXD、RXD以外,还需使用RTS、CTS、DCD、DTR、DSR等信号线。(当然,在程序中也需要对相应的信号线进行设置。)

     以上接法,在设计程序时,直接进行数据的接收和发送就可以了,不需要  对信号线的状态进行判断或设置。(如果应用的场合需要使用握手信号等,需要对相应的信号线的状态进行监测或设置。)

    三.16位串口应用程序的简单回顾

    16位串口应用程序中,使用的16位的Windows API通信函数:

    ① OpenComm() 打开串口资源,并指定输入、输出缓冲区的大小(以字节计);

     CloseComm() 关闭串口;

     例:int idComDev;

    idComDev = OpenComm("COM1", 1024, 128);

    CloseComm(idComDev);

    ② BuildCommDCB() 、setCommState()填写设备控制块DCB,然后对已打开的串口进行参数配置;

     例:DCB dcb;

    BuildCommDCB("COM1:2400,n,8,1", &dcb);

    SetCommState(&dcb);

    ③ ReadComm 、WriteComm()对串口进行读写操作,即数据的接收和发送.

     例:char *m_pRecieve; int count;

     ReadComm(idComDev,m_pRecieve,count);

     Char wr[30]; int count2;

     WriteComm(idComDev,wr,count2);

    16位下的串口通信程序最大的特点就在于:串口等外部设备的操作有自己特有的API函数;而32位程序则把串口操作(以及并口等)和文件操作统一起来了,使用类似的操作。

    四.在MFC下的32位串口应用程序

    32位下串口通信程序可以用两种方法实现:利用ActiveX控件;使用API 通信函数。

    使用ActiveX控件,程序实现非常简单,结构清晰,缺点是欠灵活;使用API 通信函数的优缺点则基本上相反。

    以下介绍的都是在单文档(SDI)应用程序中加入串口通信能力的程序。

    ㈠ 使用ActiveX控件:
    VC++ 6.0提供的MSComm控件通过串行端口发送和接收数据,为应用程序提供串行通信功能。使用非常方便,但可惜的是,很少有介绍MSComm控件的资料。

    ⑴.在当前的Workspace中插入MSComm控件。

     Project菜单------>Add to Project---->Components and Controls----->Registered

     ActiveX Controls--->选择Components: Microsoft Communications Control,

     version 6.0 插入到当前的Workspace中。

    结果添加了类CMSComm(及相应文件:mscomm.h和mscomm.cpp )。

    ⑵.在MainFrm.h中加入MSComm控件。

    protected:

     CMSComm m_ComPort;

    在Mainfrm.cpp::OnCreare()中:

    DWORD style=WS_VISIBLE|WS_CHILD;

     if (!m_ComPort.Create(NULL,style,CRect(0,0,0,0),this,ID_COMMCTRL)){

    TRACE0("Failed to create OLE Communications Control ");

    return -1;  // fail to create

    }

    ⑶.初始化串口

    m_ComPort.SetCommPort(1); //选择COM?

    m_ComPort. SetInBufferSize(1024); //设置输入缓冲区的大小,Bytes

    m_ComPort. SetOutBufferSize(512); //设置输入缓冲区的大小,Bytes// 

    if(!m_ComPort.GetPortOpen()) //打开串口

    m_ComPort.SetPortOpen(TRUE);

    m_ComPort.SetInputMode(1); //设置输入方式为二进制方式

    m_ComPort.SetSettings("9600,n,8,1"); //设置波特率等参数

    m_ComPort.SetRThreshold(1); //为1表示有一个字符引发一个事件

     m_ComPort.SetInputLen(0);

    ⑷.捕捉串口事项。MSComm控件可以采用轮询或事件驱动的方法从端口获取数据。我们介绍比较使用的事件驱动方法:有事件(如接收到数据)时通知程序。在程序中需要捕获并处理这些通讯事件。

    在MainFrm.h中:

    protected:

    afx_msg void OnCommMscomm();

    DECLARE_EVENTSINK_MAP()

    在MainFrm.cpp中:

    BEGIN_EVENTSINK_MAP(CMainFrame,CFrameWnd )

    ON_EVENT(CMainFrame,ID_COMMCTRL,1,OnCommMscomm,VTS_NONE)

     //映射ActiveX控件事件

    END_EVENTSINK_MAP()

    ⑸.串口读写. 完成读写的函数的确很简单,GetInput()和SetOutput()就可。两个函数的原型是:

    VARIANT GetInput();及 void SetOutput(const VARIANT& newValue);都要使用VARIANT类型(所有Idispatch::Invoke的参数和返回值在内部都是作为VARIANT对象处理的)。

    无论是在PC机读取上传数据时还是在PC机发送下行命令时,我们都习惯于使用字符串的形式(也可以说是数组形式)。查阅VARIANT文档知道,可以用BSTR表示字符串,但遗憾的是所有的BSTR都是包含宽字符,即使我们没有定义_UNICODE_UNICODE也是这样! WinNT支持宽字符, 而Win95并不支持。为解决上述问题,我们在实际工作中使用CbyteArray,给出相应的部分程序如下:

    void CMainFrame::OnCommMscomm(){

     VARIANT vResponse;  int k;

    if(m_commCtrl.GetCommEvent()==2) {

    k=m_commCtrl.GetInBufferCount(); //接收到的字符数目

    if(k>0) {

    vResponse=m_commCtrl.GetInput(); //read

    SaveData(k,(unsigned char*) vResponse.parray->pvData);

    } // 接收到字符,MSComm控件发送事件 }

     。。。。。 // 处理其他MSComm控件

    }

    void CMainFrame::OnCommSend() {

    。。。。。。。。 // 准备需要发送的命令,放在TxData[]中

    CByteArray array;

    array.RemoveAll();

    array.SetSize(Count);

    for(i=0;i
    array.SetAt(i, TxData[i]);

     m_ComPort.SetOutput(COleVariant(array)); // 发送数据

    }

    请大家认真关注第⑷、⑸中内容,在实际工作中是重点、难点所在。

    ㈡ 使用32位的API 通信函数:

    可能很多朋友会觉得奇怪:用32位API函数编写串口通信程序,不就是把16位的API换成32位吗?16位的串口通信程序可是多年之前就有很多人研讨过了……

    此文主要想介绍一下在API串口通信中如何结合非阻塞通信、多线程等手段,编写出高质量的通信程序。特别是在CPU处理任务比较繁重、与外围设备中有大量的通信数据时,更有实际意义。

    ⑴.在中MainFrm.cpp定义全局变量

    HANDLE hCom; // 准备打开的串口的句柄

    HANDLE hCommWatchThread ;//辅助线程的全局函数

    ⑵.打开串口,设置串口

    hCom =CreateFile( "COM2", GENERIC_READ | GENERIC_WRITE, // 允许读写

     0, // 此项必须为0

     NULL,  // no security attrs

     OPEN_EXISTING, //设置产生方式

     FILE_FLAG_OVERLAPPED, // 我们准备使用异步通信

     NULL );

    请大家注意,我们使用了FILE_FLAG_OVERLAPPED结构。这正是使用API实现非阻塞通信的关键所在。

    ASSERT(hCom!=INVALID_HANDLE_VALUE); //检测打开串口操作是否成功

    SetCommMask(hCom, EV_RXCHAR|EV_TXEMPTY );//设置事件驱动的类型 

    SetupComm( hCom, 1024,512) ; //设置输入、输出缓冲区的大小

    PurgeComm( hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR

     | PURGE_RXCLEAR ); //清干净输入、输出缓冲区

    COMMTIMEOUTS CommTimeOuts ; //定义超时结构,并填写该结构

     …………

    SetCommTimeouts( hCom, &CommTimeOuts ) ;//设置读写操作所允许的超时

    DCB dcb ; // 定义数据控制块结构

    GetCommState(hCom, &dcb ) ; //读串口原来的参数设置

    dcb.BaudRate =9600; dcb.ByteSize =8; dcb.Parity = NOPARITY;

    dcb.StopBits = ONESTOPBIT ;dcb.fBinary = TRUE ;dcb.fParity = FALSE;

    SetCommState(hCom, &dcb ) ; //串口参数配置

    上述的COMMTIMEOUTS结构和DCB都很重要,实际工作中需要仔细选择参数。

    ⑶启动一个辅助线程,用于串口事件的处理。

    Windows提供了两种线程,辅助线程和用户界面线程。区别在于:辅助线程没有窗口,所以它没有自己的消息循环。但是辅助线程很容易编程,通常也很有用。

    在次,我们使用辅助线程。主要用它来监视串口状态,看有无数据到达、通信有无错误;而主线程则可专心进行数据处理、提供友好的用户界面等重要的工作。

    hCommWatchThread=

     CreateThread( (LPSECURITY_ATTRIBUTES) NULL, //安全属性

     0,//初始化线程栈的大小,缺省为与主线程大小相同

     (LPTHREAD_START_ROUTINE)CommWatchProc, //线程的全局函数

     GetSafeHwnd(), //此处传入了主框架的句柄

     0, &dwThreadID );

    ASSERT(hCommWatchThread!=NULL);

    ⑷为辅助线程写一个全局函数,主要完成数据接收的工作。请注意OVERLAPPED结构的使用,以及怎样实现了非阻塞通信。

    UINT CommWatchProc(HWND hSendWnd){

    DWORD dwEvtMask=0 ;

    SetCommMask( hCom, EV_RXCHAR|EV_TXEMPTY );//有哪些串口事件需要监视?

    WaitCommEvent( hCom, &dwEvtMask, os );// 等待串口通信事件的发生

    检测返回的dwEvtMask,知道发生了什么串口事件:

    if ((dwEvtMask & EV_RXCHAR) == EV_RXCHAR){ // 缓冲区中有数据到达

    COMSTAT ComStat ; DWORD dwLength;

    ClearCommError(hCom, &dwErrorFlags, &ComStat ) ;

    dwLength = ComStat.cbInQue ; //输入缓冲区有多少数据?

    if (dwLength > 0) {

    BOOL fReadStat ;

    fReadStat = ReadFile( hCom, lpBuffer,dwLength, &dwBytesRead;

    &READ_OS( npTTYInfo ) ); //读数据

    注:我们在CreareFile()时使用了FILE_FLAG_OVERLAPPED,现在ReadFile()也必须使用

    LPOVERLAPPED结构.否则,函数会不正确地报告读操作已完成了.

    使用LPOVERLAPPED结构, ReadFile()立即返回,不必等待读操作完成,实现非阻塞

    通信.此时, ReadFile()返回FALSE, GetLastError()返回ERROR_IO_PENDING.

    if (!fReadStat){

     if (GetLastError() == ERROR_IO_PENDING){

     while(!GetOverlappedResult(hCom,

     &READ_OS( npTTYInfo ), & dwBytesRead, TRUE )){

     dwError = GetLastError();

     if(dwError == ERROR_IO_INCOMPLETE) continue;

     //缓冲区数据没有读完,继续

     …… ……

     ::PostMessage((HWND)hSendWnd,WM_NOTIFYPROCESS,0,0);//通知主线程,串口收到数据 }

    所谓的非阻塞通信,也即异步通信。是指在进行需要花费大量时间的数据读写操作(不仅仅是指串行通信操作)时,一旦调用ReadFile()、WriteFile(), 就能立即返回,而让实际的读写操作在后台运行;相反,如使用阻塞通信,则必须在读或写操作全部完成后才能返回。由于操作可能需要任意长的时间才能完成,于是问题就出现了。

    非常阻塞操作还允许读、写操作能同时进行(即重叠操作?),在实际工作中非常有用。

    要使用非阻塞通信,首先在CreateFile()时必须使用FILE_FLAG_OVERLAPPED;然后在 ReadFile()时lpOverlapped参数一定不能为NULL,接着检查函数调用的返回值,调用GetLastError(),看是否返回ERROR_IO_PENDING。如是,最后调用GetOverlappedResult()返回重叠操作(overlapped operation)的结果;WriteFile()的使用类似。

    ⑸.在主线程中发送下行命令。

    BOOL fWriteStat ; char szBuffer[count];

     …………//准备好发送的数据,放在szBuffer[]中

    fWriteStat = WriteFile(hCom, szBuffer, dwBytesToWrite,

     &dwBytesWritten, &WRITE_OS( npTTYInfo ) ); //写数据

    注:我们在CreareFile()时使用了FILE_FLAG_OVERLAPPED,现在WriteFile()也必须使用  LPOVERLAPPED结构.否则,函数会不正确地报告写操作已完成了.

     使用LPOVERLAPPED结构,WriteFile()立即返回,不必等待写操作完成,实现非阻塞 通信.此时, WriteFile()返回FALSE, GetLastError()返回ERROR_IO_PENDING.

    int err=GetLastError();

    if (!fWriteStat) {

     if(GetLastError() == ERROR_IO_PENDING){

    while(!GetOverlappedResult(hCom, &WRITE_OS( npTTYInfo ),

     &dwBytesWritten, TRUE )) {

    dwError = GetLastError();

    if(dwError == ERROR_IO_INCOMPLETE){

     // normal result if not finished

    dwBytesSent += dwBytesWritten; continue; }

    ......................

    综上,我们使用了多线程技术,在辅助线程中监视串口,有数据到达时依靠事件驱动,读入数据并向主线程报告(发送数据在主线程中,相对说来,下行命令的数据总是少得多);并且,WaitCommEvent()、ReadFile()、WriteFile()都使用了非阻塞通信技术,依靠重叠(overlapped)读写操作,让串口读写操作在后台运行。

    依托vc6.0丰富的功能,结合我们提及的技术,写出有强大控制能力的串口通信应用程序。就个人而言,我更偏爱API技术,因为控制手段要灵活的多,功能也要强大得多。

    展开全文
  • 51单片机串口通信原理讲解

    千次阅读 多人点赞 2019-10-24 23:54:50
    通信原理大致分为串行和并行两种方法,各有优缺点,也不再这里赘述了,使用到的是串行通信的方法,简单介绍一下串行通信原理,上图 两个设备,一根互传线,每次传一组数据,总长度不一定8位,由51单片机内部设定...

    51单片机串口通信


    今天研究了一下51单片机的串口通信,使用的单片机是普中科技开发板,但实际上所运用到的硬件和其他品牌单片机都相同,没有区别,总结一下,自己的理解和看法。

    通信原理

    通信原理大致分为串行和并行两种方法,各有优缺点,也不再这里赘述了,使用到的是串行通信的方法,简单介绍一下串行通信的原理,上图

    两个设备,一根互传线,每次传一组数据,总长度不一定8位,由51单片机内部设定来决定。设备间通信有许多接口方式,我用的是51上的串行接口,挂图:
    在这里插入图片描述
    SBUF:是指串行口中的两个缓冲寄存器,一个是发送寄存器,一个是接收寄存器,在物理结构上是完全独立的,但地址是重叠的。它们都是字节寻址的寄存器,字节地址均为99H,
    TXD:Transmit(tx) Data; RXD: Receive(rx) Data;
    两个口通过缩写记一下,我经常记不住(丢人),所以上面的那一个SBUF是发送,下面的是接收寄存器,发送或者接收的数据将暂时储存于里面,编程时直接赋值就行,TH1和TL1是时钟的配置系统,主要用于控制波特率,及每秒发送的总位数。(调试时一定要对应自己设置的波特率)

    控制寄存器SCON:内部结构下图,主要用于设置串口工作方式、接发送控制,以及状态位的控制
    在这里插入图片描述
    SM0和SM1是控制工作方式下图,控制每组总数据(起止位+数据位)的位数。移位则是一个脉冲一个一个脉冲的发送输入输出数据。
    SM2多机通信控制位,方式2和3时。SM2控制RB8是否会触发RI中断,SM2=1时R8=1激活中断(中断将数据读走),R8=0则不激活;SM2=0则失去控制作用。不论RB是否为0,RI都能激活,方式0时,SM2必须为0;方式1时,SM2=0,接受到停止位,R1中断就打开。
    REN允许串行接受位,REN=1,则打开接受,否则不能接受数据。
    TB,方式2和3中才用到,是奇偶效验位
    RB,在方式2、3中还是做奇偶效验位,在方式1中做数据停止位的存放位,用来将RI自动置1,启动中断。
    在这里插入图片描述
    PCON:用于控制波特率是否加倍,及SMOD=1,波特率加倍。复位时SMOD=0;
    在这里插入图片描述
    好了,大致通信原理讲到这里,下面到使用讲解!

    程序编写

    步骤:
    1、确定TMOD(计数器)工作方式
    2、配置TH1和TL1初值
    3、配置SCON、PCON
    4、打开中断允许位(总中断、串口中断),配置中断(中断内主要是SBUF读取发送数据),配置TCON打开中断即TR1置1.

    上代码:作用串口通信输入值,再返回

    include<reg52.h>
    typedef unsigned char u8;
    
    void ready(void)
    {
    	TMOD = 0X20;
    	TH1=0XFF;
    	TL1=0XF9; //波特率9600
    	SCON=0X50;//0101 0000
    	PCON=OX80;//1000 0000
    	EA=1; //打开总中断
    	ES=1; //打开串口中断,相当于ET1 ET0
    	TR1=1;//打开计数器,当其溢出时会给SMOD一个脉冲,接受和读取数据,达到设置波特率作用
    		  //当接受到停止位时RI=1触发中断
    }
    
    void main(void)
    {
    	ready();
    	while(1);
    }
    
    void time1(void) interrupt 4
    {
    	static u8 result;
    	result=SBUF;//进入配置中断,读取数据
    	RI=0;
    	SBUF=result;//将数据输入到SBUF里面发送
    	while(!TI);//等待发送完毕
    	TI=0;
    }
    

    一个简单的串口通信收发完成了

    展开全文
  • 串口通信原理详解

    千次阅读 2020-05-31 11:34:59
    本文介绍了串口通讯的基本概念、数据格式、通讯方式、典型的串口通讯标准等内容。 串口通讯,RS232,RS485,停止位,奇校验,偶校验 1 串口通讯     串口通讯(Serial Communication),是指外设和...
  • 表1 SCON寄存器51单片机串行通信原理解析表中各位(从左至右为从高位到低位)含义如下。SM0 和SM1 :串行口工作方式控制位,其定义如表2 所示。表2 串行口工作方式控制位 其中,fOSC 为单片机的时钟频率;波特率...
  • 这节我们主要讲单片机上串口工作原理和如何通过程序来对串口进行设置,以及根据所给出的实例实现与PC 机通信。 一、原理简介 51 单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,只能接受或只能...
  • 串行通信方式是数据传输的一种方式。这种方式操作简单,连接少,传输距离远,因而在信息传送,尤其是在远距离的传送中得到了广泛的应用。目前常用的串行通信方式有RS -232 C,RS - 422 A,RS - 423 A及RS - 485 A等...
  • 串口通信的基本原理详解

    千次阅读 多人点赞 2020-07-01 11:00:01
    目录 串口通信 串口通信的两种基本方式 ...串行接口简称串口,也称串行通信接口(通常指COM接口):是采用串行通信方式的扩展接口。 串口通信的两种基本方式 1、同步通信(SYNC:synchronous data com.
  • 串行通信是指数据一位一位地按顺序传送的通信方式,其突出优点是只需一根传输线,可大大降低硬件成本,适合远距离通信。其缺点是传输速度较低。 与之前一样,首先我们来了解单片机串口相关的寄存器。 SBUF 寄存器...
  • 51单片机的串行口是一个可编程全双工的通信接口,具有UART(通用异步收发器)的全部功能,能同时进行数据的发送和接收,也可以作为同步移位寄存器使用。
  • PLC串口通信原理  PLC各型主机均内建2个通信接口的标准配置,即一个RS232和一个RS485通信接口,其RS232接口主要用于上程序或用来与上位机、触摸屏通信,而RS485接口主要用于组建使用RS485协议的网络,实现通信控制...
  • 串口通讯原理及流程

    2016-12-02 09:46:13
    串口通讯原理及流程
  •  SM2 :在方式2和方式3的多级通信控制位 REN:允许串行接收控制位,0禁止接收 TB8:对于方式2和方式3,是发送的第9位 RB8:对于方式2和方式3,是接收的第9位;对于方式1,是接收到的停止位 :发送中断标志,发送...
  • 【STM32】串口通信基本原理(超基础、详细版)

    万次阅读 多人点赞 2018-04-12 13:26:02
    一般情况下,设备之间的通信方式可以分成并行通信和串行通信两种。它们的区别是: 并、串行通信的区别 并行通信 串行通信 传输原理 数据各个位同时传输 数据按位顺序传输 优点 速度快 占用...
  • 51单片机串行通信原理

    千次阅读 2020-11-24 20:40:31
    51单片机串行通信原理计算机通信串行通信异步通信同步通信数据传送速率传输方向单片机串行口串行口特殊功能寄存器串行口控制寄存器SCON电源控制寄存器PCON 计算机通信 计算机通信:计算机与外部设备或计算机之间的...
  • 单片机串口通信原理原理

    千次阅读 2016-09-06 14:02:00
     串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行...
  • 串行通信基本原理

    千次阅读 2016-09-08 10:02:55
    一,串行通信和并行通信 并行通信:数据各个位同时进行传输 优点:速度快 缺点:占用IO资源多 串行通信:数据按位顺序进行传输 优点:占用IO资源少 缺点:速度较慢 二,三种串行传输方式1,单工通信     只支持从发送方...
  • 串口通信基本原理

    2021-05-15 12:45:00
    常见的串行通信接口: UART异步通信方式特点: 全双工异步通信。 分数波特率发生器系统,提供精确的波特率。 -发送和接受共用的可编程波特率,最高可达4.5Mbits/s 可编程的数据字长度(8位或者9位); 可配置的停止...
  • 1 并行与串行通信 机器的通信方式有两种,分别是并行通信与串行通信。 并行通信:并行通信是指多比特数据同时通过并行线进行传送,这样数据传送速度大大提高,但并行传送的线路长度受到限制,因为长度增加,干扰就会...
  • 单片机C51 - 串行通信原理串口编程实验

    千次阅读 多人点赞 2016-09-07 10:42:00
    一、两种通信方式概念 1.并行通信 ...传输原理串行通信的数据是一位一位地址进行传输的,在传输中每一位数据都占据一个固定的时间长度。优点:串行通信传输线少,占用引脚资源少,成本低,适合远
  • 一、串口通信电路 电路图: 说明:当RXD TXD为低电平时,对应的led灯会亮起 二、串口通信控制寄存器 下图为80C51串行口的结构: SCON(serial Control Register):串行口控制寄存器 bit 7 6 5 4 3 2 1 0 ...
  • UART串行工作原理

    千次阅读 2018-12-17 10:23:12
    通过异步收发器(UART)用来传输串行数据。UART之间以全双工方式传输数据,最精简的连接方法只有三条连线:TXD用于发送数据,RXD用于接收数据,Gnd给双方提供参考电平。 UART使用标准的CMOS逻辑电平(0—5V、0—3.3...
  • 串行接口的工作原理和实现

    千次阅读 2020-08-24 23:14:32
    串口的结构和工作原理 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART。它将要传输的资料在串行通信与并行通信之间加以转换。作为把并行输入信号转成串行输出信号的芯片,UART...
  • STM32 串行通信原理

    2020-12-04 21:40:36
    串行通信 传输原理:数据按位顺序传输。 优点:占用引脚资源少 缺点:速度相对较慢 串行通信: 按照数据传送方向,分为: 单工:数据传输只支持数据在一个方向上传输 半双工:允许数据在两个方向上传输,但是,在...
  • Arduino 串行通信串口通信 UART 原理及释义

    万次阅读 多人点赞 2019-03-28 09:43:53
    串口工作原理  在Arduino与其它器件通讯的过程中,数据传输实际上都是以数字信号(即电平高低变化)的形式进行的,串口通信也是如此. 当使用Serial.print()函数输出数据时,Arduino的发送端会输出一连串的数字信号,...
  • FPGA串口通信原理

    2019-10-22 17:36:19
    串行通信串行通信是将数据分成一位一位的形式在一条传输线上逐个传输。 优点是简单、占用资源少。 缺点:传输速度慢。 通信方式 同步通信:带时钟同步信号的数据传输(发送方和接收方在同一时钟的控制下同步传输...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 64,743
精华内容 25,897
关键字:

串口通信工作原理