精华内容
下载资源
问答
  • 串口协议

    千次阅读 2015-01-16 15:14:06
    串口通信协议编辑 本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 串口通信指串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线...
    收藏
    545

    串口通信协议编辑

    本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧!
    串口通信指串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。
    中文名
    串口通信协议
    作    用
    发送和接收字节
    学    科
    计算机学
    作    用
    用于获取远程采集设备的数据

    1什么是串口编辑

    串口是计算机上一种非常通用的设备通信协议(不要与通用串行总线Universal SerialBus或者USB混淆)。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信接口;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于获取远程采集设备的数据。
    串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总长不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。
    典型地,串口用于ASCII码字符的传输。通信使用3根线完成:(1)地线,(2)发送,(3)接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但是不是必须的。串口通信最重要的参数是比特率数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须匹配:
    a,比特率:这是一个衡量通信速度的参数。它表示每秒钟传送的bit的个数。例如300波特表示每秒钟发送300个bit。当我们提到时钟周期时,就是指比特率,例如如果协议需要4800波特率,那么时钟是4800Hz。这意味着串口通信在数据线上的采样率为4800Hz。通常电话线的比特率为14400,28800和36600。比特率可以远远大于这些值,但是波特率和距离成反比。高比特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。
    b,数据位:这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。如果数据使用简单的文本(标准ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。
    c,停止位:用于表示单个包的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
    d,奇偶校验位:在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位为1,这样就有3个逻辑高位。高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。

    2什么是RS-232编辑

    RS-232(ANSI/EIA-232标准)是IBM-PC及其兼容机上的串行连接标准。可用于许多用途,比如连接鼠标、打印机或者Modem,同时也可以接工业仪器仪表。用于驱动和连线的改进,实际应用中RS-232的传输长度或者速度常常超过标准的值。RS-232只限于PC串口和设备间点对点的通信。RS-232串口通信最远距离是50英尺。
    DB-9针连接头
    9针串口连接口顺序图
    从计算机连出的线的截面。
    RS-232针脚的功能:
    数据:
    TXD(pin 3):串口数据输出(Transmit Data)
    RXD(pin 2):串口数据输入(Receive Data)
    握手:
    RTS(pin 7):发送数据请求(Request to Send)
    CTS(pin 8):清除发送(Clear to Send)
    DSR(pin 6):数据发送就绪(Data Send Ready)
    DCD(pin 1):数据载波检测(Data Carrier Detect)
    DTR(pin 4):数据终端就绪(Data Terminal Ready)
    地线:
    GND(pin 5):地线
    其他
    RI(pin 9):铃声指示

    3什么是RS-422编辑

    RS-422(EIA RS-422-AStandard)是Apple的Macintosh计算机的串口连接标准。RS-422使用差分信号,RS-232使用非平衡参考地的信号。差分传输使用两根线发送和接收信号,对比RS-232,它能更好的抗噪声和有更远的传输距离。在工业环境中更好的抗噪性和更远的传输距离是一个很大的优点。

    4什么是RS-485编辑

    RS-485EIA-485标准)是RS-422的改进,因为它增加了设备的个数,从10个增加到32个,同时定义了在最大设备个数情况下的电气特性,以保证足够的信号电压。有了多个设备的能力,你可以使用一个单个RS-485口建立设备网络。出色抗噪和多设备能力,在工业应用中建立连向PC机的分布式设备网络、其他数据收集控制器、HMI或者其他操作时,串行连接会选择RS-485。RS-485是RS-422的超集,因此所有的RS-422设备可以被RS-485控制。RS-485可以用超过4000英尺的线进行串行通行。
    DB-9 引脚连接
    --------------
    \ 1 2 3 4 5 /
    \ 6 7 8 9 /
    ---------
    从计算机连出的线的截面。
    RS-485的引脚的功能
    数据:1(DATA-) 2(DATA+)
    地线:5

    5什么是握手编辑

    RS-232通行方式允许简单连接三线:Tx、Rx和地线。但是对于数据传输,双方必须对数据定时采用使用相同的波特率。尽管这种方法对于大多数应用已经足够,但是对于接收方过载的情况这种使用受到限制。这时需要串口的握手功能。在这一部分,我们讨论三种最常用的RS-232握手形式:软件握手、硬件握手和Xmodem。
    a,软件握手:我们讨论的第一种握手是软件握手。通常用在实际数据是控制字符的情况,类似于GPIB使用命令字符串的方式。必须的线仍然是三根:Tx,Rx和地线,因为控制字符在传输线上和普通字符没有区别,函数SetXModem允许用户使用或者禁止用户使用两个控制字符XON和XOFF。这些字符在通信中由接收方发送,使发送方暂停。
    例如:假设发送方以高波特率发送数据。在传输中,接收方发现由于CPU忙于其他工作,输入buffer已经满了。为了暂时停止传输,接收方发送XOFF,典型的值是十进制19,即十六进制13,直到输入buffer空了。一旦接收方准备好接收,它发送XON,典型的值是十进制17,即十六进制11,继续通信。输入buffer半满时,LabWindows发送XOFF。此外,如果XOFF传输被打断,LabWindows会在buffer达到75%和90%时发送XOFF。显然,发送方必须遵循此守则以保证传输继续。
    b,硬件握手:第二种是使用硬件线握手。和Tx和Rx线一样,RTS/CTS和DTR/DSR一起工作,一个作为输出,另一个作为输入。第一组线是RTS(Request to Send)和CTS(Clear toSend)。当接收方准备好接收数据,它置高RTS线表示它准备好了,如果发送方也就绪,它置高CTS,表示它即将发送数据。另一组线是DTR(DataTerminal Ready)和DSR(Data SetReady)。这些线主要用于Modem通信。使得串口和Modem通信他们的状态。例如:当Modem已经准备好接收来自PC的数据,它置高DTR线,表示和电话线的连接已经建立。读取DSR线置高,PC机开始发送数据。一个简单的规则是DTR/DSR用于表示系统通信就绪,而RTS/CTS用于单个数据包的传输。
    在LabWindows,函数SetCTSMode使能或者禁止使用硬件握手。如果CTS模式使能,LabWindows使用如下规则:
    当PC发送数据:
    RS-232库必须检测CTS线高后才能发送数据。
    当PC接收数据:
    如果端口打开,且输入队列有空接收数据,库函数置高RTS和DTR。
    如果输入队列90%满,库函数置低RTS,但使DTR维持高电平。
    如果端口队列近乎空了,库函数置高RTS,但使DTR维持高电平。
    如果端口关闭,库函数置低RTS和DTR。
    c,XModem握手:最后讨论的握手叫做XModem文件传输协议。这个协议在Modem通信中非常通用。尽管它通常使用在Modem通信中,XModem协议能够直接在其他遵循这个协议的设备通信中使用。在LabWindows中,实际的XModem应用对用户隐藏了。只要PC和其他设备使用XModem协议,在文件传输中就使用LabWindows的XModem函数。函数是XModemConfig,XModemSend和XModemReceive。
    XModem使用介于如下参数的协议:start_of_data、end_of_data、neg_ack、wait_delay、start_delay、max_tries、packet_size。这些参数需要通信双方认定,标准的XModem有一个标准的定义:然而,可以通过XModemConfig函数修改,以满足具体需要。这些参数的使用方法由接收方发送的字符neg_ack确定。这通知发送方其准备接收数据。它开始尝试发送,有一个超时参数start_delay;当超时的尝试超过max_ties次数,或者收到接收方发送的start_of_data,发送方停止尝试。如果从发送方收到start_of_data,接收方将读取后继信息数据包。包中含有包的数目、包数目的补码作为错误校验、packet_size字节大小的实际数据包,和进一步错误检查的求和校验值。在读取数据后,接收方会调用wait_delay,然后向发送方发送响应。如果发送方没有收到响应,它会重新发送数据包,直到收到响应或者超过重发次数的最大值max_tries。如果一直没有收到响应,发送方通知用户传输数据失败。
    由于数据必须以pack_size个字节按包发送,当最后一个数据包发送时,如果数据不够放满一个数据包,后面会填充ASCII码NULL(0)字节。这导致接收的数据比原数据多。在XModem情况下一定不要使用XON/XOFF,因为XModem发送方发出包的数目很可能增加到XON/OFF控制字符的值,从而导致通信故障。
    展开全文
  • pci串口协议

    2014-09-15 10:53:14
    pci串口协议
  • 主要介绍了Android 串口通信编程及串口协议分析的相关资料,这里对Android 串口通信进行详解,及简单实现步骤和协议进行分析,需要的朋友可以参考下
  • 单片机串口协议大全

    2017-02-28 12:24:20
    单片机串口协议大全,串口硬件的开发大全。
  • 自定义串口协议

    2013-12-04 09:13:04
    利用AVR单片机实现自定义串口协议的数据传输
  • labview串口协议

    2012-08-05 12:14:00
    根据串口协议将特定字符转换,生成新的数据包,然后经串口发送
  • 北斗一串口协议4.0

    2017-04-16 21:25:15
    北斗一串口协议4.0
  • 天龙功放232串口协议

    2019-01-02 11:52:01
    天龙功放232串口协议,支持型号:AVR-X7200W/X7200A,X5200W,X4100W,X3100W,X2100W,S900W,X1100W,S700W
  • 温湿度串口协议

    2012-11-22 15:37:52
    温湿度串口协议
  • 本资源是详细写明了 微光二维码扫码器的串口协议
  • 网络串口协议原码

    2011-12-22 12:27:13
    网络协议和串口协议之间的转换,应用于嵌入式开发。
  • 马可尼UPS协议-索克曼网络、串口协议.pdf马可尼UPS协议-索克曼网络、串口协议.pdf马可尼UPS协议-索克曼网络、串口协议.pdf
  • 这是一个实现串口通信的论文 很有用 串口协议
  • 使用VS开发设备1和设备2端串口协议。分别生成DLL动态库。 使用C#开发设备1和设备2控制部分。这里会调用上一步开发好的串口协议动态库。 重复前面两步,反复调试,直到协议准备无误的开发完成。 ...

    本文只提供一个思路,祥细内容后续有机会再补充:

    1. PC上安装VSPD(Virtual Serial Port Driver)。并使用VSPD工具在PC上虚拟出两个通用串口。
    2. 使用VS开发设备1和设备2端串口协议。分别生成DLL动态库。
    3. 使用C#开发设备1和设备2控制部分。这里会调用上一步开发好的串口协议动态库。
    4. 重复前面两步,反复调试,直到协议准备无误的开发完成。

     

    展开全文
  • STM32 自定义串口协议

    2021-03-06 17:17:06
    STM32 自定义串口协议串行通信原理与优缺点分类按通信方向按通信方式异步串行引脚连接串口外设之间ARM与PC之间字符帧格式串口通信过程串口框图并行通信异步串行实例(自定义通信协议)项目需求项目框架上位机下传帧...

    在设计实现某种功能的系统时,常需要不同设备之间的通信。通信主要有串行和并行两种方式,应用比较广泛的UART(Universial Asynchonous Receiver Transmitter)通用异步收发器,SPI(Serial Peripheral Interface)串行外设接口,I2C(Inter Integrated Circuit)集成电路总线都属于这两种方式之一。下面就以应用比较广泛的串口通信作以介绍,文末附有自定义通信协议的代码。

    1 串行通信

    1.1 原理与优缺点

    数据按位依次传输,使用少数几条通信线路就可以完成系统间交换信息,适合于主机与主机,主机与外设之间的远距离通信。优点是占用引脚资源少,缺点是速度相比并行要慢。

    1.2 分类

    1.2.1 按通信方向

    按通信方向分为单工、半双工、全双工三种。
    a、单工:数据传输只支持数据在一个方向上传输。
    b、半双工:允许数据在两个方向上传输。但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;它不需要独立的接收端和发送端,两者可以合并一起使用一个端口。
    c、全双工:允许数据同时在两个方向上传输。因此,全双工通信是两个单工通信方式的结合,需要独立的接收端和发送端。

    按通信方向分类

    1.2.2 按通信方式

    按通信方式分为同步串行和异步串行。
    同步串行:同步通信时,通信双方共用一个时钟,这是同步通信区分于异步通信的最显著的特点。同步通信中,数据开始传送前用同步字符来指示(常约定1~2 个),并由时钟来实现发送端和接收端的同步,即检测到规定的同步字符后,下面就连续按顺序传送数据,直到一块数据传送完毕。同步传送时,字符之间没有间隙,也不要起始位和停止位,仅在数据开始时用同步字符SYNC来指示。例如SPI,I2C通信接口。
    异步串行:无时钟信号的驱动,收发双方约定数据帧的格式。每一帧由起始位、数据位、奇偶校验位和停止位组成。传送过程字符之间可以有空隙的存在。例如UART,单总线。

    按通信方式分类

    1.3 异步串行引脚连接

    RXD:数据输入引脚,数据接收。
    TXD:数据发送引脚,数据发送。

    1.3.1 串口外设之间

    串口外设之间的连接

    1.3.2 ARM与PC之间

    串口外设与PC之间的连接
    在这里插入图片描述

    当ARM与电脑USB口连接传输数据时,需要一个USB转串口的装置,因为电脑无法识别TTL电平,所以需要连接一个RS232转换器将TTL电平转换成232电平。常采用的是MAX232或国产的CH340芯片。

    TTL电平 232电平
    高电平 1:2.0V ~ 5V 高电平1: -15V ~ -13V
    低电平 0:0V ~ 0.8V 低电平0:+15V ~ +13V

    对于LVTTL,高低电平范围分别是 2.4–5V,0-- 0.4V,即LOW VOLTAGE TTL,是低电平标准的TTL。

    更多RS232电平连接方式及知识可参考:链接1

    1.4 字符帧格式

    1. 起始位
    2. 数据位
    3. 奇偶校验位:奇偶校验位:奇检验就是保证8位数据位中1的个数为基数个,如果1是基数个则检验位就为0,反之为1;偶检验就是保证8位数据位中1的个数为偶数个,如果1是偶数个则检验位就为0,反之为1;

    一帧数据的格式

    1. 停止位
    2. 波特率:波特率是指数据传送时,每秒传送数据二进制代码的位数,它的单位是位/秒(bit/s)。在异步串行通信中,接收设备和发送设备保持相同的传送波特率,并以每个字符数据的起始位与发送设备保持同步。起始位。数据位。奇偶位和停止位的约定,在同一次传送过程中必须保持一致,这样才能成功的传送数据。

    1.5 串口通信过程

    串口通信过程

    1.6 串口框图

    详细图片可查看STM32F4数据手册26.3节。文末下载链接里有提供STM32F4中文数据手册。

    串口通信框图

    2 并行通信

    2.1 传输原理与优缺点

    数据各位同时传送,快速设备之间采用并行通信,例如CPU 与存储设备、存储器与存储器、主机与打印机等都采用并行通信。并行通信,有多少位数据就必须有多少根数据线。优点是传输速度快,效率高,多用在对实时性要求高的场合。缺点是长距离通信时抗干扰能力差,占用引脚资源多。并行通信应用较少,在此不多做介绍。

    3 异步串行实例(自定义通信协议)

    说明:本实例适合于具体项目中需要自定义帧头、帧尾等数据传输格式的应用场合。比较基础的串口设置步骤例如使能时钟,初始化参数等在此不多做介绍,具体可参考原子哥的STM32F4 开发指南(库函数版) ->5.3.3节和第九章《串口通信实验》。
    更多串口接收数据的方式还可以参考:链接2
    由于涉及具体项目,故不会透露太多细节,只对通信协议进行介绍,方便大家移植。进入正题。

    3.1 项目需求

    系统分为三个模块,ARM(STM32F4)、FPGA、模拟电路。具体的系统功能由模拟电路实现。ARM负责接收来自上位机的指令,并控制FPGA输出命令信息和通信信息。

    3.2 项目框架

    上位机与ARM通过板载的蓝牙通信,采用了HC-05蓝牙转串口模块,模块的引脚RXD与TXD分别与ARM的串口收发端相连接,这样即可实现上位机与ARM的通信。
    ARM收到正确的上位机指令后,将指令或数据按照通信协议发送给FPGA,由FPGA控制模拟电路完成系统功能。
    在这里插入图片描述
    连接方式如下图所示,在图示的基础上,还要将HC-05模块的AT指令设置脚连接到ARM的IO上,AT指令用来设置蓝牙模块的参数,如设备名,密码,波特率之类。尤其要注意的是要设置蓝牙的波特率与程序中设置的串口波特率一样。设置方法见文末下载链接里的文档—HC-05芯片手册。
    在这里插入图片描述

    3.3 上位机下传帧格式

    上位机下传的帧格式
    说明:如果是自定义帧头的话,尽量选择55,AA之类不容易在数据部分出现的码,或者是用两个字节充当帧头。
    校验和为开始标识+命令号+数据长度+数据(16进制求和)。表中省略号的部分……当然是懒得算啦,一个一个加也太傻了。分享一个计算校验和的网站:链接3
    当然帧头/尾、数据长度、数据、校验和这些你可以任意安排,只要上位机按照这种数据格式发送数据,作为处理器端按这种数据格式接收数据就行。这就是双方的通信协议。
    数据长度与校验和都是高位在前,低位在后发送。例如命令号为01,没有数据的上位机指令为:C1D20100000194E3F4

    3.4 代码设计

    当上位机指令有错误时,ARM会返回对应的错误号码,上位机发送指令正确,则会返回上位机发送的数据(只是帧格式中的数据,不包含命令号等其他的)。发送上位机指令用的是串口助手,串口助手设置见下图,串口助手的参数一定要跟ARM程序中设置的一样,就像两个人能正常交流那就得用约定好的语言规则。
    不同指令运行结果见下图:

    运行结果
    开发板型号:正点原子F4探索者
    使用芯片:STM32F40ZGT6
    开发环境:IAR

    //串口初始化
    void uart_init(u32 bound){
      //GPIO端口设置
      GPIO_InitTypeDef GPIO_InitStructure;
      USART_InitTypeDef USART_InitStructure;
      NVIC_InitTypeDef NVIC_InitStructure;
      
      RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟
      
      //串口1对应引脚复用映射
      GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9复用为USART1
      GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10复用为USART1
      
      //USART1端口配置
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9与GPIOA10
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//速度50MHz
      GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
      GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9,PA10
      
      //USART1 初始化设置
      USART_InitStructure.USART_BaudRate = bound;//波特率设置
      USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
      USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
      USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
      USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
      USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式
      USART_Init(USART1, &USART_InitStructure); //初始化串口1
      
      USART_Cmd(USART1, ENABLE);  //使能串口1 
      USART_ClearFlag(USART1, USART_FLAG_TC);
      USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启相关中断
      
      //Usart1 NVIC 配置
      NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断通道
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3
      NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;		//子优先级3
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
      NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器、
    }
    

    下面是串口一的中断服务函数,前面设置了字长为8位,串口的收发也是以一个字节为基本单位进行,设计思路是每接收一帧数据,会根据数据下标N来判断数据是否正确,正确则继续接收,错误则返回错误编号且初始化变量。全部接收正确则进入下一个状态。

    //串口1中断服务程序
    void USART1_IRQHandler(void)  
    {
      unsigned int rec_data;
      if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断 RXNE是准备好读取接收到的数据标志位
      {
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);//清除接受中断标志
        if(N==0) 
        my_chk=0;//初始化和校验
        rec_data = USART_ReceiveData(USART1);//赋值临时变量
        my_chk+=rec_data;//计算和校验
        
        //检验开始标识
        if(N==0)
        {
          if(rec_data!=0xC1) 
          {
            commu_err = PROT_W;
          }
        }
        else if(N==1)
        {
          if(rec_data!=0XD2) 
          {
            commu_err = PROT_W;
          }
        }
        
        //检验命令标识
        else if(N==2)
        {
          if(  rec_data!=0x01 && rec_data!=0x02 && rec_data!=0x03 
               && rec_data!=0x04 && rec_data!=0x05 && rec_data!=0x06 ) 
          {
            commu_err = CODE_W;
          }
          else command=rec_data;
        }
        
        //接收数据长度 2Byte
        else if(N==3){
          rec_length=rec_data;
        }
        else if(N==4)
        {
          rec_length = (rec_length << 8) + (rec_data); //合并数据长度
          if(rec_length>599) 
          {
            commu_err = PROT_W;
          }
        }
        else
        {	
          //接收数据
          
          if(N<=rec_length+4)
          {
            //此处可根据不同命令号的数据长度不同,设置不同的N值筛选条件
            USART_RX_BUF[N-5]=rec_data;  
          
          }
          
          
          //接收和校验 2Byte
          else if(N==rec_length+5) 
          {
            rec_chk=rec_data;
          }
          else if(N==rec_length+6) 
          {
            my_chk-=rec_chk;//减去接收到的校验和低位
            my_chk-=rec_data;//减去接收到的校验和高位
            
            rec_chk = (rec_chk << 8) + rec_data; //合并校验和
            
            if(rec_chk != my_chk)  //判断接收到的校验和与计算出来的校验和是否相等
            {
              commu_err = SUMM_W;
            }
          }
          //接收结束标识
          else if(N==rec_length+7)
          {
            if(rec_data!=0xE3) 
            {
              commu_err = PROT_W;
            }
          }
          else if(N==rec_length+8)
          {
            if(rec_data!=0xF4) 
            {
              commu_err = PROT_W;
            }
            else 
            {
              P2A_Flag = 1;  //上位机发送数据符合协议,接收完毕进入下一个状态
            }
          }
        }
        N++;
        if( commu_err == PROT_W || commu_err == CODE_W || commu_err == SUMM_W )
        {
          while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);  //测试用,正式版本删除
          USART_SendData(USART1,commu_err);  
          Init_USART_RX_BUF();
          Init_BUF();	
        }
        
      }	
    }
    
    *主函数中判断接收是否完成,完成后可以进入下一个状态。*
    ```main.c
    int main(void)
    { 
      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
      delay_init(168);		//延时初始化 
      uart_init(38400);	//串口初始化,波特率为38400
      Init_USART_RX_BUF();  //初始化接受寄存器(上位机发送到ARM的数据存储在此数组)
      Init_BUF();  //过程中的变量初始化
      
      while(1)
      { 
       if(P2A_Flag == 1 )
       {
         
         for(j=0;j<rec_length;j++) //测试用,正式版本删除
         {
         while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);  
          USART_SendData(USART1,USART_RX_BUF[j]);  
         }  
         
         Init_BUF(); 
         Init_USART_RX_BUF();
       }
      }
    }
    
    

    3.5 下载文档介绍

    文末下载链接内的文档如下图所示:

    在这里插入图片描述
    编号06的文档是本博客的word版,包含除了代码外的所有文字部分。

    3.6 下载链接

    链接4

    3.7 说明

    本项目中的ARM和FPGA通信同样采用了自定义协议通信的方式,效率不高且占用IO过多,下个项目采用了SPI通信,等功能完善的差不多了,我会再写一篇ARM与FPGA进行SPI通信的文章。欢迎关注哟~

    展开全文
  • stm32串口中断通信,串口协议定义及实现,定时器在串口通信中的使用。
  • wince 串口协议调试工具 支持hex /ascii 发送、接收、显示,发送接收计数器、每次发送自动在尾部添加 0 ,串口协议调试的好工具,性能稳定,可靠
  • STM32F103通过软件模拟串口协议驱动TM1652,通过TM1652驱动数码管或LED显示,软件模拟的波特率是19200
  • COM串口协议通信基类

    2012-04-12 09:46:43
    COM串口协议通信实时读取数据,同步、异步、触发事件
  • 该文档是java使用Fx串口协议批量读、写入的demo,解压文件设置好串口规则运行即可。涉及到串口操作,需要引入RXTX库,将资源中rxtxParallel.dll/rxtxSerial.dll放在jdk安装目录下。
  • 主要介绍下蓝牙协议栈 串口协议(bluetooth SPP)Serial Port Profile 协议概念介绍。 一. 声明 本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下: 第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些...

    零. 概述

    主要介绍下蓝牙协议栈(bluetooth stack) 串口协议(bluetooth SPP)Serial Port Profile 协议概念介绍。

    一. 声明

    本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下:

    第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍。

    第二篇:Transport层介绍,主要介绍蓝牙协议栈跟蓝牙芯片之前的硬件传输协议,比如基于UART的H4,H5,BCSP,基于USB的H2等

    第三篇:传统蓝牙controller介绍,主要介绍传统蓝牙芯片的介绍,包括射频层(RF),基带层(baseband),链路管理层(LMP)等

    第四篇:传统蓝牙host介绍,主要介绍传统蓝牙的协议栈,比如HCI,L2CAP,SDP,RFCOMM,HFP,SPP,HID,AVDTP,AVCTP,A2DP,AVRCP,OBEX,PBAP,MAP等等一系列的协议吧。

    第五篇:低功耗蓝牙controller介绍,主要介绍低功耗蓝牙芯片,包括物理层(PHY),链路层(LL)

    第六篇:低功耗蓝牙host介绍,低功耗蓝牙协议栈的介绍,包括HCI,L2CAP,ATT,GATT,SM等

    第七篇:蓝牙芯片介绍,主要介绍一些蓝牙芯片的初始化流程,基于HCI vendor command的扩展

    第八篇:附录,主要介绍以上常用名词的介绍以及一些特殊流程的介绍等。

    另外,开发板如下所示,对于想学习蓝牙协议栈的最好人手一套。以便更好的学习蓝牙协议栈,相信我,学完这一套视频你将拥有修改任何协议栈的能力(比如Linux下的bluez,Android下的bluedroid)。

    -------------------------------------------------------------------------------------------------------------------------

    CSDN学院链接(进入选择你想要学习的课程):https://edu.csdn.net/lecturer/5352?spm=1002.2001.3001.4144

    蓝牙交流扣扣群:970324688

    Github代码:https://github.com/sj15712795029/bluetooth_stack

    入手开发板:https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4004-22329603896.18.5aeb41f973iStr&id=622836061708

    蓝牙学习目录https://blog.csdn.net/XiaoXiaoPengBo/article/details/107727900

    --------------------------------------------------------------------------------------------------------------------------

    二. 蓝牙串口SPP(Serial Port Profile)协议介绍

    2.1 概念介绍

    SPP是Serial Port Profile(串口协议)的缩写,其定义了使用蓝牙进行RS232(或类似)串行电缆仿真的设备应使用的协议和过程。简单来说就是在蓝牙设备之间建立虚拟的串口进行数据通信。说白了就是可以两个设备对端发送自定义数据,NOTED:苹果不支持SPP协议。

    目前SIG最新的版本是V1.2,之前更早的版本在官网只有V1.1可以下载到,但是这两份文档没有功能上的差别,所以不做介绍

    2.2 SPP协议在整个蓝牙中的架构图如下

    2.3 角色介绍

    Device A (DevA) – This is the device that takes initiative to form a connection to another device

    Device B (DevB) – This is the device that waits for another device to take initiative to connect.

    说白了就是就是两台设备连接,谁发起的连接角色就是Device A,被连接的就是Device B,但是这个和其他协议不同,两台设备之前的code基本都是一样,角色只是区分两台设备。

    2.4 SPP特性

    Device A是发起连接的主动房,所以Device A要至少支持Establish link and set up virtual serial connection.,Device B是被连接的乙方,所以要至少支持Accept link and establish virtual serial connection和Register Service record for application in local SDP database.以便Device A查询服务并且连接,但是此协议漏掉最主要的两个功能,发送数据,接收数据,或者SIG是觉得rfcomm做到了这个功能,所以不写在SPP协议中吧,但是我还是决定要在SPP介绍收发功能。

    2.4.1 Establish link and set up virtual serial connection.

    This procedure refers to performing the steps necessary to establish a connection to an emulated serial port (or equivalent) in a remote device. The steps in this procedure are:

    1)Submit a query using SDP to find out the RFCOMM Server channel number of the desired application in the remote device. This might include a browsing capability to let the user select among available ports (or services) in the peer device. Alternatively, if it is known exactly which service to contact, it is sufficient look up the necessary parameters using the Service Class ID associated with the desired service.

    2)Optionally, require authentication of the remote device to be performed. Also optionally, require encryption to be turned on.

    3)  Request a new L2CAP channel to the remote RFCOMM entity.

    4)  Initiate an RFCOMM session on the L2CAP channel.

    5)  Start a new data link connection on the RFCOMM session, using the aforementioned server channel number.After step 5, the virtual serial cable connection is ready to be used for communication between applications on both sides.

    2.4.2 Accept link and establish virtual serial connection.

    This procedure refers to taking part in the following steps:

    1)If requested by the remote device, take part in authentication  procedure and, upon

    further request, turn on encryption.

    2)  Accept a new channel establishment indication from L2CAP.

    3)  Accept an RFCOMM session establishment on that channel.

    4)  Accept a new data link connection on the RFCOMM session. This may trigger a local request to authenticate the remote device and turn on  encryption, if the user has required that for the emulated serial port being connected to (and authentication/encryption procedures have not already been carried out).

    2.4.3 Register Service record for application in local SDP database.

    This procedure refers to registration of a service record for an emulated serial port (or equivalent) in the SDP database. This implies the existence of a Service Database, and the ability to respond to SDP queries.

    NOTED:SPP只有安卓手机支持,并且部分安卓手机必须有SPP APP才可以连接,iphone手机不能直接SPP,但是又一个替代协议IAP,此协议需要买MFI chip才能用

    2.5 SDP相关的注册

    我看下我们的SDP注册:

    static const uint8_t spp_service_record[] =
    {
    	/* 1.ServiceClassIDList */
        SDP_DES_SIZE8, 0x8,
        SDP_UINT16, BT_ATTRIBUTE_SERVICE_CLASS_ID_LIST>>8&0xff, BT_ATTRIBUTE_SERVICE_CLASS_ID_LIST&0xff, /* Service class ID list attribute */
                SDP_DES_SIZE8, 3,
                SDP_UUID16, BT_SERVICE_CLASS_SERIAL_PORT>>8&0xff, BT_SERVICE_CLASS_SERIAL_PORT&0xff,
    
    	/* 2.ProtocolDescriptorList */
                SDP_DES_SIZE8, 0x11,
                SDP_UINT16, BT_ATTRIBUTE_PROTOCOL_DESCRIPTOR_LIST>>8&0xff, BT_ATTRIBUTE_PROTOCOL_DESCRIPTOR_LIST&0xff,/* Protocol descriptor list attribute */
                SDP_DES_SIZE8, 0xc,
                SDP_DES_SIZE8, 0x3,
                SDP_UUID16, BT_PROTOCOL_L2CAP>>8&0xff, BT_PROTOCOL_L2CAP&0xff, /*L2CAP*/
                SDP_DES_SIZE8, 0x5,
                SDP_UUID16, BT_PROTOCOL_RFCOMM>>8&0xff, BT_PROTOCOL_RFCOMM&0xff, /*RFCOMM*/
                SDP_UINT8, RFCOMM_SPP_SERVER_CHNL, /*RFCOMM channel*/
    
    	/* BluetoothProfileDescriptorList */
                SDP_DES_SIZE8, 0xd,
                SDP_UINT16, BT_ATTRIBUTE_BLUETOOTH_PROFILE_DESCRIPTOR_LIST>>8&0xff, BT_ATTRIBUTE_BLUETOOTH_PROFILE_DESCRIPTOR_LIST&0xff, /* profile descriptor List */
                SDP_DES_SIZE8, 0x8,
                SDP_DES_SIZE8,0x06,
                SDP_UUID16,BT_SERVICE_CLASS_SERIAL_PORT>>8&0xff, BT_SERVICE_CLASS_SERIAL_PORT&0xff,
                SDP_UINT16,0x01,0x02,		/* V1.2 */
    };

     

    展开全文
  • 公共环境数据在线监测设备RS232串口协议 公共环境数据在线监测设备RS232串口协议
  • 10X串口协议解析

    2019-01-18 11:28:02
    10X串口协议解析 1、串口协议解析 首先所有命令都要带传感器地址,一般传感器的地址都是1,所以如果没有修改修改传感器地址的话,那么命令的前面都是01(16进制),最大地址是127,即是7F。 常用命令 1、获取传感器...
  • 树莓派通过Modbus串口协议读取485接口的9轴角度传感器例程
  • STM32串口协议

    千次阅读 2017-09-12 16:53:14
    目前我总结了两种串口通信时用到的串口协议程序。均学习的原子哥的。 一、定义某个字符为一次接收数据完成,如/n/r。 二、定义两个字符接收时间间隔,如10ms。超过即为第二次接收。 一、程序示意: 二、...
  • 串口协议大解析

    2013-06-26 11:35:05
    这些也就是串口协议当中所包含的一些内容。所以为了更好地了解一些接口串口协议标准我们就来对这类问题进行一下详细的介绍。 串口协议插口种类及转换 串口协议是一种接口标准,它规定了接口的电气标准,简单说...
  • 串口协议文档

    2015-04-28 10:23:14
    此文档描述了关于在串口开发协议中所遇到的一些问题,及一些解决办法,希望对大家有所帮助
  • [资料]自定义usart串口协议用在实际项目中,非常详细 , 欢迎下载
  • 电子-基于STM32单片机的串口协议解析.zip,单片机/嵌入式STM32-F0/F1/F2
  • vj 型X光机串口协议

    2011-11-10 17:27:17
    VJ X光机串口协议。这是美国VJ型X光机的串口协议,相信做安防的同志需要。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,890
精华内容 3,956
关键字:

串口协议