而用VC开发通信协议程序比较方便,USRP的通用驱动UHD也是用VC开发的,相比较与Simulink和Labview,在VC上开发,更具优势,更适合本项目的开发。并且Simulink和Labview都只支持USRP2,开发还不是很成熟,工具也不方便[4][5].本次验证系统采用的是USRP1,USRP1采用的是USB2.0接口,相对于USRP2以太网接口简单方便,母版上采用的是Altera的FPGA芯片,容易开发,并且价格便宜。所以,采用USRP1在Windows上用VC进行开发。

2 USRP在Windows上开发接口

UHD是由Ettus Resarch开发的,为其产品提供宿主驱动(host driver)和API.本次设计在Windows平台下,采用UHD驱动。在安装UHD驱动时,需要安装cmake,Boost,libUSB等插件,然后解压UHD源码,通过cmake交叉编译实现,可以得到UHD下面的各个项目工程。Boost和libUSB这两个库在cmake编译中都需要进行配置,否则编译过不去。这些插件主要作用就是将UHD下面的Linux源代码通过cmake等交叉编译生成Windows下面的C代码。

安装好后可以连接上USRP,通过里面的测试实例,可以看到USRP是否正确连上。正确连上会显示如下信息:图中的参数是可配置的。

然后,我们就可以调用UHD下面的一些API函数,在本次项目中主要参考的就是底层的send()和recv()。里面的程序全是通过类来实现的。在Windows平台上,USRP提供的可配参数主要如表2所示。

但是send()和recv()收发不满足DMR规定的要求,并且在进行收发转换时,时序处理不过来。为了方便上层调用,将配置分为三部分,对UHD下面的接口函数进行了重新封装,如表3所示。

在configure()里面主要是创建了一个USRP,它花时较长,需要返回一些USRP的子板和母版信息,还要导入一些映像文件,所以采用单独分开配置,在程序调用之前配置一次就可以。configure_recv()和configure_send()主要是配置一些收发的具体参数,就是上面介绍的主要参数。这样将配置分开,是为收发转换准备的,方便上层调用。Mod_send()主要负责将上层来的数据进行调制然后调用底层send()将数据发送出去,Demod_recv()主要负责调用底层recv()并将接收的数据解调返回给上层。