USB总线在远程抄表系统中的应用
1 前 言
随着供水部门、供电部门、供气部门对“一户一表”工程改造的推进,以及对自动化的要求,远程自动抄表系统已成为水、电、气自动化管理和智能化控制不可缺少的组成部分。
采用集中抄表系统能够杜绝人工抄表产生的误抄、漏抄、估抄等人为错误,提高工作效率,减轻劳动强度,减员增效。一般抄表系统采用RS485总线,然后通过485/232模块与监控计算机连接,计算机通过串口轮巡采集电表数据。由于串口速度慢,这成为抄表系统传输速率提高的瓶颈,而使用485/usb模块,能很好的解决这个问题,USB 1.1规范的最高传输速率为12 Mb/s。USB总线除了用于外围设备和PC机之间的连接之外,在其它领域也有广泛应用,包括测量和自动化应用。
2 硬件设计:
模块的硬件包括: 微控制器、RS485 总线通信接口和USB 通信接口,如图1:
RS485定义了一个基于单对平衡线的多点、双向(半双工)通信链路,采用平衡式发送,差分式接收的数据收发器来驱动总线,每次通信只能有一个主站,适合轮巡方式通信。RS485收发器采用TI公司的75LBC184,它使用单电源供电,电压在+3-+5.5V范围都能正常工作,能完成TTL与RS485之间的转换。在电路中,使用了TLP521进行隔离,提高了系统的可靠性。
USB 通信接口采用PDIUSBD12,负责与上位机和微处理器进行信息交换。PDIUSBD12是PHILIPS公司推出的一种价格便宜、功能完善的USB并行接口芯片,支持多路复用、非多路复用和DMA并行传输,它遵从USB1.1协议,适合于不同用途的传输类型。PDIUSBD12需要外接微控制器来进行协议处理和数据交换,对MCU没有特殊要求,接口方便灵活。微处理器采用P89C51RD 单片机。
3 系统软件设计:
3.1 RS485软件子程序设计:
RS485软件编程非常简单,它使用处理器的串口。数据到来时存放到串口缓冲区中,并产生串口中断。
RS485协议只是物理层,上层协议需要用户自己定义。 由于介绍RS485总线的文章很多,其他程序略。
3.2 USB软件设计:
USB设备与主机通过四根线连接,电源、地,以及两根数据线,该模块使用计算机提供的5v电源。连接速度由D+ , D-连线上的电阻位置决定的, 如果D+ 线上有上拉电阻, USB 设备为全速设备,如果D-连线上有上拉电阻, 则USB 设备为低速设备。PDIUSBD12 的softconnect 技术在片内集成了1.5k的上拉电阻, 可以通过微处理器发送命令来控制D+上的上拉电阻是否与电源连接。
在usb设备中,我们使用描述符区别不同的设备、端口等。描述符主要包括设备描述符、配置描述符、接口描述符,在设备中预先设置这些参数,主机通过对这些描述符的读取,获得该设备的信息。
当一个设备刚插入计算机时,主机需要对该设备枚举,读取该设备的相关参数,首先使用默认的设备地址0进行通信。主机端先向设备地址0,端点0发送Get_Descriptor(获取描述符)请求来查询接入什么样的设备,设备使用设备描述符回答,然后通过发送Set_Address(设定地址)请求来分配一个单独的地址给设备。设备读取这个请求,返回一个确认且保存新的地址。主机给新地址发送一个Get_Descriptor请求来读取这个设备完整的描述符,包括端点最大包的大小,设备支持的配置号,以及该设备的其它信息,主机将这些信息用于往后的通信中。而后发出Get_configuration_Descriptor(获取配置描述符)命令,用来获取设备的节点和端点的配置信息。而后发出(Set_configuration)设定配置请求,以该配置号配置设备。设备就完全正确处于可操作状态,完成了枚举过程,便可以通过端点进行数据传输了。
以下是主设备读取从设备描述符的过程
主机发起的setup包,使用默认的地址0,端点0。其中SYNC字段为同步序列数据域,固定为01H,紧接着为标识符数据域PID字段,用来表示数据封装包的类型,可分为令牌、数据、握手或特殊四种封装包类型。其中令牌封装包细分为OUT,IN,SETUP,SOF四种封装格式。随后为地址数据域ADDR字段,用来寻址高达127个外围设备,每个设备只有对应唯一的地址,ENDP字段为端点数据域,最多可寻址32个端点,它仅在IN,OUT,SETUP令牌封装包中,最后为CRC校验和。
主机发送数据,其中数据域中的数据80表示设备标准请求,06描述符命令(get_descriptor)00 01 代表请求设备的描述符,00 00为语言类型,40 00,指出期望从设备返回的数据个数,如果描述符的个数大于指定的字节个数,则按照指定个数返回,如果描述符小于指定的字节数,返回实际的字节个数。
该帧为设备收到数据后的确认帧
该帧为向设备发送数据请求。
12为描述符长度,01为设备类型,10 01 为usb版本号,bcd码,这里是usb1.1,00 为设备类型码,00为子类设备代码,00为USB分配的设备协议代码,10为端点0最大包的大小,d8,0d为厂商编号,01 c0为产品编号,04 01为设备出厂编号,01为厂商字符串索引,02 为产品字符串索引,00为序列号,01为设置编号。
在主程序中完成对系统、PDIUSBD12的初始化,以及完成对d12的枚举,将数据的发送接收都放在中断程序中。PDIUSBD12有3组端点,使用默认端点0和端点2。将端点2作为数据传输的通道,当PDIUSBD12从USB收到一个数据包时,就对CPU产生一个外部中断请求,CPU立即相应中断,在中断服务子程序中,将数据包从PDIUSBD12内部缓冲区移到循环数据缓冲区中,随后清零PDIUSBD12的内部缓冲区,对数据校验,如果接收得数据正确,直接调用RS485数据发送子程序,将数据发送到RS485网络。
3.3 计算机软件设计:
计算机软件主要包括,驱动的设计,动态连接库的设计。驱动程序采用飞利浦提供的驱动,上位机程序使用api函数并封装RS485总线的上层协议,提供给用户使用的接口。本例采用VC编写用户程序和动态连接库。从驱动中读数据的程序如下,
void readdata(unsigned char *rec)
{ unsigned char outbuf[105];
HANDLE hFile, hDevice=0;
BOOL bResult;
ULONG nBytes = 25;
hFile = open_file("PIPE02");
if(hFile == INVALID_HANDLE_VALUE)
{return;}
hDevice = open_dev();
bResult = ReadFile(hFile,outbuf,10,&nBytes,NULL);
if(bResult==FALSE)
{ DeviceIoControl(hFile,IOCTL_D12_RESET_PIPE,0,0,0,0,&nBytes,NULL); }
CloseHandle(hFile);
CloseHandle(hDevice);
}
在使用这个函数的时候,只需要添加如下说明。
extern "C" DllImport void readdata ( unsigned char * );
4 结 论
由于采用了USB总线,克服了原来使用RS232接口速度慢的瓶颈,提高了远程抄表系统的数据传输速率,该方案已经成功的得到应用,稳定可靠,有广阔的应用前景。
评论
查看更多