串口读卡设备通信协议第一部分:物理层RS232 /RS485或RS422总线第二部分:数据链路层通信协议1. UART设置:波特率波特率波特率号24000x0048000x0196000x02144000x0319200出厂默认0x04288000x05384000x06576000x071152000x088位数据位无校验 1位停止位2.数据帧在一条RS232电缆线或RS485或RS422总线上数据总是以一 帧为单位进行通信的一帧的数据格式如下:帧起始符STX链路层信息Info帧结束符ETXlbyteN byteslbyte下表对一帧数据的每个字段进行详细的解释字段长度说明STX10x82 “Start of Text”始标志标准的控制字符,是一个帧的起InfoN字节链路层数据信息,所有字节的最高位必须为0,从网络层 接收的数据必须要通过数据扩展才能转换为链路层数 据信息.ETX10x83 “End of Text”束标志标准的控制字符是一个帧的结数据链路层接收规则:1.无论何时,如果接收一方接收到一个STX,则表示一帧的 开始,继续接收地址;2 .若接收到的地址字段与本机地址相符,则继续接收数据信 息,直到收到一个ETX;否则丢弄后面的数据,直到再次 收到一个STX3. 链路层数据信息的每个字节的最高位必须为0,这是为了 与STX和ETX区分开来。
而高层数据信息的每个字节的 取值可为0x00~ Oxff,这是因为在由高层数据转换为链路 层数据信时,进行了扩展整形处理处理原则为:高层数 据每7字节为一组,在每组前面插入一个字节,该字节的 最高位bit7为0,后面7位bitO〜bit6依次为后面7个字节 的最高位这样就可把该组每个字节的最高位bit7置为0 如下图示:(网络层数据每7字节一组)BytelByte 12Byte3Byte4Byte5Byte6Byte7bl7~ blOb27~ b20b37~ b30b47~ b40b57~ b50b67~ b60b77~ b70链路层数据8字节填充字节BytelByte2Byte3Byte4Byte5Byte6Byte70b77~ b!70bl6 ~bl00b26~ b200b36~ b300b46~ b400b56~ b500b66~ b600b76~ b70若最后一组数据不足7字节填充字节的相应位无效4. 本层协议只管把数据接收下来,并不验证数据是否正确,验证 数据必须通过上层协议來做;5. 接收相邻两字符的间隔时间不得超过5ms,收到STX后立即启 动超时定时器,若超时则本帧数据无效,重新接收下一个STX通信过程:在一个RS485或RS422总线上,从机读卡模块可以有多个, 而主机控制器只能有一个,只有主机才能主动发送命令或控制数据 给从机,从机只能对主机的命令做出动作和响应。
1. 主机:发送完命令数据后,等待从机响应,若在100ms内从机未响应则重发命令再次等待从机响应,若连续发三次 从机均未响应,则停止重发且向调用程序报告错误2. 从机:从机只对与自身地址相符的命令帧做出响应,响应时必须将地址设置为0,如果接收到一个错误的数据或地址 不符,则不做出任何响应3. 当主机以广播方式下发指令时,所有的从机都必须接收这帧数 据,但只有以下两种情况下才允许对广播命令进行应答:A. 某些特殊命令中,数据中包含有与本设备相符的设备序列号B. 搜索命令,允许每个从机在某个时间片内分别作出应答第三部分:网络层通信协议网络层可以保证数据的可靠性和完整性,该层有3个字段,格式如 下:接收者地址RAddr发送者地址SAddr应用层信息Info校验和BCClbytelbyteN byteslbyte网络层字段说明表:字段长度说明RAddr1数据接收者地址,这在多机通信时是必需的参数只有当从机地 址和该地址值相等时才处理所接收的数据Oxff:广播地址,所有从机都必须接受这个地址SAddr1数拯发送者地址InfoN应用层数据信息BCC1从RAddr开始至应用层信息Info的最后一字节相异或后取反第四部分:应用层通信协议应用层数据格式如下:包号/命令类型SEQ/CmdType命令/状态Cmd/Status信息长度Length信息InfolbytelbytelbyteN bytes网络层字段说明表字段长度说明SEQ/CmdType1Bit 7-4:该包序号从0到15循环,可以用来作为 通信间的错误检查。
从机接收到主机发来的信息, 在应答信息中发出一个同样的SEQ信息,主机可 以通过此信息检查是否发生的包丢失的错误第 一个包的SEQ可为任意值Bit 3-0:命令类型0x00协议控制类命令如设置地址读产品序号等 0x01设备控制类命令如读写10控制蜂鸣器读 写寄存器等其他值保留从机返冋相同的CmdTypeCmd/Status1主机一〉从机:命令 从机一〉主机:状态Length1该帧所带数据信息长度InfoLength数据信息第三节公共信道信令系统(CCS)随路信号系统缺点:信号传送速度慢,信号容量小.程控数字交换机采用N0.7公共信道信令系统CCS采用与话路完全分开的数据链路,专门传送信号 能满足呼叫控制、遥控、管理和维护1.优点:1) 信号容量大,适应各种新业务的要求2) 传送速度快,使交换机建立呼叫的接续时间大为缩短3) 在通话期间仍可传送信号4)信令系统不受话路系统的约束,为增加或改变 信号种类带来很大的灵活性2・CCS要求1)数据传输的可靠性:必须具有差错检测和差 错纠正的功能2)必须设置备份的公共信道信令装置(冗余), 差错率>10-8时自动切换到备用装置上来3)具有单独测试话路的能力二.NO.7信令系统结构及功能用户部分:包括用户部分、数据用户部分、运转和 维护部分、遥控用户部分、集中计费部分消息传递部分:公共传递功能、信号链路三.7号信号单元格式根据信号单元中的长度指示码,可将信号单元分成三类:1) 由“用户部分”产生的长度可变的消息信号单元(MSU)o用它来运载用户的信息,使信息从起源 点经过信令链路传递到目的地点。
2) 由第二级(信令链路功能级)根据链路状况提供的 链路状态信号单元(LSSU)用它来运载信令链路 状态的信息3) 填充信号单元(FISU)当没有消息信号单元或链 路转台信号单元在链路中传送时,将传递填充信号 单元FCKSIFSIOL1FIB FSNBIBBSNF8 16 8n, n^2 8 2 6 17 1 7 8(a)消息信号单元(MSU)的基本格式FCKSFLIFIBFSNBIBBSNF8168或62617178(b)链路状况信号单元(LSSU)的格式FCKLIFIBFSNBIBBSNF8 16 2 6 1 7 1 7 8(C)插入信号单元(FISU)的格式(1) 标记(FLAG)(2) 校验码(3) 信号信息字段(SIF)(4) 业务信息字段(SIO)(5) 长度指示码(L1)a. L1=O为填充信号单元b. Ll=l或2表示链路状态信号单元c. Ll>2当长度指示码大于2时,为消息信号单元(6) 序列编号及指示比特a. 前向序号码(FSN)b. 后向序号码(BSN)c. 前向指示比特(FIB)d. 后向指示比特(BIB)UART. cvoid UART_Init(){PCON = 0x80;SCON = 0x50;TMOD = 0x21;MyAddr = 0;BaudNum = 7;ttdefine UART_GLOBALS^include 〃main. h〃^include 〃UART・h"^include 〃delay. h"// SMOD = 1;// Mode 1, 8-bit UART, enable receiption// Timer 1, mode 2, 8-bit auto reload,THl=BaudRateTable[BaudNum]; // 如 THl=0xfd Baud=9600TLl=BaudRateTable[BaudNum]; // TLl=0xfdTRI = 1;RcvStatus = 0; //接收状态标志,开始时清0SerDTValid 二 FALSE;SerTmOut = 0;SendFlag = FALSE;SendStatus = SENDIDLE;// #define sendtdle 4RS485_TXen = 0; // 禁止发送REN = 1; //允许接收ES = 1; //允许串口中断void UART_Isr() interrupt 4 using 1INT8U temp;static INT8U SerLen, ExtData; // ExtData 为扩展字节static INT8U LenSend; //已发送的有效数据长度if(RI)// RI接收中断标记temp = SBUF;if (temp == STX) // 是一帧的起始?{ 〃在任何时候收到STX,即可视为一帧的开始RcvStatus =1 ; //接收状态标志置1SerLen = 0:RcvDTLen =0; // RcvDTLen接收有效数据长度SerTmOut =2; //启动超时定时器else if (temp == ETX) // 是一帧的结束标志?辻(RcvStatus == 1 ) //若接收状态标志置=1{if(SerTmOut){ 〃在未超时的情况下,接收数据后又收到一个ETX,则本帧数据有效SerDTValid ==TRUE;}RcvStatus = 0 ; //接收状态标志清0,表示本帧结束} \ else if(RcvStatus ==J1) 〃是一帧的中间部分Iif((SerTmOut==O)I (temp&0x80))RcvStatus = 0 ; //超时或数据中的bit7为1,则本帧数据作废elseSerTmOut = 2; //置未超时标记if((SerLen&0x07) == 0) // 七个字节为一组,第 8 字 节为扩展字节{ 〃扩展字节ExtData = temp;}else{if (ExtData & 0x01) 〃该扩展字节位为1{temp | = 0x80; //则相应的该位字节最高位置1}SerBfr[RcvDTLen++] = temp; //保存该字节ExtData »= 1; //。