C# 根据rs485通讯协议 编写API
第一次接触这些 完全不知道从哪里入手
公司要开发幼儿接送系统,从网上购买的485ID读卡器只提供了RS485传输协议,以前开发都是直接调用API,现在连API都要自己编写了,不知道从那里入手了。
完全看不懂
标准只读型感应式卡片阅读机
通
讯
技
术
手
册
通讯协议(Protocol)
卡片阅读机模块(Reader Module)的通讯协议(Protocol)皆出自于SYRIS的一种标准通讯协议,这种协议格式如下表:
HEADDATABCC CHECK
8 BITS BCCEND
SOHTYPEIDFC
0x09BCC1BCC20x0D
起始码模块型式模块型式功能码资料错误检查码结束码
1.SOH 和 END 都是一个字节的控制字符:
SOH 控制器端定义为 <0x09>
模块端定义为 <0x0A>
END 控制器及模块端均固定为 <0x0D>
其中 <0x> 为十六进制表示法.
2.TYPE 为模块型式编号,固定为一个字节,本型式编号固定为 “A”.
3.ID为模块端的识别代码,这一字节的 ASCII 字符必须是在 1 <0x31> 到8 <0x38> 的范围内,假如控制器端传送之ID值与模块地址编号相同时,则该模块将会接收控制器端所传送的数据,而模块响应时,也会传回相同的地址编号.
4.FC是通讯功能码(Function Code)和资料(DATA)有相关性,固定为一个字节,这些资料请参考通讯协议表及相关说明.
5.错误讯息判断代码(Error Code)为两个字节,第一个字节为固定为 <0x0E> ,第二个字节为错误代码,请参考错误讯息代码表.
6.8 BITS BCC是所有字符的检查字段,为二个字节,有关 8 BITS BCC 的信息和范例程序,请参考附录A.
7.RS485传输协议请设定为 ”E,8,1”,速率为 ”19200”.
错误讯息代码表(Error Code Table)
Data Field
Error Code #2Error Description
A无效句柄(Invalid Function Code Received)
B资料或讯息格式错误(Data or Message Format Error)
C数据库错误讯息(Database Error Message)
D同位检查码错误(Check Sum Error)
E内存错误(Memory Error)
F设定或读取保护中资料(Set or Get Protection Data)
G其它错误讯息(Other Error Message)
Error Code #1固定为 <0x0E>.
控制器与模块通讯协议表
Controller & Module Protocol Table
FC
DESCRIPTION
NOTE
B读取模块出厂序号
Get Module Factory Code读取模块出厂序号
C设定模块地址编号
Set Module ID Code系统公司设定模块地址编号
D读取模块地址编号
Get Module ID Code读取模块地址编号
F读取卡片内码资料
Read Card ID Data读取模块感应之卡片内码资料
G重新读取卡片内码资料
Read Card ID Data重新读取模块感应之卡片内码资料
读取模块出厂序号(Get Module Factory Code)
FC: B
说明(COMMENTS):
此功能为读取卡片阅读机模块出厂序号,共有8码,第1码至第2码至出厂年份,第3码至第4码为出厂周别,第5码至第8码为该型号流水号码.
控制器发送讯息(Controller Transceiver Message):
模块代码(ID):<1> ~ <8>
资料(DATA):<None>
HEADDATABCC CHECK
8 BITS BCCEND
SOHTYPEIDFC
0x09A1BBCC1BCC20x0D
模块响应讯息(Module Response Message):
资料(DATA):<98030001>
HEADDATABCC CHECK
8 BITS BCCEND
SOHTYPEIDFC
0x0AA1B98030001BCC1BCC20x0D
设定模块地址编号(Set Module ID Code)
FC: C
说明(COMMENTS):
此功能为设定地址编号,使用模块出厂序号.
控制器发送讯息(Controller Transceiver Message):
模块代码(ID):固定为 <X>
资料(DATA):出厂序号 <98030001> , 模块代码 <1>
HEADDATABCC CHECK
8 BITS BCCEND
SOHTYPEIDFC
0x09AXC980300011BCC1BCC20x0D
模块响应讯息(Module Response Message):
资料(DATA):<None>
HEADDATABCC CHECK
8 BITS BCCEND
SOHTYPEIDFC
0x0AAXCBCC1BCC20x0D
读取模块地址编号(Get Module ID Code)
FC: D
说明(COMMENTS):
此功能为读取地址编号,使用模块出厂序号.
控制器发送讯息(Controller Transceiver Message):
模块代码(ID):固定为 <X>
资料(DATA):出厂序号 <98030001>
HEADDATABCC CHECK
8 BITS BCCEND
SOHTYPEIDFC
0x09AXD98030001BCC1BCC20x0D
模块响应讯息(Module Response Message):
资料(DATA):模块代码 <1>
HEADDATABCC CHECK
8 BITS BCCEND
SOHTYPEIDFC
0x0AAXD1BCC1BCC20x0D
读取卡片资料(Read Card Data)
FC: F
说明(COMMENTS):
此功能为读取卡片阅读机所读到之卡片资料,长度随着不同形式
卡片而有不同长度,如下表:
卡片形式及格式表(Card Type & Format Table)
TypeDescription
0SYRIS 32 bits R/O serial number
1SYRIS 32 bits R/W serial number
2TIRIS 64 bits R/O serial number
3TIRIS 64 bits R/W data
控制器发送讯息(Controller Transceiver Message):
模块代码(ID):<1> ~ <8> , 资料(DATA):<None>
HEADDATABCC CHECK
8 BITS BCCEND
SOHTYPEIDFC
0x09A1FBCC1BCC20x0D
模块响应讯息(Module Response Message):
(有卡片感应)
资料(DATA):<00000FF1A >(*附注)
HEADDATABCC CHECK
8 BITS BCCEND
SOHTYPEIDFC
0x0AA1F00000FF1ABCC1BCC20x0D
模块响应讯息(Module Response Message) :
(无卡片感应)
资料(DATA):<None>
HEADDATABCC CHECK
8 BITS BCCEND
SOHTYPEIDFC
0x0AA1FBCC1BCC20x0D
附注:
资料(DATA):00000FF1A
第1码为卡片形式代号,一般SYRIS 32 bits R/O serial number代号为0,第2码以后为卡片内码(CARD ID),编码方式为两个字符代表一个16进位码,若32Bits则有8个0-F字符。
重新读取卡片资料(Read Card Data)
FC: G
说明(COMMENTS):
此功能为重新读取卡片阅读机所读到之卡片资料.
控制器发送讯息(Controller Transceiver Message):
模块代码(ID):<1> ~ <8> ,资料(DATA):<None>
HEADDATABCC CHECK
8 BITS BCCEND
SOHTYPEIDFC
0x09A1GBCC1BCC20x0D
模块响应讯息(Module Response Message):
资料(DATA):<00000FF1A >(*附注)
HEADDATABCC CHECK
8 BITS BCCEND
SOHTYPEIDFC
0x0AA1G00000FF1ABCC1BCC20x0D
附注:
卡片阅读机 Power ON 时,如果未曾联机读取资料,则感应到卡片时,卡片阅读机哔一声且LED会亮一下,若有联机读取过资料时,则感应到卡片时,LED会一直亮绿灯且不能够再感应卡片,直到收到读取卡片资料(FC=”F”)后才会变回红灯且恢复正常读卡。
附录A
计算一个 BCC 检查字符
BCC检查字符是将所有要传送出去的信号讯息,以逻辑互斥或XOR(exclusive-or)所产生的结果为BCC的值.
ABA XOR B
110
101
011
000
The SYRDS1-485 format looks like table below:
HEADDATABCC CHECK
8 BITS BCCEND
SOHTYPEIDFC
09(HEX)“A”“1”“F”NONEBCC1BCC20D(HEX)
BCC的计算有4个步骤:
1.排除 BCC 及 END,不加入 XOR.
2."SOH" 与 "TYPE" XOR,产生一个二进制的值.
3.将步骤 2 所 XOR 的结果,与 "ID" XOR.
4.再将步骤 3 所产生的结果与 "FC" XOR,以此方法,继续将
"DATA" 内容先后 XOR,则最后所互斥或的结果,即是 BCC 的
值.
以下为计算 BCC 时的范例:
此范例中,卡片阅读机的 ID 为 1,功能参数码 F.
1. Assign the values:
MESSAGE
SEGMENTHEX
VALUECOMMENTS
SOH09(HEX)开始码
TYPE41(HEX)SYRDSSS1 使用 "A"(41)
ID31(HEX)编号 ID 为 1 码,此例中 ID 为 ”1”
FC46(HEX)功能码为 1 码,此例中参数为 ”F”
DATA--因为功能为 ”F”,所以无资料串
BCC??运算所求出的答案
END0D(HEX)结束码
2.将 "SOH" 与 "TYPE" 两者的值 XOR,ANS表示运算后的结
果.
SOH00001001
XORXOR
TYPE01000001
--------
ANS01001000
3.将步骤 2 的结果 ANS 与 ID 的值 XOR.
ANS01001000
XORXOR
ID00110001
--------
ANS01111001
4.将其它 Byte 运算完后,最后一个结即是 BCC 的值.
ANS01111001
XORXOR
FC01000110
--------
ANS00111111
3F
则 BCC 之值为:
Hi Byte 为 33(HEX) (字符 “3” ASCII code 为 33(HEX)).
Low Byte 为 46(HEX) (字符 “F” ASCII code 为 46(HEX)).
以下为用 BASIC 程序来产生"BCC"的范例
Program to generate BCC values:
10 ‘**************************************************
20 ‘* Generate Block Check Character *
30 ‘**************************************************
40 MESSAGE$ = CHR$(10) +TYPE$ + ID$ + FC$ + DATA$
50 BCC = 0
60 FOR I = 1 TO LEN ( MESSAGE$ )
70 BCC = BCC XOR ASC ( MID$ ( MESSAGE$ , I , 1 ) )
80 NEXT I
若有程式方面之問題,請聯絡代理商或經銷商.
485?通讯 API 485 读卡器 通讯协议
[解决办法]
http://bbs.csdn.net/topics/390592265