家校通网络控制器的通信技术
作者:魏 紫 杨庆江 张广璐
来源:《现代电子技术》2008年第01
        要:针对家校通网络控制器的功能需求,提出一种串口与网络结合的通信技术。首先描述了网络控制器的硬件平台和基于TCP/IP协议之上的应用层协议,然后着重讨论了网络通信技术和串口通信技术,在通信过程中,采用主从应答方式以提高数据传输的有效性,减少数据冲突现象的发生,最后通过现场测试到的数据对该通信技术的可行性与稳定性进行说明与分析。
         
        关键词:网络控制器;通信协议;Rabbit2000单片机;套接字;串口通信 
        中图分类号:TN91 文献标识码:B
        文章编号:1004373X(2008)0105403 
        Communication Technology of Jia-xiao-tong Network Controller
         
        WEI Zi,YANG Qingjiang,ZHANG Guanglu 
        (Heilongjiang Institute of Science and Technology,Harbin,150027,China)
         
socket通信报文格式        AbstractFor the function demand of the network controller in Jia-xiao-tong system,the paper proposes a communication technology of combining serial-port with network.Firstly,it describes the network controller′s hardware platform and the application-layer protocol based on TCP/IP protocol stack.Then,it mainly discusses the communication network technology and the communication serial technology.The polling scheme is applied to improve data transfer effectiveness and reduce data collision.Finally,it explains and analyzes the communication technology′s feasibility and stability through filed test data.
         
        Keywordsnetwork controllercommunication protocolRabbit2000 single chipsocketserial communication
         
        1  
        随着TCP/IP等网络通信的出现,将串口通信与网络通信相结合的趋势越来越明显,这是保护使用者既往投资和整体利益的一种有效办法。本文所讨论的通信技术就是将串口与网络通信相结合并在实际应用中取得良好效果的一种通信解决方案。 
        “家校通是利用现代信息技术实现家庭与学校实时沟通的教育网络平台,其组成部分为:家校互联卡、读卡器、无线网关、网络控制器、短信发射接收机。网络控制器的主要功能是通过无线网关从读卡器获取信息,并与互联网服务平台进行网络通信,是家校通系统的核心。 
        2 网络控制器的硬件平台 
        根据网络控制器的功能要求,考虑整体的性能、价格方面,CPU采用Rabbit2000单片机,他是Z-World公司特别为中小型控制器而设计的高性能8位微处理器。编译环境为Dynamic C,提供SocketTCP/IP编程。网络控制器的硬件结构如图1所示。 
        3 应用层通信协议 
        3.1 网络控制器与读卡器的串口通信协议 
        网络控制器与读卡器的通信主要通过异步串行RS 485接口,基于通用串行通信RS 485数据传输单元(字节格式)有不带校验位的10 b和带奇偶校验位的11 b两种数据格式。为了提高数据传送的效率和可靠性,采用无奇偶校验位的10 b数据格式,并由BBC校验生成校验码与数据一起发送。 
        开始标志读卡器地址信息长度命令和参数校验
        2 B1 B2 B14 B1 B
        3)命令字: 
        A1:从读卡器读取一条记录。 
        A2:控制器正确接收记录信息后,返回更新记录的读地址命令,使地址指针指向下一条记录。 
        A4:设置校正读卡器时间。 
        A6:测试控制器与读卡是否正常通信。 
        3.2 网络控制器与服务平台的网络通信协议 
        网络协议通常分不同的层次进行开发,每一层分别负责不同的通信功能。TCP/IP通常是一个4层协议,包括数据链路层、网络层(含IP协议)、传输层(含TCP协议)和应用层。本网络协议就是基于TCP/IP协议之上的应用层协议,采用请求应答的通信模式。考虑到协议的可靠性和实现的方便性,数据采用ASCII码表示。 
        1)报文组成 
        4 通信技术 
        控制器建立socket连接后,向服务器发送连接请求和数据传输,并实时判断连接的有效性,在有效连接的状态下,实现控制器、服务器、读卡器三者的正常通讯,程序流程如图2所示。 
        4.1 网络通信技术的实现 
        socket初始化: 首先要对RTL8019AS的控制寄存器进行初始化配置,Dynamic C已将这部分配置封装成函数放入REALTEK.LIB库中,应用时只需调用相关函数。之后再调用函数库dcrtcp.lib中的几个简单函数可完成socket的初始化,以下是程序的主体框架。
         
        #define TCPCONFIG1 
        #memmapxmem 
        #usedcrtcp.lib 
        main() 
        { 
        sock[CD#*2]init( ); 
        while(ifpending(IF[CD#*2]DEFAULT)==IP[CD#*2]COMING[CD#*2]UP) 
        tcp[CD#*2]tick(NULL); 
        tcp[CD#*2]open(&socket,0,destIP,sockport,null); 
        …… …… 
        }
         
        在建立TCP的连接中,Dynamic C有两种方法打开TCP socket:一种是被动的方式,调用函数tcp[CD#*2]listen(),等待客户端进行连接;一种是主动的方式,调用函数tcp[CD#*2]open(),根据相应的参数(IP地址和端口号)主动连接到服务器端。本通信技术采用的就是主动方式(作为客户端)。 
        Socket数据的发送与接收:数据发送调用sock[CD#*2]write(&socket,str[CD#*2]send,str[CD#*2]send[CD#*2]len)。在读取socket缓冲区数时,先判断缓冲区中是否有数据,有数据再进行读操用,同时有超时设置。
         
        start[CD#*2]time=SEC[CD#*2]TIMER 
        /*SEC[CD#*2]TIMER为秒级系统时间*/ 
        end[CD#*2]time=start[CD#*2]time 
        while((end[CD#*2]time
        !recv[CD#*2]count)/*READ[CD#*2]TIME为设定的等待时间*/ 
        { 
        str[CD#*2]recvbuf[CD#*2]len=sock[CD#*2]bytesready(&socket) 
        /*判断socket读缓冲区是否有数据*/ 
        if(str[CD#*2]recvbuf[CD#*2]len>0) 
        recv[CD#*2]count=sock[CD#*2]read(&socket,str[CD#*2]recvbuf, 
        str[CD#*2]recvbuf[CD#*2]len) /*socket*/ 
        } 
        if(revc[CD#*2]count) 
        {…… ……} 
        /*拆分接收到的命令字,读取有效信息*/ 
        else 
        break;
        4.2 串口通信技术的实现 
        主要包含3个步骤:命令字的组合,设置串口D,通过设置Rabbit2000PE3来控制数据的发送与接收。以A6命令为例,程序主体框架如下:
         
        command[0]=0xA6;/*A6命令*/ 
        create[CD#*2]command(addr,command,pack); 
        /*组合命令字*/ 
        serDopen(9600);/*9600为波特率*/ 
        send[CD#*2]command(command,returnlen);/*发送数据*/ 
        read[CD#*2]command(readbuf,sizeof(readbuf),10); 
        /*接收数据*/ 
        void send[CD#*2]command(char *pack,int len) 
        { 
        int i; 
        WrPortI(PEDR,& PEDRShadow,0x08); 
        WrPortI(PEB3R,NULL,0); 
        for(i=0;i
        serDputc(pack[i]); 

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。