资源描述
上位机编程示例
精品文档
WinDriver安装与使用
1. 获取安装文件和序列号
Win32平台使用WD1020X86.EXE安装
Win64平台使用WD1021X64.EXE安装
序列号文件sn.txt
2. 安装向导,[NEXT>]
3. 许可声明,[I Agree]
4. 安装选项,[Next>]
5. 安装目录,[Install]
6. 安装…
7. Windows Vista及以上版本会弹出Windows安全提示,勾选始终信任来自”Jungo LTD”的软件,点击[安装]
8. 安装完成,[Finish]
9. 注册提示,[Register Now]
10. 输入license string,[Activate license]
11. 注册成功后Current Active Licens发生变化,点击[OK]
12. 安装成功
DRFM板驱动说明
接口说明
1. DRFM_Board_num
函数
int DRFM_Board_num();
描述
获取DRFM板数量
参数
无
返回值
板卡数量
备注
DRFM板对上位机是一个PCI设备,上位机通过两个ID号(Vendor ID & Device ID)识别PCI设备,获取板卡数量实际上是扫描指定ID号的PCI设备数量。
2. DRFM_Open
函数
bool DRFM_Open(int board_id);
描述
打开板卡
参数
board_id =板卡号
返回值
true = 成功 false = 失败
备注
对板卡进行操作前,需要打开板卡;
板卡号可根据DRFM_Board_num返回值确定取值范围,[0,板卡数量);
3. DRFM_Close
函数
int DRFM_Close(int board_id);
描述
关闭板卡
参数
board_id = 板卡号
返回值
0 = 正常 非0 = 异常
备注
对板卡操作完成后,需关闭板卡;
板卡号可根据DRFM_Board_num返回值确定取值范围,[0,板卡数量);
4. DRFM_Load_FPGA
函数
int DRFM_Load_FPGA(int board_id,char *path);
描述
加载XC6VSX315T芯片FPGA程序
参数
board_id = 板卡号
path = 加载文件
返回值
0 = 正常 非0 = 异常
备注
5. DRFM_Load_9520
函数
int DRFM_Load_9520(int board_id,char *stp_path,DWORD baseAddr);
描述
配置AD9520时钟文件
参数
board_id = 板卡号
stp_path = 时钟文件
baseAddr = 基址
返回值
0 = 正常 非0 = 异常
备注
6. DRFM_Load_9739
函数
int DRFM_Load_9739(int board_id,DWORD baseAddr);
描述
配置AD9739
参数
board_id = 板卡号
baseAddr = 基址
返回值
0 = 正常 非0 = 异常
备注
7. DRFM_Read_Memory
函数
void DRFM_Read_Memory(int board_id,int Bar,DWORD addr,DWORD *data,int length);
描述
读XC5VLX30T寄存器
参数
board_id = 板卡号
bar = BAR空间
addr = 偏移地址
data = 内存首地址
length = 长度(DWORD)
返回值
无
备注
8. DRFM_Write_Memory
函数
void DRFM_Write_Memory(int board_id,int Bar,DWORD addr,DWORD *data,int length);
描述
写XC5VLX30T寄存器
参数
board_id = 板卡号
bar = 基地址
addr = 偏移地址
data = 内存首地址
length = 长度(DWORD)
返回值
无
备注
9. DRFM_Load_ADC
函数
int DRFM_Load_ADC(int board_id);
描述
配置ADC10D1500
参数
board_id = 板卡号
返回值
0 = 正常 非0 = 异常
备注
10. DSP_Load
函数
int DSP_Load(int board_id,CString m_HPILoaderFilePath);
描述
加载DSP
参数
board_id = 板卡号
m_ HPILoaderFilePath = 加载路径
返回值
0 = 正常 非0 = 异常
备注
板卡控制流程代码
1. 准备工作
基于WinDriver实现
使用已有的DRFM板卡驱动
DeviceBase.h
drfm.h
DEVICE.lib
将以上三个文件加入工程
在对话框类中声明DRFM_BOARD类对象;
2. 初始化
在CDRFMSYSDlg::OnInitDialog中添加板卡初始化操作
RegistDevice(NULL);//注册驱动库
ConnectToDevice();//连接至板卡
int num = m_drfm.DRFM_Board_num();//获取板卡数量
CString strBoardNum;
strBoardNum.Format("检测到 %d 块 DRFM 板卡", num);//格式化字符串
PrintMessage(strBoardNum);//打印消息
3. 为控件添加变量
同样方法添加以下变量
偏移地址 m_offset
数据 m_data
4. 按钮事件响应函数
UpdateData(TRUE);//更新参数
m_drfm.DRFM_Read_Memory(0, m_space, m_offset, &m_data, 1);//读数据
//m_space为地址空间
//m_offset为偏移量
//m_data为数据
UpdateData(FALSE);//更新参数
///////////////////////////////////////////////////////////////////////////////////////////
UpdateData(TRUE);//更新参数
m_drfm.DRFM_Write_Memory(0, m_space, m_offset, &m_data, 1);//写数据
//m_space为地址空间
//m_offset为偏移量
//m_data为数据
搭建界面
1. 新建项目
2. 选择工程类型
3. MFC应用程序向导
4. 选择应用程序类型
5. 启动界面编辑窗口
6. 拖放控件
7. 为控件添加变量
8. 设置变量参数
9. 添加列和行
在CDRFMSYSDlg::OnInitDialog方法中加入以下代码
//第0列名称为X,宽度100
m_wndListCtrl1.InsertColumn(0, "X", 0, 100);
//第1列名称为Y,宽度100
m_wndListCtrl1.InsertColumn(1, "Y", 0, 100);
//设置列表的样式LVS_EX_FULLROWSELECT = 正行选取LVS_EX_GRIDLINES = 显示网格
m_wndListCtrl1.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
//定义字符串变量
CString strData;
//添加N行数据
for (int i=0; i<N; i++)
{
//格式化字符串变量
strData.Format(“%d”, i);
//添加行
m_wndListCtrl1.InsertItem(i, strData);
}
10. 同样方法为输出列表创建对象,添加列
创建对象m_wndListCtrl2
为控件添加列:时间、描述、线程
11. 更新列表信息
12. 添加自定义消息
13. 同样方法再添加一个自定义消息
消息名称:WM_USER+2
消息处理程序:OnPrintMessage
14. OnPrintData中定义列表更新方法
15. 通过PostMessage更新列表信息
16. OnPrintMessage中定义消息更新方法
17. 定义消息打印接口函数
18. 打印第一条消息
在CDRFMSYSDlg::OnInitDialog方法中加入以下代码
PrintMessage(CString("这是第一条消息"));
TeeChart控件使用说明
1. 注册TeeChart
将TeeChart8.ocx拷贝至c:\目录下;
[Win]+[R],输入cmd,[回车];
输入regsvr32 c:\teechart8.ocx,[回车]
2. 添加TeeChart控件
3. 插入ActiveX控件
4. 调整好TeeChart控件大小与位置
5. 对控件进行相关设置
双击TeeChart控件会弹出设置窗口
6. 选择绘图类型
7. 设置绘图属性
8. 为TeeChart控件添加类
9. TeeChart控件和对象关联
注释掉构造函数的初始化
10. 编写绘图代码
在CDRFMSYSDlg::OnPrintData中插入绘图功能
afx_msg LRESULT CDRFMSYSDlg::OnPrintData(WPARAM wParam, LPARAM lParam)
{
double *pData = (double*)wParam; //获取数据指针
CString strData; //定义字符串变量
for (int i=0; i<N; i++)
{
strData.Format("%lf", pData[i]); //格式化字符串
m_wndListCtrl1.SetItemText(i, 1, strData); //设置列表信息
}
long SeriesCount = m_Chart.get_SeriesCount(); //获取曲线的数量
ASSERT(SeriesCount == 1); //断言曲线数量为1
CSeries m_Series = m_Chart.Series(0); //获取第0条曲线
m_Series.Clear(); //清空曲线点
COleSafeArray XValues, YValues; //定义X轴和Y轴数据变量
DWORD rgElements[] = {N}; //定义数据长度
XValues.Create(VT_R8, 1, rgElements); //申请数据内存空间
YValues.Create(VT_R8, 1, rgElements);
for (long j=0; j<N; j++)
{
double x = (double)j;
double y = pData[j]; //赋值
XValues.PutElement(&j, &x);
YValues.PutElement(&j, &y);
}
m_Series.AddArray(N, YValues, XValues); //绘制曲线
delete[] pData; //释放内存
return 0;
}
11. 运行效果
线程创建与执行
1. 添加线程执行函数
2. 定义Process()
3. 启动工作线程
在CDRFMSYSDlg::OnInitDialog方法中加入以下代码
AfxBeginThread(Thread, this);
4. 运行效果
网络通信接口使用说明
接口说明
我们使用封装好的两个类进行网络通信的程序开发:CSocketServer和CSocketClient
将以下文件加入工程:
SocketServer.h
SocketServer.cpp
SocketClient.h
SocketClient.cpp
1. Open
2. Close
3. Send
4. Recv
编写网络流程代码
1. 声明CSocketServer对象
在头文件中声明对象
#include “SocketServer.h”
CSocketServer m_SocketServer;
在源文件中构造对象
CDRFMSYSDlg::CDRFMSYSDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CDRFMSYSDlg::IDD, pParent), m_SocketServer(6000)
端口号6000
2. 在工作线程执行函数DRFMSYSDlg::Process()中加入网络流程代码
3. 运行效果
收集于网络,如有侵权请联系管理员删除
展开阅读全文