Visual C++ 9.0DirectXWindows VistaWin32Visual Studio 2008设计/图形高级Windows XP中级开发Visual StudioWindowsC++
基于 DirectX 的精美示波器






4.56/5 (6投票s)
快速,真实,易于连接到您的应用程序。
引言
这个项目是一个简单的示波器,可以连接到任何应用程序。该软件的图形基于Direct3D,这使得场景类似于物理示波器;并且大部分工作负载由GPU执行,而不是CPU。
如果您的应用程序处理数字解调,那么这个项目非常适合您。具体来说,如果您的应用程序解调 PSK 数据,那么您可以使用这个软件示波器来查看输出数据的星座图。示波器可以显示任何速率的数据。您只需要在您的应用程序中植入一小段代码,我的可执行示波器将通过进程间通信 (IPC) 与您的应用程序进行通信。如果您不知道 IPC,请不要担心。您只需要将其复制并粘贴到您自己的代码中即可。
背景
在继续之前,我建议您下载并运行演示应用程序。这将帮助您对示波器的外观以及它如何连接到数据源(即您的应用程序)有一个基本的了解。演示应用程序包含一个数据源“Signal Generation.exe”,它生成 QPSK 数据并运行示波器以同时显示星座图。
Using the Code
我将分四个步骤解释如何使用示波器
- 在您的代码中,创建一个共享缓冲区。这将是存储星座数据和符号率的内存。您的应用程序将使用此缓冲区与我通信。将以下代码添加到您的应用程序。阅读注释以获取更多信息
- 现在,您有责任将星座数据(样本数据的 X 和 Y 分量)与符号率同步地存储在共享缓冲区中。例如,如果符号率为 2000,则必须每 0.5 秒在共享缓冲区中存储 1000 个样本。样本最好在 [-1, 1] 范围内。
pSharedBuffer->x
和pSharedBuffer->y
是循环缓冲区;也就是说,每当您到达这些缓冲区的末尾时,您必须环绕到它们的开头。示波器也以循环方式读取这些缓冲区。缓冲区长度由BUFF_SIZE
定义。结构SHARED_BUFFER
在 SharedBuffer.h 中声明。 - 运行示波器以查看星座图。将以下代码片段添加到您的代码中
- 我的示波器将初始化
pSharedBuffer->hWnd
以指向自身。所以,当您完成使用示波器后,您可以轻松关闭它
#include "..\Oscilloscope\SharedBuffer.h"
// Specify the path to SharedBuffer.h
// Global Variable
SHARED_BUFFER *pSharedBuffer = NULL;
HANDLE hMapFile = NULL;
// Global Variable
bool CreateMapFile(void)
// Call this function from inside
// the entry-point of your code. Must return true.
{
TCHAR szMapName[] = L"MyFileMappingObject";
hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // use paging file
NULL, // default security
PAGE_READWRITE, // read/write access
0, // max. object size
sizeof(SHARED_BUFFER), // buffer size
szMapName); // name of mapping object
if (!hMapFile)
{
MessageBox(NULL, L"Could not open file mapping object.",
L"Error", MB_OK | MB_ICONERROR);
return false;
}
pSharedBuffer = (SHARED_BUFFER *) MapViewOfFile(
hMapFile, // handle to mapping object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
sizeof(SHARED_BUFFER));
if (!pSharedBuffer)
{
MessageBox(NULL, L"Could not map view of file.",
L"Error", MB_OK | MB_ICONERROR);
return false;
}
return true;
}
void CloseMapFile()
// Call this function just before the exit point of your code.
{
if(pSharedBuffer)
UnmapViewOfFile(pSharedBuffer);
pSharedBuffer = NULL;
if(hMapFile)
CloseHandle(hMapFile);
hMapFile = NULL;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
ZeroMemory(&pi, sizeof(pi));
CreateProcess(L"Oscilloscope.exe", NULL, NULL, NULL, TRUE, NULL,
NULL, NULL, &si, &pi);
PostMessage(pSharedBuffer->hWnd, WM_QUIT, 0, 0);
备注
- 要使用可执行示波器,不需要额外的文件或模块。但是,如果您想自定义示波器代码,或编译并构建它,您必须安装 DirectX 9.0 SDK 并将其与 Visual Studio 集成。
- 第一个版本用于演示,可能会发生更改和改进。您的想法、建议和经验可以帮助我改进应用程序。我期待收到您的来信。
历史
- 2009 年 11 月 1 日:上传第一个版本。等待反馈。