单片机实现串口协议的网络化

发布者:平章大人最新更新时间:2011-10-24 关键字:单片机  串口协议 手机看文章 扫描二维码
随时随地手机看文章

  本文深入研究了使用单片机控制网卡,接入以太网Ethernet,即IEEE802.3协议网络,实现串口仪器的网络化。

  1 硬件结构和电路设计

  1.1 总体设计

  整个系统设计采用ATMEL公司8位通用微控制器AT89C51作为主处理器,驱动REALTEK公司的10M以太网控制芯片RTL8019AS,实现串口数据和外部网络互连。

  1.2 网卡接线设计

  RTL8019AS为100管脚PQFP封装,工作电压5V。其接线原理图如图1所示。地址SA0-4接到单片机P2的低五位上;SA8和SA9接电源;其余SA5-7,SA10-19这13个管脚全部接地;IORB和IOWB分别接单片机的读写信号端;RSTDRV接到P1.2上;8位数据SD0-7按顺序接到单片机P0.020.7脚;TPOUT+和PTOUT-是发送管脚对,连接到RJ45口的发送脚1和2;而TPIN+和TPIN-则是接收管脚对,连接到RJ45口的接收脚3和6;管脚X1和X2之间接20M的晶振及接地电容;LED0和LED1分别串接发光二极管和1k8电阻,连到5V电源上;IOCS16B管脚串接27k8电阻接地;管脚BD0-3(IOS0-3)是负责定义基地址位置的,全部悬空,作为0输入。

  LED0默认表示通信冲突COL,LED1表示接收数据包。发送对和接收对不能直接接到RJ45插头上,要通过隔离电压模块(选用20F-01)和RJ45相连。网卡有16bit数据线,可以使用16bit或8bit模式传送数据,使IOCS16B管脚为低,我们选中的是8bit模式。

  1.3 串行接口部分

  1串口部分采用MAX232和9针串口。单片机P3.0/RXD0和P3.0/RXD0通过MAX232芯片分别接到串口的2针和3针上。串口5针接地。

  串行口选择工作方式1,这时的波特率计算公式为:

  串口在9600波特率时,晶振选用11.0592M,预设值算得0xFD,smod=0;晶振选用16MHz,预设值为0xF7,smod=1。

  2 网卡的初始化和工作过程

  2.1 网卡芯片RTL8019AS的控制方法

  控制网卡芯片RTL8019AS是通过读写芯片上的32个字节的控制寄存器组实现的。另外该芯片含有16kbyte的RAM,地址为0x400020x7fff。这些RAM不能通过单片机直接寻址,必须通过32个字节的控制寄存器组,以DMA方式读写它们。

  32个字节的控制寄存器组可以由单片机直接寻址,但其基地址是通过管脚BD0-3(IOS0-3)配置的。电路中将四个管脚全部悬空,全0输入,产品资料说明其基地址为300H。

  这32个字节的控制寄存器组分成4页,00H寄存器称为CommandRegister(CR),CR的最高两位代表目前寄存器处于哪一页。01H到0FH在不同的页有不同的意义,同时,即使同一页,读和写代表的意义也可能不同,这一点很值得注意。10H217H是远程DMA端口,而18H-1FH是网卡复位端口。[page]

 网卡RAM区如图2所示,我们设置PSTART和PSTOP,就决定了接收区域在46和7F之间,剩下6页作为发送缓冲区,可以满足一次发送容量为1514byte的最大以太网数据包的要求。CURR初始值设为47,BNRY初始值设为46。当收到新的数据包时(例如3页),网卡将它们依次放到47、48和49页,CURR自动指向4A页。当我们读完这3页的数据包后,要将BNRY改为49,以通知网卡数据包已经读完了。

 

[page]

 

  网卡芯片接收到以太网数据包后,存在CURR指向的页面中。一个数据包可以占据一页,也可以占据多页。在接收包的包头里,保存有该包的信息。包头格式如表1:

  读完这个包头,我们就能知道本包的接收状态,包长度,以及下一个包的位置。在接收循环中,检查中断状态寄存器ISR状态,发现有新包来,先读取包头信息,接着按照包头指示读取全包,然后改写BNRY,再接着读下一个包,这样循环,直到达到CURR位置。注意,一个包有可能占据接收缓冲区的首、尾页面,此时须小心读取。

  发送数据包比较简单,将准备好的数据用DMA传到发送缓冲区,然后设置发送长度到TBCR1和TBCR0中,再设置传输开始页面,即令TPSR=0x40,最后,使CR=0x26,就开始传送了。

  传送完成后要清掉中断状态寄存器ISR的发送完成标志。值得注意的是,发送包的包长度不能小于以太网规定的60byte,否则网卡不会将其发出。

  3 TCP/IP协议在单片机上的软件设计

  3.1 TCPIP协议栈和链路层格式

  Internet上使用的是TCP/IP协议簇,由下至上包含四层:数据链路层、网络层(IP)、传输层(TCP)和应用层。我们在单片机上能实现的是数据链路层的功能,上层协议鉴于单片机有限的资源,只能实现部分功能。TCP/IP协议栈如表2:

  数据链路层处于协议栈的最低层,传输以太网的物理传输帧,其帧格式如表3:

  数据链路层是所有TCP/IP包的基础,所有它上层的包都被封装到链路层帧的数据段中。链路层就是MAC对MAC的通信。

  3.2 PING命令在单片机上的实现

  PING是网络层(IP层)的命令,网络层就是IP对IP之间的通信。主机对一个目标IP地址发出状态请求,后者发出回应,这样,就可以用来检查两者之间的线路是否畅通。这里涉及到两个网络层协议:

  ARP和ICMP。首先,网络中要知道目标IP的MAC地址,才能发送数据。为了获取该地址,我们向整个网络发送一个ARP广播包,询问该IP对应的MAC地址,然后目标IP应答,我们就从应答信息中得到MAC地址。其次,发送一个ICMP包,请求目标IP状态,目标IP回应,就完成网络连接测试。在我们的实验中,发出PING命令的是网络中的PC主机,接收信号并产生响应的是我们的单片机系统。我们假定单片机系统控制的网卡的IP为192.168.0.176。[page]

  第一步,实现ARP协议。ARP协议是"AddressResolutionProtocol"(地址解析协议)的缩写,它的作用是将IP地址转换成物理地址(就是常说的MAC地址)。协议ARP的分组格式如表4:

  当单片机主处理器处理网卡收到的ARP广播请求时,如果发现是请求“192.168.0.176”的MAC地址,于是按要求打一个ARP应答包,将自己的MAC地址放到应答包中,发送回网络就完成了PING的第一步。注意,要在应答包尾加18byte的补丁,否则应答包长度不满足最小60byte的要求。

  第二步,实现ICMP协议。ICMP是“InternetControlMessageProtocol”(Internet控制消息协议)的缩写。用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。

  ICMP是封装在IP协议中,所以有IP包头。

  ICMP协议结构如表5:

  网络主机在收到ARP的应答包后,取出其中的MAC地址,然后向该MAC发出ICMP请求。主处理器处理该请求时,将请求包的标识和序列号对应填入ICMP应答包,其它部分按要求填写。校验和的计算有成熟的公式,容易计算,只要先把校验和部分置0,将包头的计算结果再填入校验和就可以了。

  最后将该ICMP应答包送入网络,这样就完成了PING的全过程。此时,发出PING命令的网络主机就会得到“Replyfrom192.168.0.176:bytes=32time<10msTTL=128”的信息。

  4 串行数据与网络的数据交换的讨论

  网络层之上,有两种传输层协议:TCP(Trans2missionControlProtocol)和UDP(UserDatagramProtocol)。对于数据传输要求高的场合,需要使用TCP协议作为双方通信方式,但此种方式较为复杂。而对于一些实时信号及其反向控制信号的传递,实现UDP协议就可以满足要求了。表6是UDP协议结构:

  当原始数据从串口送到到主处理器后,主处理器将其打包成UDP报文,发送到网络中。网络端监控主机接收并处理该UDP报文,然后将控制信息同样以UDP报文发出。主处理器把网络控制信号返回给串口。这样,我们在Internet中就可以方便地完成对现场串口数据源的监视和控制过程。

  5 结语

  因为单片机对于各种电器设备有良好的接入和控制能力,所以,我们实现了单片机的网络接入功能后,就在电器的硬件设备和网络之间建起了一道桥梁。通过它,可以实现对各种实时信号、仪器仪表、家用设施等目标的远程监视,在宏观上对各种设备统一管理,实现人与系统的和谐的交互。这必将大大提高工作效率,改善工作环境,提升人们的生产、生活水平。

 

 

 

 

关键字:单片机  串口协议 引用地址:单片机实现串口协议的网络化

上一篇:单片机实现开关电源的设计
下一篇:基于Atmega16单片机的重物提升控制系统设计

推荐阅读最新更新时间:2024-03-16 12:44

51单片机MAX7219程序编写与测试
#include“reg52.h” #include “intrins.h” #define by te unsigned char //#define N_NOP _nop_();//_nop_();_nop_(); /////////////////////////////////////////////////////// //MAX7219 //////////////////////////////////////////////////////////////////// //管脚,变量和常数定义;DEFINE #define Model_addr 0x09 // X9 H #define Bright_addr
[单片机]
51<font color='red'>单片机</font>MAX7219程序编写与测试
利用89C51单片机的P1口控制8个发光二极管LED编程
利用89C51的P1口控制8个发光二极管LED。相邻的4个LED为一组,使2组每隔0。5S 交替发亮一次,周尔复始。试编写程序。 解: ORG 0100H MOV A,#0FH ABC: MOV P1,A ACALL D05 SWAP A SJMP ABC D05:MOV R6,250 DY: MOV R7,250 DAY:NOP NOP DJNZ R6,DAY DJNZ R7,DAY RET END
[单片机]
51单片机入门之1602液晶显示
本部分主要介绍1602液晶显示,显示内容为“Hello,Welcome to my site,my friends.”。 原理图如下: 程序如下: #include #define uchar unsigned char #define uint unsigned int sbit RS=P3^0; //数据/命令选择端(H/L) sbit EN=P3^2; //使能端 sbit RW=P3^1; //读/写选择端(H/L),本文章只写,所以该端口供低电平 sbit wela=P3^3;//锁存器位选信号 uchar table1 = Hello,Welcome to my ;//字符表1 uchar table2 =
[单片机]
51<font color='red'>单片机</font>入门之1602液晶显示
基于MCU的多机并行通信
摘要:单片机的多机串行通信应用十分广泛,但在串行口被占用又要进行多机通信时就要采取其它措施。本文介绍了一种使用并口进行多机通信的方法,在实践中已得到验证。 关键词:MCU,并口通信 1. 问题的提出 某系统中使用了三路串行接口的传感器(GPS、压力和风向)及三路模拟电流(4~20mA)接口的传感器(湿度、温度和水位)。现需要将这些数据汇总后通过串口上传给PC机,并且要求每路信号数据都能够实时独立的接收。 2.系统设计 经过分析,我们分别使用一块2051单片机接收各路串口传感器的数据,同时使用一块多路高精度ADC对转换成电压的温度等信号采样,系统结构图如图1所示。主从机之间的具体管脚连接参见图2。
[单片机]
单片机多机通信的研究
单片机构成的多机通信系统中常采用总线型主从式结构。在多个单片机组成的系统中,只允许存在一个主机,其他的就是从机,从机要服从主机的控制,这就是总线型主从式结构。 当51单片机进行多机通信时,串口要工作在方式2和方式3。假设当前多机通信系统有1个主机和3个从机,从机地址分别是00H、01H、02H。如果距离很近它们直接可以以TTL电平通信,一旦距离较远的时候,常采用RS-485串行标准总线进行数据传输。 为了区分是数据信息还是地址信息,主机用第九位数据TB8作为地址/数据的识别位,地址帧的TB8=1,数据帧的TB8=0。各从机的SM2必须置1。 在主机与某一从机通信前,先将该从机的地址发送给各从机。由于各从机SM2=1,接收
[单片机]
<font color='red'>单片机</font>多机通信的研究
51单片机烧写详细全部过程
软件:Easy 51Pro v2.0; 工具: 1.5V电源; 2.Easy ISP下载线(制作过程参见《自制Easy ISP下载线》一文; 3.51单片机最小实验板(带光柱),制作过程参见《自制51单片机最小系统板》一文; 4..Hex文件,生成过程参见《Keil Uv2.0生成51单片机的Hex 文件详细过程》一文 ; 准备工作: 1.确定Easy ISP下载线并口已连接上计算机,ISP接口与实验板相接; 2.确定5V电源连接实验板(技巧:查看电源指示灯是否亮,接通则亮,否则不亮); 步骤: 1.首先打开Easy 51Pro应用程序; 2.选择单片机型号“AT89S51”,并观察软件右边“状态”信息;
[单片机]
51<font color='red'>单片机</font>烧写详细全部过程
Ubuntu上AVR单片机开发环境设置
操作系统:ubuntu 13.04(32 bits) AVR单片机:ATmega644pa 首先要明确,我们在Ubuntu(或者Linux)上开发AVR单片机应包括两大部分: 程序编译、程序下载。 环境布置: 程序编译使用Linux下的编译器 avr-gcc,通过以下指令安装: sudo apt-get install gcc-avr #这是avr的交叉编译器 sudo apt-get install avr-libc #这是编译要用的库 另外还有一个工具,目前感觉没什么用,先记下来 sudo apt-get install gdb-avr #gdb反向调试工具,反汇编 程序的下载使用avrdud
[单片机]
HC705单片机的LED驱动技术
    本文介绍了使用MC68HC705J1A大电流引脚,不使用外部晶体管放大电路,直接驱动LED的的方法。文中所提出的计算公式对不同的单片机(MCU)(低电平电流IOL 不同)都适用。只是公式中的最大低电平电流要改变。     正常的HCOMS I/O引脚具有足够的电流来驱动HCMOS或TTL电路的输入。这些引脚通常在输出低电平0.4V时能够吸入1.6mA的电流。但是在许多应用场合,当1个CMOS输出引脚用于驱动较大电流的设备时,就显得力不从心了。例如LED(发光二极管)、前级运算放大器等,大约需要10mA电流。通常的做法是再加驱动电路,如:用三极管的放大电路驱动或用其他如75452等驱动能力大的集成电路来驱动。   
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved