串口读卡通信协议Word格式.docx
《串口读卡通信协议Word格式.docx》由会员分享,可在线阅读,更多相关《串口读卡通信协议Word格式.docx(13页珍藏版)》请在冰豆网上搜索。
说明
1
0x82“StartofText标准的控制字符,是一个帧的起
始标志
N字节
链路层数据信息,所有字节的最高位必须为0,从网络层
接收的数据必须要通过数据扩展才能转换为链路层数据信息.
0x83“EndofText”标准的控制字符是一个帧的结
束标志
数据链路层接收规则:
1.无论何时,如果接收一方接收到一个STX,则表示一帧的
开始,继续接收地址;
2.若接收到的地址字段与本机地址相符,则继续接收数据信息,直到收到一个ETX;
否则丢弃后面的数据,直到再次收到一个STX
3.链路层数据信息的每个字节的最高位必须为0,这是为了
与STX和ETX区分开来。
而高层数据信息的每个字节的取值可为0x00〜Oxff,这是因为在由高层数据转换为链路层数据信时,进行了扩展整形处理。
处理原则为:
高层数据每7字节为一组,在每组前面插入一个字节,该字节的最高位bit7为0,后面7位bit0〜bit6依次为后面7个字节的最高位。
这样就可把该组每个字节的最高位bit7置为0
如下图示:
(网络层数据每7字节一组)
Bytel
Byte12
Byte3
Byte4
Byte5
Byte6
Byte7
b17~b10
b27~b20
b37~b30
b47~b40
b57~b50
b67~b60:
b77~b70
链路层数据8字节
填充字节
Byte1
Byte2
0b77~b17
0b16~b10
0b26~b20
0b36~b30
0b46~b40
P0b56~b50
「0b66~b60
0b76~b70
若最后一组数据不足7字节填充字节的相应位无效
4.本层协议只管把数据接收下来,并不验证数据是否正确,验证
数据必须通过上层协议来做;
5.接收相邻两字符的间隔时间不得超过5ms,收到STX后立即启
动超时定时器,若超时则本帧数据无效,重新接收下一个STX
通信过程:
在一个RS485或RS422总线上,从机读卡模块可以有多个,而主机控制器只能有一个,只有主机才能主动发送命令或控制数据给从机,从机只能对主机的命令做出动作和响应。
1.主机:
发送完命令数据后,等待从机响应,若在100ms内从机
未响应则重发命令。
再次等待从机响应,若连续发三次从机均未响应,则停止重发且向调用程序报告错误。
2.从机:
从机只对与自身地址相符的命令帧做出响应,响应时必
须将地址设置为0,如果接收到一个错误的数据或地址不符,则不做出任何响应。
3.当主机以广播方式下发指令时,所有的从机都必须接收这帧数
据,但只有以下两种情况下才允许对广播命令进行应答:
A.某些特殊命令中,数据中包含有与本设备相符的设备序列号
B.搜索命令,允许每个从机在某个时间片内分别作出应答
第三部分:
网络层通信协议
网络层可以保证数据的可靠性和完整性,该层有3个字段,格式女口
下:
接收者地址
RAddr
发送者地址
SAddr
应用层信息
校验和
BCC
Ibyte
网络层字段说明表:
数据接收者地址,这在多机通信时是必需的参数。
只有当从机地址和该地址值相等时才处理所接收的数据。
Oxff:
广播地址,所有从机都必须接受这个地址
数据发送者地址
N
:
应用层数据信息
从RAddr开始至应用层信息Info的最后一字节相异或后取反
第四部分:
应用层通信协议
应用层数据格式如下:
包号/命令类型
SEQ/CmdType
命令/状态
Cmd/Status
信息长度
Length
信息
网络层字段说明表
SEQ/
CmdType
Bit7-4:
该包序号从0到15循环,可以用来作为通信间的错误检查。
从机接收到主机发来的信息,在应答信息中发出一个同样的SEQ信息,主机可以通过此信息检查是否发生的包丢失的错误。
第一个包的SEQ可为任意值
Bit3-0:
命令类型
0x00协议控制类命令如设置地址读产品序号等0x01设备控制类命令如读写IO控制蜂鸣器读写寄存器等其他值保留
从机返回相同的CmdType
主机一>
从机:
命令从机一>
主机:
状态
该帧所带数据信息长度
数据信息
第三节公共信道信令系统(CCS)随路信号系统缺点:
信号传送速度慢,信号容量小.程控数字交换机采用NO.7公共信道信令系统。
CCS采用与话路完全分开的数据链路,专门传送信号。
能满足呼叫控制、遥控、管理和维护。
1.优点:
1)信号容量大,适应各种新业务的要求
2)传送速度快,使交换机建立呼叫的接续时间
大为缩短。
3)在通话期间仍可传送信号
4)信令系统不受话路系统的约束,为增加或改变信号种类带来很大的灵活性。
2.CCS要求
1)数据传输的可靠性:
必须具有差错检测和差错纠正的功能
2)必须设置备份的公共信道信令装置(冗余),差错率>
10-8时自动切换到备用装置上来。
3)具有单独测试话路的能力
二.NO.7信令系统结构及功能
用户部分:
包括电话用户部分、数据用户部分、运转和维护部分、遥控用户部分、集中计费部分
消息传递部分:
公共传递功能、信号链路
三.7号信号单元格式根据信号单元中的长度指示码,可将信号单元分成三类:
1)由“用户部分”产生的长度可变的消息信号单元(MSU)。
用它来运载用户的信息,使信息从起源点经过信令链路传递到目的地点。
2)由第二级(信令链路功能级)根据链路状况提供的链路状态信号单元(LSSU)。
用它来运载信令链路状态的信息。
3)填充信号单元(FISU)。
当没有消息信号单元或链路转台信号单元在链路中传送时,将传递填充信号单元。
F
CK
SIF
SIO
L1
FIB
FSN
BIB
BSN
8168n,n》282617178
(a)消息信号单元(MSU)的基本格式
SF
8168或62617178
(b)链路状况信号单元(LSSU)的格式
|BIB
F|
8
16
2
6
7
(c)插入信号单元(FISU)的格式
(1)标记(FLAG)
(2)校验码
(3)信号信息字段(SIF)
(4)业务信息字段(SIO)
5)长度指示码(L1)
a.L1=0为填充信号单元
b.L1=1或2表示链路状态信号单元
c.L1>
2当长度指示码大于2时,为消息信号单元
6)序列编号及指示比特
a.前向序号码(FSN)
b.后向序号码(BSN)
c.前向指示比特(FIB)
d.后向指示比特(BIB)
UART.c
#defineUART_GLOBALS
#include"
main.h"
UART.h"
delay.h"
voidUART_Init()
{
PCON=0x80;
//SMOD=1;
SCON=0x50;
//Mode1,8-bitUART,enablereceiption
TMOD=0x21;
//Timer1,mode2,8-bitautoreload,
MyAddr=0;
BaudNum=7;
TH1=BaudRateTable[BaudNum];
//如TH1=0xfdBaud=9600
TL1=BaudRateTable[BaudNum];
//TL1=0xfd
接收状态标志,开始时清0
TR1=1;
RcvStatus=0;
//
SerDTValid=FALSE;
SerTmOut=0;
SendFlag=FALSE;
SendStatus=SENDIDLE;
//
#defineSENDIDLE4
RS485_TXen=0;
禁止发送
REN=1;
允许接收
ES=1;
允许串口中断
}
voidUART_Isr()interrupt4using1
INT8Utemp;
staticINT8USerLen,ExtData;
//ExtData为扩展字节
staticINT8ULenSend;
//已发送的有效数据长度
if(RI)//RI接收中断标记
temp=SBUF;
if(temp==STX)//是一帧的起始?
{//在任何时候收到STX,即可视为一帧的开始
RcvStatus=1;
//接收状态标志置1
SerLen=0;
RcvDTLen=0;
//RcvDTLen接收有效数据长度SerTmOut=2;
//启动超时定时器
elseif(temp==ETX)//是一帧的结束标志?
if(RcvStatus==1)//若接收状态标志置=1
if(SerTmOut)
{//在未超时的情况下,接收数据后又收到一个ETX,则
本帧数据有效
SerDTValid=TRUE;
RcvStatus=0;
//接收状态标志清0,表示本帧结束
}}1
elseif(RcvStatus==1)//是一帧的中间部分
if((SerTmOut==0)||(temp&
0x80))
//超时或数据中的bit7为1,则本
帧数据作废
else
SerTmOut=2;
//置未超时标记
if((SerLen&
0x07)==0)//节为扩展字节
七个字节为一组,第8字
{//扩展字节
ExtData=temp;
if(ExtData&
0x01)//该扩展字节位为1
temp|=0x80;
//则相应的该位字节最高位置1}
SerBfr[RcvDTLen++]=temp;
//保存该字节
ExtData>
>
=1;
//扩展字节位右移,处理下一位
SerLen++;
//长度加一
以上是采用中断方式接收一帧数据,包括帧头、帧尾及中间部分数据,接下来对已接收的数据进行处理
if(SerDTValid)
//接收数据处理
//表示接收数据已处理if(RcvDTLen==(SerBfr[LENGTH]+6))//P8读序列号{//网络层数据共10字节temp=0;
for(SerLen=0;
SerLen<
RcvDTLen;
SerLen++)
tempA=SerBfr[SerLen];
II八异或
if(temp==0xff)//0xff广播地址
if(SerBfr[RADDR]==MyAddr)
RI=0;
if(SendStatus==SENDSTX)
SBUF=STX;
SendStatus=SENDDATA;
//下次中断发送数据
LenSend=0;
elseif(SendStatus==SENDDATA)
0x07)==0)
ExtData=0;
temp=LentoSend>
=7?
7:
LentoSend;
//计算扩展数据位长度,若LentoSend>
=7则temp=7,否则temp=LentoSenddo
ExtData<
<
if(SerBfr[LenSend+(temp-1)]&
0x80)
ExtData|=0x01;
temp--;
}while(temp);
SBUF=ExtData;
//发送扩展数据
}else
SBUF=SerBfr[LenSend]&
0x7f;
LenSend++;
LentoSend--;
if(LentoSend==0)
{//有效数据已发送完毕
SendStatus=SENDETX;
//下次中断发送ETX}
elseif(SendStatus==SENDETX)
SBUF=ETX;
//发送ETX
SendStatus=SENDSTOP;
//下次中断结束本次发送
elseif(SendStatus==SENDSTOP)
RS485_TXen=FALSE;
//发送器空闲
}TI=0;
INT8USer_Send(INT8USlvAddr)
INT8Ui;
if(SendStatus==SENDIDLE)
SerBfr[RADDR]=SlvAddr;
//从机地址
SerBfr[SADDR]=MyAddr;
LentoSend=SerBfr[LENGTH]+5;
//P8主机命令
SerBfr[LentoSend]=0;
for(i=0;
i<
i++)
SerBfr[LentoSend]A=SerBfr[i];
//八异或
SerBfr[LentoSend]=~SerBfr[LentoSend];
//~取反
LentoSend++;
RS485_TXen=1;
SendStatus=SENDSTX;
TI=1;
returnTRUE;
returnFALSE;
//TheendsbitRS485_TXen=P1A2;
UART_EXTINT8UMyAddr;
UART_EXTINT8UBaudNum;
#defineMAXSERSIZE32
UART_EXTINT8USerBfr[MAXSERSIZE];
UART_EXTINT8URcvDTLen;
//接收有效数据长度
UART_EXTbitRcvStatus;
//接收状态标志
#defineRCVSTX0
#defineRCVDATA
UART_EXTbitSerDTValid;
//串行数据有效标志
UART_EXTbitFindFlag;
//搜索标志
UART_EXTbitSendFlag;
//串行发送标志,表示有数据要从串口发送
UART_EXTINT8ULentoSend;
//将要发送的有效数据长度
UART_EXTINT8USendStatus;
//发送状态,表示下次发送中断将要进行的动作
#defineSENDSTX0
#defineSENDDATA1
#defineSENDETX2
#defineSENDSTOP3
UART_EXTINT8USerTmOut;
//串行超时计数器
#defineSTX0x82
#defineETX0x83
#defineSADDR#defineCMDTYPE2
#defineCOMMAND3
#defineSTATUS3
#defineLENGTH4
#defineDATA5