选择modem和pstn网络进行数据传输,是目前很多金融设备一种比较流行的通讯连接方式,进行通讯连接的modem不同于普通的家用modem,其功能主要就是数据传输,数据传输的类型必须支持小数据量的同步通讯和大数据量的异步通讯,并且在同步通讯时支持快速握手,这里主要介绍下本人在实际开发过程中通讯的具体实现流程。
首先,操作modem,在实际开发中,用单片机的串口对modem进行控制,在连线时,采用5线制,即TX,RX外,还需要RTS和CTS,进行流控。默认的波特率是9600,可以根据实际需要配置,一般同步传输时1200,远小于9600,不需要配置,如果在异步传输大数据量时,由于9600可能远小于实际modem通讯时的速率,需要进行配置。
如果只是使用异步模式,基本无需详细配置,本人在实际中配置如下:
SendAtCmd(”atz/r”); //软件复位
Delay_ms(500); //延时,如果没有,可能下面的命令modem无法收到
SendAtCmd(“AT&F/r”); //恢复出厂设置
SendAtCmd(“ATE0/r”); //取消回显
SendAtCmd(“ATS0=2/r”); //铃声两次后自动接通
这样的话异步基本实现了,这样拨号后使用普通的串口数据读写就能进行通讯。
详细介绍下同步通讯,首先是配置modem,这里配置成V22模式,V29模式目前还没调通。
前面的配置如上
"AT//N0/r", //操作模式选择(选择正常速度缓冲模式)
"AT+ES=6,,8/r", //使能v.80同步访问模式
"AT+ESA=0,0,0,,1,0/r", //使能crc校验
"AT+IFC=2,2/r", //使能RTS,CTS硬件流控
"AT+ITF=0383,0128/r", //设置CTS硬流控Buffer,CTS在383字节打开,在128字节关闭
"AT:U87,050A/r", //设置指向Framed Sub-mode连接模式,DCE从DTE接收到10字节后开始发送
"AT:U80,0258/r",
"AT&H7/r", //设置为只是用ITU-TV.22(1200bps)方式握手
"AT+MS=V22/r", //设置为V.22握手方式
"AT:U7A,3/r", //使能V.22快速握手方式
"ATS7=19/r",
"ATS14=5/r",
"ATS38=1/r",
设置完后,modem基本配置完成,然后可以进行拨号和握手了,目前假设网控器的号码为1234567,并且后台开始运行,同步运行的话需要后台程序配合,然后开始拨号:
SendAtCmd(“ATDT1234567/r”)
这里是关键,拨通后,modem返回connect 1200,然后继续接收数据,当收到0x30 0x93 0x19 0xb1时,这个是SNRM帧,然后立刻发送UA帧,即0x19,0xb1,0x30,0x73,0x19,0xb1,发出UA帧后,当收到0x30,0x19,0xa0,0x19,0xb1时,这是RR帧,表示握手完成,可以进行同步通讯了。在这个过程中,如果没有收到SNRM同步帧,应该检查RTS是否置低。
当握手成功后,需要保持同步链路,如果短时间没有数据发送,又不想切断连接,就需要发送RR帧进行握手确认,间隔时间大致为1,2秒,如果过长,网控器没有收到RR帧,就会连续发三次RR帧,如果没有应答,就自动切断连接。
接下去详细介绍下发送和接收时控制字节的设置,其中NR可以当作目前接收的数据帧流水号,NS当作目前发送的数据帧流水号,发送第一帧数据时,NR和NS都为0,当收到一帧数据时,NR加1,NS加1,如果发送第二帧,那么NR就是1,NS也为1,如果对方没有发回数据,只是返回一个确认收到的RR帧,此时RR帧的NR为1,表示收到前面的数据,那么当发送第二帧数据时,NR还是0,NS为1,由此可以推出,NS等于上一个返回的帧的NR,由此类推,NR和NS根据八进制循环。
这样数据通信的大致如此了,当需要退出连接时,根据不同的操作模式,采用不用的方法退出连接,当模式为异步时,主动要求退出连接方连续发送三个“+”,然后延时10秒左右不能发送任何数据,就断开连接,然后发送命令“ATH/r”,当收到OK时,表示完全进入指令模式,然后可以再次拨号,否则的话,再次拨号无法成功。
如果是同步模式,理论上应该发送0x19,0xb1,0x30,0x37,0x19,0xb1断开帧,然后发送“ATH/r”,进入命令模式,实际停止发送数据和RR帧3秒,就被网控器自动断开,进入命令模式。
这里说明下,每次发送帧的时候,前两个字节0x19,0xb1是modem收发的帧头,0x30是网控器接收的帧头,数据跟在后面,最后以0x19,0xb1为帧尾,一个完整的数据帧就是这样。
总的来说,HDLC的调试,主要是同步的调试比较复杂,并且需要保持链路,拨号的时间比较长,要10秒左右,并且上面只能配置成1200的速率,如果需要2400的速率,还要继续配置成V.29模式,在发送数据包的过程中,如果数据部分的第一个字节为0x60和0x7e,无法正常发送数据,这主要与ISO8583的TPDU协议有关,有兴趣的可以详细研究下。