HackRF动态库调用
项目创建
程序编写
动态加载程序编写(runtime)
修改项目属性:
快捷键Alt+F7
新建”HackRF.h”
加入 HackRF动态库中一些相关定义
#ifndef __HACKRF_H__ #define __HACKRF_H__ #include "stdint.h" enum hackrf_error { HACKRF_SUCCESS = 0, HACKRF_TRUE = 1, HACKRF_ERROR_INVALID_PARAM = -2, HACKRF_ERROR_NOT_FOUND = -5, HACKRF_ERROR_BUSY = -6, HACKRF_ERROR_NO_MEM = -11, HACKRF_ERROR_LIBUSB = -1000, HACKRF_ERROR_THREAD = -1001, HACKRF_ERROR_STREAMING_THREAD_ERR = -1002, HACKRF_ERROR_STREAMING_STOPPED = -1003, HACKRF_ERROR_STREAMING_EXIT_CALLED = -1004, HACKRF_ERROR_OTHER = -9999, }; enum hackrf_board_id { BOARD_ID_JELLYBEAN = 0, BOARD_ID_JAWBREAKER = 1, BOARD_ID_HACKRF_ONE = 2, BOARD_ID_INVALID = 0xFF, }; enum rf_path_filter { RF_PATH_FILTER_BYPASS = 0, RF_PATH_FILTER_LOW_PASS = 1, RF_PATH_FILTER_HIGH_PASS = 2, }; typedef struct hackrf_device hackrf_device ; typedef struct { hackrf_device* device; uint8_t* buffer; int buffer_length; int valid_length; void* rx_ctx; void* tx_ctx; } hackrf_transfer; typedef struct { uint32_t part_id[2]; uint32_t serial_no[4]; } read_partid_serialno_t; #endif
在main函数中动态加载 以 hackrf_init hackrf_open为例
#include "stdafx.h" #include "hackrf.h" #include "windows.h" #define NEWCALLBACK __cdecl typedef int (NEWCALLBACK *PROHackrf_init )();//typedef 返回值类型 (CALLBACK *类型名)(参数1,参数2,...) PROHackrf_init hackrf_init; typedef int (NEWCALLBACK *PROHackrf_open)(hackrf_device** device) PROHackrf_open hackrf_open; HINSTANCE hHACKRFDLL; void init() { hackrf_device* device = NULL; hHACKRFDLL = LoadLibrary( _T( "hackrf.dll")); hackrf_init = ( PROHackrf_init)GetProcAddress(hHACKRFDLL,"hackrf_init" ); hackrf_open = ( PROHackrf_open )GetProcAddress(hHACKRFDLL,"hackrf_open " ); } void Free() { FreeLibrary(hHACKRFDLL); } int _tmain (int argc , _TCHAR * argv []) { init(); int result = hackrf_init(); if( result != HACKRF_SUCCESS ) return 1; result = hackrf_open(&device); if( result != HACKRF_SUCCESS ) return 1; Free(); return 0; }
将libusb-1.0.dll pthreadVSE2.dll hackrf.dll拷贝到项目目录下编译运行
隐式链接(loadtime)
将libgetopt_static.lib(非必须);libusb-1.0.lib;pthreadVSE2.lib;hackrf.lib填入
将libgetopt_static.lib(非必须);libusb-1.0.lib;pthreadVSE2.lib;hackrf.lib libusb-1.0.dll pthreadVSE2.dll hackrf.dll hackrf.h getopt.h(非必须)拷贝到项目目录下
修改main函数
#include "stdafx.h" #include "hackrf.h" #include "windows.h" int _tmain (int argc , _TCHAR * argv []) { hackrf_device* device = NULL; int result = hackrf_init(); if( result != HACKRF_SUCCESS )return 1; result = hackrf_open(&device); if( result != HACKRF_SUCCESS )return 1; return 0; }
附录:
hackrf函数:
int hackrf_init(); int hackrf_exit(); int hackrf_open(hackrf_device** device); int hackrf_close(hackrf_device* device); int hackrf_start_rx(hackrf_device* device, hackrf_sample_block_cb_fn callback, void * rx_ctx); int hackrf_stop_rx(hackrf_device* device); int hackrf_start_tx(hackrf_device* device, hackrf_sample_block_cb_fn callback, void * tx_ctx); int hackrf_stop_tx(hackrf_device* device); /* return HACKRF_TRUE if success */ int hackrf_is_streaming(hackrf_device* device); int hackrf_max2837_read(hackrf_device* device, uint8_t register_number, uint16_t* value); int hackrf_max2837_write(hackrf_device* device, uint8_t register_number, uint16_t value); int hackrf_si5351c_read(hackrf_device* device, uint16_t register_number, uint16_t* value); int hackrf_si5351c_write(hackrf_device* device, uint16_t register_number, uint16_t value); int hackrf_set_baseband_filter_bandwidth(hackrf_device* device, const uint32_t bandwidth_hz); int hackrf_rffc5071_read(hackrf_device* device, uint8_t register_number, uint16_t* value); int hackrf_rffc5071_write(hackrf_device* device, uint8_t register_number, uint16_t value); int hackrf_spiflash_erase(hackrf_device* device); int hackrf_spiflash_write(hackrf_device* device, const uint32_t address, const uint16_t length, unsigned char * const data); int hackrf_spiflash_read(hackrf_device* device, const uint32_t address, const uint16_t length, unsigned char * data); /* device will need to be reset after hackrf_cpld_write */ int hackrf_cpld_write(hackrf_device* device,unsigned char* const data, const unsigned int total_length); int hackrf_board_id_read(hackrf_device* device, uint8_t* value); int hackrf_version_string_read(hackrf_device* device, char* version, uint8_t length); int hackrf_set_freq(hackrf_device* device, const uint64_t freq_hz); int hackrf_set_freq_explicit(hackrf_device* device,const uint64_t if_freq_hz, const uint64_t lo_freq_hz,const enum rf_path_filter path); /* currently 8-20Mhz - either as a fraction, i.e. freq 20000000hz divider 2 -> 10Mhz or as plain old 10000000hz (double)preferred rates are 8, 10, 12.5, 16, 20Mhz due to less jitter */ int hackrf_set_sample_rate_manual(hackrf_device* device, const uint32_t freq_hz, const uint32_t divider); int hackrf_set_sample_rate(hackrf_device* device, const double freq_hz); /* external amp, bool on/off */ int hackrf_set_amp_enable(hackrf_device* device, const uint8_t value); int hackrf_board_partid_serialno_read(hackrf_device* device, read_partid_serialno_t* read_partid_serialno); /* range 0-40 step 8db */ int hackrf_set_lna_gain(hackrf_device* device, uint32_t value); /* range 0-62 step 2db */ int hackrf_set_vga_gain(hackrf_device* device, uint32_t value); /* range 0-47 step 1db */ int hackrf_set_txvga_gain(hackrf_device* device, uint32_t value); /* antenna port power control */ int hackrf_set_antenna_enable(hackrf_device* device, const uint8_t value); const char * hackrf_error_name(enum hackrf_error errcode); const char * hackrf_board_id_name(enum hackrf_board_id board_id); const char * hackrf_filter_path_name(const enum rf_path_filter path); /* Compute nearest freq for bw filter (manual filter) */ uint32_t hackrf_compute_baseband_filter_bw_round_down_lt(const uint32_t bandwidth_hz); /* Compute best default value depending on sample rate (auto filter) */ uint32_t hackrf_compute_baseband_filter_bw(const uint32_t bandwidth_hz);
例子
链接:http://pan.baidu.com/s/1mgqPpK8 密码:uhci