想建一个VS2022 C++ WINDOWS GUI 的 FTDI 公司 MPSSE 程序。
Build VS2022 libMPSSE-I2C no problem.
Thank you!
Richard
想建一个VS2022 C++ WINDOWS GUI 的 FTDI 公司 MPSSE 程序。
Build VS2022 libMPSSE-I2C no problem.
Thank you!
Richard
上午好☀️☀️☀️️
本答案参考通义千问
很高兴你成功构建了 libMPSSE-I2C!这是一个非常有用的库,用于通过 FTDI 芯片(如 FT232H、FT2232H 等)实现 I²C 通信。接下来,我将为你提供一个 完整的 C++ Windows GUI 应用程序示例,使用 VS2022 编写,并集成 libMPSSE-I2C 来操作 FTDI 设备。
FTDI_I2C_GUImain.cppftdi_i2c.hftdi_i2c.h#pragma once
#include <windows.h>
#include <iostream>
#include "libMPSSE-I2C.h" // 根据你的 libMPSSE-I2C 安装路径调整
// 定义 I²C 地址
#define I2C_DEVICE_ADDRESS 0x50
// 函数声明
bool InitializeFTDI();
void CloseFTDI();
bool WriteI2C(uint8_t regAddr, uint8_t data);
bool ReadI2C(uint8_t regAddr, uint8_t* data);
main.cpp#include "ftdi_i2c.h"
#include <string>
#include <sstream>
// 全局变量
FT_HANDLE ftHandle = NULL;
// 初始化 FTDI 设备
bool InitializeFTDI() {
FT_STATUS ftStatus;
ftStatus = FT_Open(0, &ftHandle); // 打开第一个 FTDI 设备
if (ftStatus != FT_OK) {
MessageBox(NULL, "Failed to open FTDI device!", "Error", MB_OK | MB_ICONERROR);
return false;
}
// 设置 MPSSE 模式
ftStatus = FT_SetUSBParameters(ftHandle, 64, 64);
if (ftStatus != FT_OK) {
MessageBox(NULL, "Failed to set USB parameters!", "Error", MB_OK | MB_ICONERROR);
return false;
}
ftStatus = FT_SetBitMode(ftHandle, 0x00, FT_BITMODE_MPSSE);
if (ftStatus != FT_OK) {
MessageBox(NULL, "Failed to set bit mode to MPSSE!", "Error", MB_OK | MB_ICONERROR);
return false;
}
// 初始化 I²C
ftStatus = I2C_Init(ftHandle);
if (ftStatus != FT_OK) {
MessageBox(NULL, "Failed to initialize I²C!", "Error", MB_OK | MB_ICONERROR);
return false;
}
return true;
}
// 关闭 FTDI 设备
void CloseFTDI() {
if (ftHandle != NULL) {
I2C_Close(ftHandle);
FT_Close(ftHandle);
ftHandle = NULL;
}
}
// 写 I²C 数据
bool WriteI2C(uint8_t regAddr, uint8_t data) {
FT_STATUS ftStatus = I2C_Write(ftHandle, I2C_DEVICE_ADDRESS, ®Addr, 1, &data, 1);
return ftStatus == FT_OK;
}
// 读 I²C 数据
bool ReadI2C(uint8_t regAddr, uint8_t* data) {
FT_STATUS ftStatus = I2C_Read(ftHandle, I2C_DEVICE_ADDRESS, ®Addr, 1, data, 1);
return ftStatus == FT_OK;
}
IDC_WRITE_BUTTON, Text: "Write"IDC_READ_BUTTON, Text: "Read"IDC_REG_ADDR_EDIT, Text: "0x00"IDC_DATA_EDIT, Text: "0x00"IDC_RESULT_TEXT, Text: "Result: ..."在 main.cpp 中加入以下内容:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch (message) {
case WM_COMMAND:
if (LOWORD(wParam) == IDC_WRITE_BUTTON) {
char regStr[10], dataStr[10];
GetWindowText(GetDlgItem(hWnd, IDC_REG_ADDR_EDIT), regStr, sizeof(regStr));
GetWindowText(GetDlgItem(hWnd, IDC_DATA_EDIT), dataStr, sizeof(dataStr));
uint8_t regAddr = (uint8_t)strtol(regStr, NULL, 16);
uint8_t data = (uint8_t)strtol(dataStr, NULL, 16);
if (WriteI2C(regAddr, data)) {
SetWindowText(GetDlgItem(hWnd, IDC_RESULT_TEXT), "Write successful!");
} else {
SetWindowText(GetDlgItem(hWnd, IDC_RESULT_TEXT), "Write failed!");
}
} else if (LOWORD(wParam) == IDC_READ_BUTTON) {
char regStr[10];
GetWindowText(GetDlgItem(hWnd, IDC_REG_ADDR_EDIT), regStr, sizeof(regStr));
uint8_t regAddr = (uint8_t)strtol(regStr, NULL, 16);
uint8_t data = 0;
if (ReadI2C(regAddr, &data)) {
char result[20];
sprintf_s(result, "Read: 0x%02X", data);
SetWindowText(GetDlgItem(hWnd, IDC_RESULT_TEXT), result);
} else {
SetWindowText(GetDlgItem(hWnd, IDC_RESULT_TEXT), "Read failed!");
}
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow) {
// 注册窗口类
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_HREDRAW | CS_VREDRAW, WndProc, 0, 0, hInstance, NULL, NULL, NULL, NULL, L"FTDI_I2C_GUI", NULL };
RegisterClassEx(&wc);
// 创建窗口
HWND hWnd = CreateWindow(L"FTDI_I2C_GUI", L"FTDI I²C GUI", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, 400, 300, NULL, NULL, hInstance, NULL);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
// 初始化 FTDI
if (!InitializeFTDI()) {
MessageBox(hWnd, "Failed to initialize FTDI device!", "Error", MB_OK | MB_ICONERROR);
return 0;
}
// 消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
// 清理
CloseFTDI();
return (int)msg.wParam;
}
libMPSSE-I2C 头文件和库文件
.lib 文件libMPSSE-I2C 的头文件路径.lib)并链接到项目中。I2C_DEVICE_ADDRESS。如果你需要我帮你生成完整的 VS2022 项目文件(.sln, .vcxproj),或者进一步扩展功能(如支持 SPI、GPIO 等),欢迎继续提问!
祝你开发顺利!🚀