串口读卡通信协议.docx
- 文档编号:6556374
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:13
- 大小:21.33KB
串口读卡通信协议.docx
《串口读卡通信协议.docx》由会员分享,可在线阅读,更多相关《串口读卡通信协议.docx(13页珍藏版)》请在冰豆网上搜索。
串口读卡通信协议
串口读卡设备通信协议
第一部分:
物理层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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 串口 卡通 协议