串口读卡通信协议.docx

上传人:b****6 文档编号:6556374 上传时间:2023-01-07 格式:DOCX 页数:13 大小:21.33KB
下载 相关 举报
串口读卡通信协议.docx_第1页
第1页 / 共13页
串口读卡通信协议.docx_第2页
第2页 / 共13页
串口读卡通信协议.docx_第3页
第3页 / 共13页
串口读卡通信协议.docx_第4页
第4页 / 共13页
串口读卡通信协议.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

串口读卡通信协议.docx

《串口读卡通信协议.docx》由会员分享,可在线阅读,更多相关《串口读卡通信协议.docx(13页珍藏版)》请在冰豆网上搜索。

串口读卡通信协议.docx

串口读卡通信协议

串口读卡设备通信协议

第一部分:

物理层RS232/RS485或RS422总线

第二部分:

数据链路层通信协议

1.UART设置:

波特率

波特率

波特率号

2400

0x00

4800

0x01

9600

0x02

14400

0x03

19200

出厂默认0x04

28800

0x05

38400

0x06

57600

0x07

115200

0x08

8位数据位无校验1位停止位

2.数据帧

在一条RS232电缆线或RS485或RS422总线上数据总是以一帧为单位进行通信的一帧的数据格式如下:

帧起始符

STX

链路层信息

Info

帧结束符

ETX

1byte

Nbytes

1byte

下表对一帧数据的每个字段进行详细的解释

字段

长度

说明

STX

1

0x82“StartofText标准的控制字符,是一个帧的起

始标志

Info

N字节

链路层数据信息,所有字节的最高位必须为0,从网络层

接收的数据必须要通过数据扩展才能转换为链路层数据信息.

ETX

1

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

Byte3

Byte4

Byte5

Byte6

Byte7

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

应用层信息

Info

校验和

BCC

Ibyte

Ibyte

Nbytes

Ibyte

网络层字段说明表:

字段

长度

说明

RAddr

1

数据接收者地址,这在多机通信时是必需的参数。

只有当从机地址和该地址值相等时才处理所接收的数据。

Oxff:

广播地址,所有从机都必须接受这个地址

SAddr

1

数据发送者地址

Info

N

:

应用层数据信息

BCC

1

从RAddr开始至应用层信息Info的最后一字节相异或后取反

第四部分:

应用层通信协议

应用层数据格式如下:

包号/命令类型

SEQ/CmdType

命令/状态

Cmd/Status

信息长度

Length

信息

Info

1byte

1byte

1byte

Nbytes

网络层字段说明表

字段

长度

说明

SEQ/

CmdType

1

Bit7-4:

该包序号从0到15循环,可以用来作为通信间的错误检查。

从机接收到主机发来的信息,在应答信息中发出一个同样的SEQ信息,主机可以通过此信息检查是否发生的包丢失的错误。

第一个包的SEQ可为任意值

Bit3-0:

命令类型

0x00协议控制类命令如设置地址读产品序号等0x01设备控制类命令如读写IO控制蜂鸣器读写寄存器等其他值保留

从机返回相同的CmdType

Cmd/Status

1

主机一>从机:

命令从机一>主机:

状态

Length

1

该帧所带数据信息长度

Info

Length

数据信息

第三节公共信道信令系统(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

F

8168n,n》282617178

(a)消息信号单元(MSU)的基本格式

F

CK

SF

L1

FIB

FSN

BIB

BSN

F

8168或62617178

(b)链路状况信号单元(LSSU)的格式

F

CK

L1

FIB

FSN

|BIB

BSN

F|

8

16

2

6

1

7

1

7

8

(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"

#include"UART.h"

#include"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))

RcvStatus=0;//超时或数据中的bit7为1,则本

帧数据作废

else

{

SerTmOut=2;

//置未超时标记

if((SerLen&0x07)==0)//节为扩展字节

七个字节为一组,第8字

{//扩展字节

ExtData=temp;

}

else

{

if(ExtData&0x01)//该扩展字节位为1

{

temp|=0x80;//则相应的该位字节最高位置1}

SerBfr[RcvDTLen++]=temp;//保存该字节

ExtData>>=1;//扩展字节位右移,处理下一位

}

SerLen++;//长度加一

}

}

以上是采用中断方式接收一帧数据,包括帧头、帧尾及中间部分数据,接下来对已接收的数据进行处理

if(SerDTValid)

{

//接收数据处理

SerDTValid=FALSE;//表示接收数据已处理if(RcvDTLen==(SerBfr[LENGTH]+6))//P8读序列号{//网络层数据共10字节temp=0;

for(SerLen=0;SerLen

tempA=SerBfr[SerLen];II八异或

if(temp==0xff)//0xff广播地址

{

if(SerBfr[RADDR]==MyAddr)

{

SerDTValid=TRUE;

}

}

}

}

RI=0;

}

else

{

if(SendStatus==SENDSTX)

{

SBUF=STX;

SendStatus=SENDDATA;//下次中断发送数据

SerLen=0;

LenSend=0;

}

elseif(SendStatus==SENDDATA)

{

if((SerLen&0x07)==0)

{

ExtData=0;

temp=LentoSend>=7?

7:

LentoSend;//计算扩展数据位长度,若LentoSend>=7则temp=7,否则temp=LentoSenddo

{

ExtData<<=1;

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}

}

SerLen++;

}

elseif(SendStatus==SENDETX)

{

SBUF=ETX;//发送ETX

SendStatus=SENDSTOP;//下次中断结束本次发送

}

elseif(SendStatus==SENDSTOP)

{

RS485_TXen=FALSE;

SendFlag=FALSE;

SendStatus=SENDIDLE;//发送器空闲

}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

{

SerBfr[LentoSend]A=SerBfr[i];//八异或

}

SerBfr[LentoSend]=~SerBfr[LentoSend];//~取反

LentoSend++;

RS485_TXen=1;

SendStatus=SENDSTX;TI=1;

returnTRUE;

}

else

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

#defineSENDIDLE4

UART_EXTINT8USerTmOut;//串行超时计数器

#defineSTX0x82

#defineETX0x83

#defineSADDR#defineCMDTYPE2

#defineCOMMAND3

#defineSTATUS3

#defineLENGTH4

#defineDATA5

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1