VC编程之VC++USB及串口通信程序
小标 2018-08-14 来源 : 阅读 1356 评论 0

摘要:本文主要向大家介绍了VC编程之VC++USB及串口通信程序,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

本文主要向大家介绍了VC编程之VC++USB及串口通信程序,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

为公司开发产品测试程序,实际上是基于VC++的USB通信及串口通信。当初编写程序时,网上找了很多资料及程序,感觉大都只是说了一点点,没有一个完整的工程以供其他开发者借鉴,完全要靠开发者东拼西凑,最后凑成一个整体工程,还要在这个工程基础上进行相当艰苦的排查问题、解决问题的调试过程。本人对这一过程极其厌烦,现将走完的以上的“艰苦历程”之后的成果列出,以供后来者借鉴。
这一工程中包含了以下知识点:
1. VC++ USB通信;
2. VC++串口通信;
3. 文件(设备)同步异步操作;
4. 动态改变自体颜色
// VRGate_Product_TestDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "VRGate_Product_Test.h"
#include "VRGate_Product_TestDlg.h"
#include "afxdialogex.h"
#include "setupapi.h"
extern "C" {
#include "hidsdi.h"
}
#pragma comment( lib, "setupapi.lib" )
#pragma comment( lib, "hid.lib" )
#ifdef _DEBUG
#define new DEBUG_NEW
#endif

BOOL Read8250RegFlag = FALSE;
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
// 对话框数据
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()

// CVRGate_Product_TestDlg 对话框

CVRGate_Product_TestDlg::CVRGate_Product_TestDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CVRGate_Product_TestDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
devicePathName = _T("");
InputReportLength = 0;
OutputReportLength = 0;
}
void CVRGate_Product_TestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CVRGate_Product_TestDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_FIND, &CVRGate_Product_TestDlg::OnBnClickedFind)
//ON_BN_CLICKED(IDOK, &CVRGate_Product_TestDlg::OnBnClickedOk)
ON_BN_CLICKED(IDC_OPEN, &CVRGate_Product_TestDlg::OnBnClickedOpen)
ON_BN_CLICKED(IDC_CLOSE, &CVRGate_Product_TestDlg::OnBnClickedClose)
ON_BN_CLICKED(IDC_OPEN2, &CVRGate_Product_TestDlg::OnBnClickedOpen2)
ON_BN_CLICKED(IDC_CLOSE2, &CVRGate_Product_TestDlg::OnBnClickedClose2)
ON_BN_CLICKED(IDC_ENTER_DEBUG_MODE, &CVRGate_Product_TestDlg::OnBnClickedEnterDebugMode)
ON_BN_CLICKED(IDC_EXIT_DEBUG_MODE, &CVRGate_Product_TestDlg::OnBnClickedExitDebugMode)
ON_BN_CLICKED(IDC_GET_PROTOCOL_VERSION, &CVRGate_Product_TestDlg::OnBnClickedGetProtocolVersion)
ON_BN_CLICKED(IDC_GET_HARDWARE_VERSION, &CVRGate_Product_TestDlg::OnBnClickedGetHardwareVersion)
ON_BN_CLICKED(IDC_GET_SOFTWARE_VERSION, &CVRGate_Product_TestDlg::OnBnClickedGetSoftwareVersion)
ON_BN_CLICKED(IDC_READ_EDID, &CVRGate_Product_TestDlg::OnBnClickedReadEdid)
ON_BN_CLICKED(IDC_READ_8520_REGISTER, &CVRGate_Product_TestDlg::OnBnClickedRead8520Register)
ON_BN_CLICKED(IDC_READ_HDMI_TIMECHK, &CVRGate_Product_TestDlg::OnBnClickedReadHdmiTimechk)
ON_BN_CLICKED(IDC_READ_SENSOR, &CVRGate_Product_TestDlg::OnBnClickedReadSensor)
ON_BN_CLICKED(IDC_OPEN_BACKLIGHT, &CVRGate_Product_TestDlg::OnBnClickedOpenBacklight)
ON_BN_CLICKED(IDC_CLOSE_BACKLIGHT, &CVRGate_Product_TestDlg::OnBnClickedCloseBacklight)
ON_BN_CLICKED(IDC_CLOSE_PWM, &CVRGate_Product_TestDlg::OnBnClickedClosePwm)
ON_BN_CLICKED(IDC_SET_SENSOR_SPEED, &CVRGate_Product_TestDlg::OnBnClickedSetSensorSpeed)
ON_BN_CLICKED(IDC_ENTER_DEBUG_MODE2, &CVRGate_Product_TestDlg::OnBnClickedEnterDebugMode2)
ON_BN_CLICKED(IDC_EXIT_DEBUG_MODE2, &CVRGate_Product_TestDlg::OnBnClickedExitDebugMode2)
ON_BN_CLICKED(IDC_GET_HARDWARE_VERSION2, &CVRGate_Product_TestDlg::OnBnClickedGetHardwareVersion2)
ON_BN_CLICKED(IDC_GET_SOFTWARE_VERSION2, &CVRGate_Product_TestDlg::OnBnClickedGetSoftwareVersion2)
ON_BN_CLICKED(IDC_GET_PROTOCOL_VERSION2, &CVRGate_Product_TestDlg::OnBnClickedGetProtocolVersion2)
ON_BN_CLICKED(IDC_READ_EDID2, &CVRGate_Product_TestDlg::OnBnClickedReadEdid2)
ON_BN_CLICKED(IDC_READ_8520_REGISTER2, &CVRGate_Product_TestDlg::OnBnClickedRead8520Register2)
ON_BN_CLICKED(IDC_READ_HDMI_TIMECHK2, &CVRGate_Product_TestDlg::OnBnClickedReadHdmiTimechk2)
ON_BN_CLICKED(IDC_READ_SENSOR2, &CVRGate_Product_TestDlg::OnBnClickedReadSensor2)
ON_BN_CLICKED(IDC_OPEN_BACKLIGHT2, &CVRGate_Product_TestDlg::OnBnClickedOpenBacklight2)
ON_BN_CLICKED(IDC_CLOSE_PWM2, &CVRGate_Product_TestDlg::OnBnClickedClosePwm2)
ON_BN_CLICKED(IDC_CLOSE_BACKLIGHT2, &CVRGate_Product_TestDlg::OnBnClickedCloseBacklight2)
ON_BN_CLICKED(IDC_SET_SENSOR_SPEED2, &CVRGate_Product_TestDlg::OnBnClickedSetSensorSpeed2)
ON_WM_CTLCOLOR()
ON_BN_CLICKED(IDC_UPDATE_FIRMWARE, &CVRGate_Product_TestDlg::OnBnClickedUpdateFirmware)
END_MESSAGE_MAP()
// CVRGate_Product_TestDlg 消息处理程序
BOOL CVRGate_Product_TestDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE);// 设置大图标
SetIcon(m_hIcon, FALSE);// 设置小图标
ShowWindow(SW_MAXIMIZE);
// TODO: 在此添加额外的初始化代码
//初始化状态栏字体
/*m_Font.CreateFont(-11, 0, 0, 0, 100, FALSE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_SWISS, _T("Arial"));
CEdit *m_Edit = (CEdit *)GetDlgItem(IDC_STATUS);
m_Edit->SetFont(&m_Font,FALSE);
m_Font2.CreateFont(-11, 0, 0, 0, 100, FALSE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_SWISS, _T("Arial"));
CEdit *m_Edit2 = (CEdit *)GetDlgItem(IDC_STATUS2);
m_Edit2->SetFont(&m_Font2,FALSE); */
//设置状态栏初始字体颜色
m_color = RGB(0, 0, 0);
//设置对话框初始状态
GetDlgItem(IDC_FIND)->EnableWindow(1);
GetDlgItem(IDC_OPEN)->EnableWindow(0);
GetDlgItem(IDC_CLOSE)->EnableWindow(0);
GetDlgItem(IDC_ENTER_DEBUG_MODE)->EnableWindow(0);
GetDlgItem(IDC_EXIT_DEBUG_MODE)->EnableWindow(0);
GetDlgItem(IDC_UPDATE_FIRMWARE)->EnableWindow(FALSE);
GetDlgItem(IDC_GET_HARDWARE_VERSION)->EnableWindow(0);
GetDlgItem(IDC_GET_SOFTWARE_VERSION)->EnableWindow(0);
GetDlgItem(IDC_GET_PROTOCOL_VERSION)->EnableWindow(0);
GetDlgItem(IDC_READ_EDID)->EnableWindow(0);
GetDlgItem(IDC_READ_8520_REGISTER)->EnableWindow(0);
GetDlgItem(IDC_READ_HDMI_TIMECHK)->EnableWindow(0);
GetDlgItem(IDC_READ_SENSOR)->EnableWindow(0);
GetDlgItem(IDC_OPEN_BACKLIGHT)->EnableWindow(0);
GetDlgItem(IDC_CLOSE_PWM)->EnableWindow(0);
GetDlgItem(IDC_CLOSE_BACKLIGHT)->EnableWindow(0);
GetDlgItem(IDC_RADIO1)->EnableWindow(0);
GetDlgItem(IDC_RADIO2)->EnableWindow(0);
GetDlgItem(IDC_RADIO3)->EnableWindow(0);
GetDlgItem(IDC_SET_SENSOR_SPEED)->EnableWindow(0);
GetDlgItem(IDC_OPEN2)->EnableWindow(0);
GetDlgItem(IDC_CLOSE2)->EnableWindow(0);
GetDlgItem(IDC_ENTER_DEBUG_MODE2)->EnableWindow(0);
GetDlgItem(IDC_EXIT_DEBUG_MODE2)->EnableWindow(0);
GetDlgItem(IDC_GET_HARDWARE_VERSION2)->EnableWindow(0);
GetDlgItem(IDC_GET_SOFTWARE_VERSION2)->EnableWindow(0);
GetDlgItem(IDC_GET_PROTOCOL_VERSION2)->EnableWindow(0);
GetDlgItem(IDC_READ_EDID2)->EnableWindow(0);
GetDlgItem(IDC_READ_8520_REGISTER2)->EnableWindow(0);
GetDlgItem(IDC_READ_HDMI_TIMECHK2)->EnableWindow(0);
GetDlgItem(IDC_READ_SENSOR2)->EnableWindow(0);
GetDlgItem(IDC_OPEN_BACKLIGHT2)->EnableWindow(0);
GetDlgItem(IDC_CLOSE_PWM2)->EnableWindow(0);
GetDlgItem(IDC_CLOSE_BACKLIGHT2)->EnableWindow(0);
GetDlgItem(IDC_RADIO4)->EnableWindow(0);
GetDlgItem(IDC_RADIO5)->EnableWindow(0);
GetDlgItem(IDC_RADIO6)->EnableWindow(0);
GetDlgItem(IDC_SET_SENSOR_SPEED2)->EnableWindow(0);
bHaveCom = FALSE;
bComOpened = FALSE;
if(CheckSerialPort() != FALSE)
{
bHaveCom = TRUE;
GetDlgItem(IDC_OPEN2)->EnableWindow(1);
((CComboBox*)GetDlgItem(IDC_COMBO1))->ResetContent();
for (int i = 0; i < sizeof(m_nComArray)/sizeof(int); i++)
{
if(-1 == m_nComArray[i])
break;
CString string1;
string1.Format(_T("COM%d"), m_nComArray[i]);
((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(string1);
}
((CComboBox*)GetDlgItem(IDC_COMBO1))->SetCurSel(0);
UpdateData(false);
}
else
{
bHaveCom = FALSE;
AfxMessageBox(_T("PC机没有COM口....."));
}

return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void CVRGate_Product_TestDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CVRGate_Product_TestDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0);

// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CVRGate_Product_TestDlg::OnQueryDragIcon()
{
return static_cast(m_hIcon);
}

BOOL CVRGate_Product_TestDlg::USBReceivePacket(void)
{
BOOL bResult = TRUE;
DWORD dwError = 0;
DWORD dwBytesRead = InputReportLength;
CString tmpstr;
ResetEvent(USBReadOverlapped.hEvent);
bResult = ReadFile(HidHandle, USBRxBuff, dwBytesRead, &dwBytesRead, &USBReadOverlapped);
if (!bResult)
{
if (ERROR_IO_PENDING == GetLastError()) //函数返回ERROR_IO_PENDING,表明USB正在进行读操作
{
WaitForSingleObject(USBReadOverlapped.hEvent, 2000); //使用WaitForSingleObject函数等待,直到读操作完成或延时已达到2秒钟.当USB读操作进行完毕后,USBReadOverlapped的hEvent事件会变为有信号
}
else
{
ResetEvent(USBReadOverlapped.hEvent);
AfxMessageBox(_T("USB接收数据失败!"));
return FALSE;
}
}
if((USBRxBuff[1] = 0xAA) && (USBRxBuff[2] = 0x55) && (USBRxBuff[8+USBRxBuff[3]] == 0x0D) && (USBRxBuff[8+USBRxBuff[3]+1] == 0x0A)) //判断帧头帧尾
{
switch(USBRxBuff[5])
{
//Debug使用
case 0xA0:
if((USBRxBuff[8] == 'D') && (USBRxBuff[9] == 'e') && (USBRxBuff[10] == 'b') && (USBRxBuff[11] == 'u') && (USBRxBuff[12] == 'g') && (USBRxBuff[13] == ' ') \
&& (USBRxBuff[14] == 'M') && (USBRxBuff[15] == 'o') && (USBRxBuff[16] == 'd') && (USBRxBuff[17] == 'e'))
{
bResult = TRUE;
InfoMsg = _T("\r\n调试模式");
}
else if((USBRxBuff[8] == 'N') && (USBRxBuff[9] == 'o') && (USBRxBuff[10] == 'r') && (USBRxBuff[11] == 'm') && (USBRxBuff[12] == 'a') && (USBRxBuff[13] == 'l') && (USBRxBuff[14] == ' ') \
&& (USBRxBuff[15] == 'M') && (USBRxBuff[16] == 'o') && (USBRxBuff[17] == 'd') && (USBRxBuff[18] == 'e'))
{
bResult = TRUE;
InfoMsg = _T("\r\n正常模式");
}
else if((USBRxBuff[8] == 'U') && (USBRxBuff[9] == 'p') && (USBRxBuff[10] == 'd') && (USBRxBuff[11] == 'a') && (USBRxBuff[12] == 't') && (USBRxBuff[13] == 'e') && (USBRxBuff[14] == ' ') \
&& (USBRxBuff[15] == 'M') && (USBRxBuff[16] == 'o') && (USBRxBuff[17] == 'd') && (USBRxBuff[18] == 'e'))
{
bResult = TRUE;
InfoMsg = _T("\r\n升级模式");
}
else if ((USBRxBuff[8] == 'E') && (USBRxBuff[9] == 'r') && (USBRxBuff[10] == 'r') && (USBRxBuff[11] == 'o') && (USBRxBuff[12] == 'r'))
{
bResult = FALSE;
ErrMsg = _T("\r\n下位机返回Error");
}
else
{
bResult = FALSE;
ErrMsg = _T("\r\n其他错误");
}
break;
//获取版本信息类
case 0xC0:
if((USBRxBuff[8] == 'V') && (USBRxBuff[9] == 'e') && (USBRxBuff[10] == 'r') && (USBRxBuff[11] == 's') && (USBRxBuff[12] == 'i') && (USBRxBuff[13] == 'o') && (USBRxBuff[14] == 'n') && (USBRxBuff[15] == '_') \
&& (USBRxBuff[16] == 'H') && (USBRxBuff[17] == 'a') && (USBRxBuff[18] == 'r') && (USBRxBuff[19] == 'd') && (USBRxBuff[20] == 'w') && (USBRxBuff[21] == 'a') && (USBRxBuff[22] == 'r') && (USBRxBuff[23] == 'e') \
&& (USBRxBuff[24] == '_') && (USBRxBuff[25] == 'V'))
{
bResult = TRUE;
tmpstr.Format(_T("%c%c"), USBRxBuff[26],USBRxBuff[27]);
InfoMsg = _T("\r\n硬件板卡版本号: ") + tmpstr;
}
else if((USBRxBuff[8] == 'V') && (USBRxBuff[9] == 'e') && (USBRxBuff[10] == 'r') && (USBRxBuff[11] == 's') && (USBRxBuff[12] == 'i') && (USBRxBuff[13] == 'o') && (USBRxBuff[14] == 'n') && (USBRxBuff[15] == '_') \
&& (USBRxBuff[16] == 'S') && (USBRxBuff[17] == 'o') && (USBRxBuff[18] == 'f') && (USBRxBuff[19] == 't') && (USBRxBuff[20] == 'w') && (USBRxBuff[21] == 'a') && (USBRxBuff[22] == 'r') && (USBRxBuff[23] == 'e') \
&& (USBRxBuff[24] == '_') && (USBRxBuff[25] == 'V'))
{
bResult = TRUE;
tmpstr.Format(_T("%c%c"), USBRxBuff[26],USBRxBuff[27]);
InfoMsg = _T("\r\n固件版本号: ") + tmpstr;
}
else if((USBRxBuff[8] == 'V') && (USBRxBuff[9] == 'e') && (USBRxBuff[10] == 'r') && (USBRxBuff[11] == 's') && (USBRxBuff[12] == 'i') && (USBRxBuff[13] == 'o') && (USBRxBuff[14] == 'n') && (USBRxBuff[15] == '_') \
&& (USBRxBuff[16] == 'P') && (USBRxBuff[17] == 'r') && (USBRxBuff[18] == 'o') && (USBRxBuff[19] == 't') && (USBRxBuff[20] == 'o') && (USBRxBuff[21] == 'c') && (USBRxBuff[22] == 'o') && (USBRxBuff[23] == 'l') \
&& (USBRxBuff[24] == '_') && (USBRxBuff[25] == 'V'))
{
bResult = TRUE;
tmpstr.Format(_T("%c%c"), USBRxBuff[26],USBRxBuff[27]);
InfoMsg = _T("\r\n通讯协议版本号: ") + tmpstr;
}
else if ((USBRxBuff[8] == 'E') && (USBRxBuff[9] == 'r') && (USBRxBuff[10] == 'r') && (USBRxBuff[11] == 'o') && (USBRxBuff[12] == 'r'))
{
bResult = FALSE;
ErrMsg = _T("\r\n下位机返回Error");
}
else
{
bResult = FALSE;
ErrMsg = _T("\r\n其他错误");
}
break;
//测试通讯类收发类
case 0xD0:
if((USBRxBuff[8] == 0x00) && (USBRxBuff[9] == 0xFF) && (USBRxBuff[10] == 0xFF) && (USBRxBuff[11] == 0xFF) && (USBRxBuff[12] == 0xFF) && (USBRxBuff[13] == 0xFF) && (USBRxBuff[14] == 0xFF) && (USBRxBuff[15] == 0x00)) //EDID数据头
{
bResult = TRUE;
tmpstr.Format(_T("0x%x%x"), USBRxBuff[16], USBRxBuff[17]);
InfoMsg = _T("\r\n厂商ID: ") + tmpstr;
tmpstr.Format(_T("0x%x%x"), USBRxBuff[18], USBRxBuff[19]);
InfoMsg += _T("\r\n产品ID: ") + tmpstr;
tmpstr.Format(_T("0x%x%x%x%x"), USBRxBuff[20], USBRxBuff[21], USBRxBuff[22], USBRxBuff[23]);
InfoMsg += _T("\r\n序列号: ") + tmpstr;
tmpstr.Format(_T("%d"), USBRxBuff[25]+1990);
InfoMsg += _T("\r\n制造年份: ") + tmpstr;
tmpstr.Format(_T("%d"), USBRxBuff[24]);
InfoMsg += _T("\r\n制造周别: ") + tmpstr;
tmpstr.Format(_T("%c.%c"), USBRxBuff[26], USBRxBuff[27]);
InfoMsg += _T("\r\nEDIT版本: ") + tmpstr;
}
else if(Read8250RegFlag == TRUE)
{
Read8250RegFlag = FALSE;
bResult = TRUE;
tmpstr.Format(_T("0x%x"), USBRxBuff[8]);
InfoMsg = _T("\r\n8520寄存器值: ") + tmpstr;
}
else if((USBRxBuff[8] == 'T') && (USBRxBuff[9] == 'C') && (USBRxBuff[10] == '3') && (USBRxBuff[11] == '5') && (USBRxBuff[12] == '8') && (USBRxBuff[13] == '8') && (USBRxBuff[14] == '7') && (USBRxBuff[15] == '0') \
&& (USBRxBuff[16] == '_') && (USBRxBuff[17] == 'H') && (USBRxBuff[18] == 'D') && (USBRxBuff[19] == 'M') && (USBRxBuff[20] == 'I') && (USBRxBuff[21] == 'T') && (USBRxBuff[22] == 'i') && (USBRxBuff[23] == 'm') \
&& (USBRxBuff[24] == 'C') && (USBRxBuff[25] == 'h') && (USBRxBuff[26] == 'k') && (USBRxBuff[27] == ':') && (USBRxBuff[28] == ' '))
{
bResult = TRUE;
InfoMsg = _T("TC358870_HDMITimChk: " + USBRxBuff[29] + USBRxBuff[30] + USBRxBuff[31] + USBRxBuff[32] + USBRxBuff[33] + USBRxBuff[34] + USBRxBuff[35]);
}
else if((USBRxBuff[8] == 'S') && (USBRxBuff[9] == 'e') && (USBRxBuff[10] == 'n') && (USBRxBuff[11] == 's') && (USBRxBuff[12] == 'o') && (USBRxBuff[13] == 'r') && (USBRxBuff[14] == ' ') \
&& (USBRxBuff[15] == ':') && (USBRxBuff[16] == ' '))
{
bResult = TRUE;
InfoMsg = _T("Sensor: " + USBRxBuff[17] + USBRxBuff[18] + USBRxBuff[19] + USBRxBuff[20]+ USBRxBuff[21] + USBRxBuff[22] + USBRxBuff[23] + USBRxBuff[24]+ USBRxBuff[25]);
}
else if ((USBRxBuff[8] == 'E') && (USBRxBuff[9] == 'r') && (USBRxBuff[10] == 'r') && (USBRxBuff[11] == 'o') && (USBRxBuff[12] == 'r'))
{
bResult = FALSE;
ErrMsg = _T("\r\n下位机返回Error");
}
else
{
bResult = FALSE;
ErrMsg = _T("\r\n其他错误");
}
break;
//测试使能控制开关类
case 0xE0:
if((USBRxBuff[8] == 'C') && (USBRxBuff[9] == 'L') && (USBRxBuff[10] == 'S') && (USBRxBuff[11] == '_') && (USBRxBuff[12] == 'P') && (USBRxBuff[13] == 'W') && (USBRxBuff[14] == 'M') \
&& (USBRxBuff[15] == '_') && (USBRxBuff[16] == 'B') && (USBRxBuff[17] == 'a') && (USBRxBuff[18] == 'c') && (USBRxBuff[19] == 'k') && (USBRxBuff[20] == 'L') && (USBRxBuff[21] == 'i') && (USBRxBuff[22] == 'g') && (USBRxBuff[23] == 'h') && (USBRxBuff[24] == 't'))
{
bResult = TRUE;
InfoMsg = _T("\r\n屏幕背光-关闭背光");
}
else if((USBRxBuff[8] == 'E') && (USBRxBuff[9] == 'N') && (USBRxBuff[10] == '_') && (USBRxBuff[11] == 'P') && (USBRxBuff[12] == 'W') && (USBRxBuff[13] == 'M') \
&& (USBRxBuff[14] == '_') && (USBRxBuff[15] == 'B') && (USBRxBuff[16] == 'a') && (USBRxBuff[17] == 'c') && (USBRxBuff[18] == 'k') && (USBRxBuff[19] == 'L') && (USBRxBuff[20] == 'i') && (USBRxBuff[21] == 'g') && (USBRxBuff[22] == 'h') && (USBRxBuff[23] == 't'))
{
bResult = TRUE;
InfoMsg = _T("\r\n屏幕背光-普通亮度");
}
else if((USBRxBuff[8] == 'M') && (USBRxBuff[9] == 'A') && (USBRxBuff[10] == 'X') && (USBRxBuff[11] == '_') && (USBRxBuff[12] == 'P') && (USBRxBuff[13] == 'W') && (USBRxBuff[14] == 'M') \
&& (USBRxBuff[15] == '_') && (USBRxBuff[16] == 'B') && (USBRxBuff[17] == 'a') && (USBRxBuff[18] == 'c') && (USBRxBuff[19] == 'k') && (USBRxBuff[20] == 'L') && (USBRxBuff[21] == 'i') && (USBRxBuff[22] == 'g') && (USBRxBuff[23] == 'h') && (USBRxBuff[24] == 't'))
{
bResult = TRUE;
InfoMsg = _T("\r\n屏幕背光-最大亮度");
}
else if ((USBRxBuff[8] == 'E') && (USBRxBuff[9] == 'r') && (USBRxBuff[10] == 'r') && (USBRxBuff[11] == 'o') && (USBRxBuff[12] == 'r'))
{
bResult = FALSE;
ErrMsg = _T("\r\n下位机返回Error");
}
else
{
bResult = FALSE;
ErrMsg = _T("\r\n其他错误");
}
break;
//设置陀螺仪等Sensor的传输速度
case 0xE1:
if((USBRxBuff[8] == 'S') && (USBRxBuff[9] == 'e') && (USBRxBuff[10] == 'n') && (USBRxBuff[11] == 's') && (USBRxBuff[12] == 'o') && (USBRxBuff[13] == 'r') && (USBRxBuff[14] == ' ') \
&& (USBRxBuff[15] == '1') && (USBRxBuff[16] == '0') && (USBRxBuff[17] == '0') && (USBRxBuff[18] == '0') && (USBRxBuff[19] == 'H') && (USBRxBuff[20] == 'z'))
{
bResult = TRUE;
InfoMsg = _T("\r\n传感器采样率:1000Hz");
}
else if((USBRxBuff[8] == 'S') && (USBRxBuff[9] == 'e') && (USBRxBuff[10] == 'n') && (USBRxBuff[11] == 's') && (USBRxBuff[12] == 'o') && (USBRxBuff[13] == 'r') && (USBRxBuff[14] == ' ') \
&& (USBRxBuff[15] == '5') && (USBRxBuff[16] == '0') && (USBRxBuff[17] == '0') && (USBRxBuff[18] == 'H') && (USBRxBuff[19] == 'z'))
{
bResult = TRUE;
InfoMsg = _T("\r\n传感器采样率:500Hz");
}
else if((USBRxBuff[8] == 'S') && (USBRxBuff[9] == 'e') && (USBRxBuff[10] == 'n') && (USBRxBuff[11] == 's') && (USBRxBuff[12] == 'o') && (USBRxBuff[13] == 'r') && (USBRxBuff[14] == ' ') \
&& (USBRxBuff[15] == '1') && (USBRxBuff[16] == '0') && (USBRxBuff[17] == '0') && (USBRxBuff[18] == 'H') && (USBRxBuff[19] == 'z'))
{
bResult = TRUE;
InfoMsg = _T("\r\n传感器采样率:100Hz");
}
else if ((USBRxBuff[8] == 'E') && (USBRxBuff[9] == 'r') && (USBRxBuff[10] == 'r') && (USBRxBuff[11] == 'o') && (USBRxBuff[12] == 'r'))
{
bResult = FALSE;
ErrMsg = _T("\r\n下位机返回Error");
}
else
{
bResult = FALSE;
ErrMsg = _T("\r\n其他错误");
}
break;
default:
bResult = FALSE;
ErrMsg = _T("\r\n其他错误: 未定义指令");
break;
}
}
else
{
bResult = FALSE;
ErrMsg = _T("\r\n帧数据校验错误");
}
ResetEvent(USBReadOverlapped.hEvent);

return bResult;
}
BOOL CVRGate_Product_TestDlg::ComReceivePacket(void)
{
BOOL bResult = TRUE;
DWORD dwError = 0;
DWORD dwBytesRead = sizeof(ComRxBuff);
CString tmpstr;
memset(ComRxBuff, 0x00 ,sizeof(ComRxBuff));
/*不能有这段程序,否则直接清空了串口输入缓冲区,导致数据收不到
ResetEvent(ComReadOverlapped.hEvent);
//清空串口的输入缓冲区
PurgeComm(ComHandle, PURGE_RXABORT | PURGE_RXCLEAR); //立即中断所有读操作并立即返回,即使读操作还没有完成 | 清空输入缓冲区
*/
bResult = ClearCommError(ComHandle, &dwError, &ComReadStat); //在使用ReadFile 函数进行读操作前,应先使用ClearCommError函数清除错误.该函数获得通信错误并报告串口的当前状态,同时,该函数清除串口的错误标志以便继续输入、输出操作
if (ComReadStat.cbInQue == 0) //输入缓冲区有多少数据
return FALSE;
dwBytesRead = min(dwBytesRead, (DWORD)ComReadStat.cbInQue);
if(!dwBytesRead)
return FALSE;
bResult = ReadFile(ComHandle, ComRxBuff, dwBytesRead, &dwBytesRead, &ComReadOverlapped);
if (!bResult)
{
if (ERROR_IO_PENDING == GetLastError()) //函数返回ERROR_IO_PENDING,表明串口正在进行读操作
{
WaitForSingleObject(ComReadOverlapped.hEvent, 2000); ////使用WaitForSingleObject函数等待,直到读操作完成或延时已达到2秒钟.当串口读操作进行完毕后,m_ov的hEvent事件会变为有信号
}
else
{
ClearCommError(ComHandle, &dwError, &ComReadStat);
PurgeComm(ComHandle, PURGE_RXABORT | PURGE_RXCLEAR); //立即中断所有读操作并立即返回,即使读操作还没有完成 | 清空输入缓冲区
ResetEvent(ComReadOverlapped.hEvent);
AfxMessageBox(_T("串口接收数据失败!"));
return FALSE;
}
}
if((ComRxBuff[0] = 0xAA) && (ComRxBuff[1] = 0x55) && (ComRxBuff[8+ComRxBuff[2]-1] == 0x0D) && (ComRxBuff[8+ComRxBuff[2]] == 0x0A)) //判断帧头帧尾
{
switch(ComRxBuff[4])
{
//Debug使用
case 0xA0:
if((ComRxBuff[7] == 'D') && (ComRxBuff[8] == 'e') && (ComRxBuff[9] == 'b') && (ComRxBuff[10] == 'u') && (ComRxBuff[11] == 'g') && (ComRxBuff[12] == ' ') \
&& (ComRxBuff[13] == 'M') && (ComRxBuff[14] == 'o') && (ComRxBuff[15] == 'd') && (ComRxBuff[16] == 'e'))
{
bResult = TRUE;
InfoMsg = _T("\r\n调试模式");
}
else if((ComRxBuff[7] == 'N') && (ComRxBuff[8] == 'o') && (ComRxBuff[9] == 'r') && (ComRxBuff[10] == 'm') && (ComRxBuff[11] == 'a') && (ComRxBuff[12] == 'l') && (ComRxBuff[13] == ' ') \
&& (ComRxBuff[14] == 'M') && (ComRxBuff[15] == 'o') && (ComRxBuff[16] == 'd') && (ComRxBuff[17] == 'e'))
{
bResult = TRUE;
InfoMsg = _T("\r\n正常模式");
}
else if ((ComRxBuff[7] == 'E') && (ComRxBuff[8] == 'r') && (ComRxBuff[9] == 'r') && (ComRxBuff[10] == 'o') && (ComRxBuff[11] == 'r'))
{
bResult = FALSE;
ErrMsg = _T("\r\n下位机返回Error");
}
else
{
bResult = FALSE;
ErrMsg = _T("\r\n其他错误");
}
break;
//获取版本信息类
case 0xC0:
if((ComRxBuff[7] == 'V') && (ComRxBuff[8] == 'e') && (ComRxBuff[9] == 'r') && (ComRxBuff[10] == 's') && (ComRxBuff[11] == 'i') && (ComRxBuff[12] == 'o') && (ComRxBuff[13] == 'n') && (ComRxBuff[14] == '_') \
&& (ComRxBuff[15] == 'H') && (ComRxBuff[16] == 'a') && (ComRxBuff[17] == 'r') && (ComRxBuff[18] == 'd') && (ComRxBuff[19] == 'w') && (ComRxBuff[20] == 'a') && (ComRxBuff[21] == 'r') && (ComRxBuff[22] == 'e') \
&& (ComRxBuff[23] == '_') && (ComRxBuff[24] == 'V'))
{
bResult = TRUE;
tmpstr.Format(_T("%c%c"), ComRxBuff[25],ComRxBuff[26]);
InfoMsg = _T("\r\n硬件板卡版本号: ") + tmpstr;
}
else if((ComRxBuff[7] == 'V') && (ComRxBuff[8] == 'e') && (ComRxBuff[9] == 'r') && (ComRxBuff[10] == 's') && (ComRxBuff[11] == 'i') && (ComRxBuff[12] == 'o') && (ComRxBuff[13] == 'n') && (ComRxBuff[14] == '_') \
&& (ComRxBuff[15] == 'S') && (ComRxBuff[16] == 'o') && (ComRxBuff[17] == 'f') && (ComRxBuff[18] == 't') && (ComRxBuff[19] == 'w') && (ComRxBuff[20] == 'a') && (ComRxBuff[21] == 'r') && (ComRxBuff[22] == 'e') \
&& (ComRxBuff[23] == '_') && (ComRxBuff[24] == 'V'))
{
bResult = TRUE;
tmpstr.Format(_T("%c%c"), ComRxBuff[25],ComRxBuff[26]);
InfoMsg = _T("\r\n固件版本号: ") + tmpstr;
}
else if((ComRxBuff[7] == 'V') && (ComRxBuff[8] == 'e') && (ComRxBuff[9] == 'r') && (ComRxBuff[10] == 's') && (ComRxBuff[11] == 'i') && (ComRxBuff[12] == 'o') && (ComRxBuff[13] == 'n') && (ComRxBuff[14] == '_') \
&& (ComRxBuff[15] == 'P') && (ComRxBuff[16] == 'r') && (ComRxBuff[17] == 'o') && (ComRxBuff[18] == 't') && (ComRxBuff[19] == 'o') && (ComRxBuff[20] == 'c') && (ComRxBuff[21] == 'o') && (ComRxBuff[22] == 'l') \
&& (ComRxBuff[23] == '_') && (ComRxBuff[24] == 'V'))
{
bResult = TRUE;
tmpstr.Format(_T("%c%c"), ComRxBuff[25],ComRxBuff[26]);
InfoMsg = _T("\r\n通讯协议版本号: ") + tmpstr;
}
else if ((ComRxBuff[7] == 'E') && (ComRxBuff[8] == 'r') && (ComRxBuff[9] == 'r') && (ComRxBuff[10] == 'o') && (ComRxBuff[11] == 'r'))
{
bResult = FALSE;
ErrMsg = _T("\r\n下位机返回Error");
}
else
{
bResult = FALSE;
ErrMsg = _T("\r\n其他错误");
}
break;
//测试通讯类收发类
case 0xD0:
if((ComRxBuff[7] == 0x00) && (ComRxBuff[8] == 0xFF) && (ComRxBuff[9] == 0xFF) && (ComRxBuff[10] == 0xFF) && (ComRxBuff[11] == 0xFF) && (ComRxBuff[12] == 0xFF) && (ComRxBuff[13] == 0xFF) && (ComRxBuff[14] == 0x00))
{
bResult = TRUE;
tmpstr.Format(_T("0x%x%x"), ComRxBuff[15], ComRxBuff[16]);
InfoMsg = _T("\r\n厂商ID: ") + tmpstr;
tmpstr.Format(_T("0x%x%x"), ComRxBuff[17], ComRxBuff[18]);
InfoMsg += _T("\r\n产品ID: ") + tmpstr;
tmpstr.Format(_T("0x%x%x%x%x"), ComRxBuff[19], ComRxBuff[20], ComRxBuff[21], ComRxBuff[22]);
InfoMsg += _T("\r\n序列号: ") + tmpstr;
tmpstr.Format(_T("%d"), ComRxBuff[24]+1990);
InfoMsg += _T("\r\n制造年份: ") + tmpstr;
tmpstr.Format(_T("%d"), ComRxBuff[23]);
InfoMsg += _T("\r\n制造周别: ") + tmpstr;
tmpstr.Format(_T("%c.%c"), ComRxBuff[25], ComRxBuff[26]);
InfoMsg += _T("\r\nEDIT版本: ") + tmpstr;
}
else if(Read8250RegFlag == TRUE)
{
Read8250RegFlag = FALSE;
bResult = TRUE;
tmpstr.Format(_T("0x%x"), ComRxBuff[7]);
InfoMsg = _T("\r\n8520寄存器值: ") + tmpstr;
}
else if((ComRxBuff[7] == 'T') && (ComRxBuff[8] == 'C') && (ComRxBuff[9] == '3') && (ComRxBuff[10] == '5') && (ComRxBuff[11] == '8') && (ComRxBuff[12] == '8') && (ComRxBuff[13] == '7') && (ComRxBuff[14] == '0') \
&& (ComRxBuff[15] == '_') && (ComRxBuff[16] == 'H') && (ComRxBuff[17] == 'D') && (ComRxBuff[18] == 'M') && (ComRxBuff[19] == 'I') && (ComRxBuff[20] == 'T') && (ComRxBuff[21] == 'i') && (ComRxBuff[22] == 'm') \
&& (ComRxBuff[23] == 'C') && (ComRxBuff[24] == 'h') && (ComRxBuff[25] == 'k') && (ComRxBuff[26] == ':') && (ComRxBuff[27] == ' '))
{
bResult = TRUE;
InfoMsg = _T("TC358870_HDMITimChk: " + ComRxBuff[28] + ComRxBuff[29] + ComRxBuff[30] + ComRxBuff[31] + ComRxBuff[32] + ComRxBuff[33] + ComRxBuff[34]);
}
else if((ComRxBuff[7] == 'S') && (ComRxBuff[8] == 'e') && (ComRxBuff[9] == 'n') && (ComRxBuff[10] == 's') && (ComRxBuff[11] == 'o') && (ComRxBuff[12] == 'r') && (ComRxBuff[13] == ' ') \
&& (ComRxBuff[14] == ':') && (ComRxBuff[15] == ' '))
{
bResult = TRUE;
InfoMsg = _T("Sensor: " + ComRxBuff[16] + ComRxBuff[17] + ComRxBuff[18] + ComRxBuff[19] + ComRxBuff[20] + ComRxBuff[21] + ComRxBuff[22] + ComRxBuff[23] + ComRxBuff[24]);
}
else if ((ComRxBuff[7] == 'E') && (ComRxBuff[8] == 'r') && (ComRxBuff[9] == 'r') && (ComRxBuff[10] == 'o') && (ComRxBuff[11] == 'r'))
{
bResult = FALSE;
ErrMsg = _T("\r\n下位机返回Error");
}
else
{
bResult = FALSE;
ErrMsg = _T("\r\n其他错误");
}
break;
//测试使能控制开关类
case 0xE0:
if((ComRxBuff[7] == 'C') && (ComRxBuff[8] == 'L') && (ComRxBuff[9] == 'S') && (ComRxBuff[10] == '_') && (ComRxBuff[11] == 'P') && (ComRxBuff[12] == 'W') && (ComRxBuff[13] == 'M') \
&& (ComRxBuff[14] == '_') && (ComRxBuff[15] == 'B') && (ComRxBuff[16] == 'a') && (ComRxBuff[17] == 'c') && (ComRxBuff[18] == 'k') && (ComRxBuff[19] == 'L') && (ComRxBuff[20] == 'i') && (ComRxBuff[21] == 'g') && (ComRxBuff[22] == 'h') && (ComRxBuff[23] == 't'))
{
bResult = TRUE;
InfoMsg = _T("\r\n屏幕背光-关闭背光");
}
else if((ComRxBuff[7] == 'E') && (ComRxBuff[8] == 'N') && (ComRxBuff[9] == '_') && (ComRxBuff[10] == 'P') && (ComRxBuff[11] == 'W') && (ComRxBuff[12] == 'M') \
&& (ComRxBuff[13] == '_') && (ComRxBuff[14] == 'B') && (ComRxBuff[15] == 'a') && (ComRxBuff[16] == 'c') && (ComRxBuff[17] == 'k') && (ComRxBuff[18] == 'L') && (ComRxBuff[19] == 'i') && (ComRxBuff[20] == 'g') && (ComRxBuff[21] == 'h') && (ComRxBuff[22] == 't'))
{
bResult = TRUE;
InfoMsg = _T("\r\n屏幕背光-普通亮度");
}
else if((ComRxBuff[7] == 'M') && (ComRxBuff[8] == 'A') && (ComRxBuff[9] == 'X') && (ComRxBuff[10] == '_') && (ComRxBuff[11] == 'P') && (ComRxBuff[12] == 'W') && (ComRxBuff[13] == 'M') \
&& (ComRxBuff[14] == '_') && (ComRxBuff[15] == 'B') && (ComRxBuff[16] == 'a') && (ComRxBuff[17] == 'c') && (ComRxBuff[18] == 'k') && (ComRxBuff[19] == 'L') && (ComRxBuff[20] == 'i') && (ComRxBuff[21] == 'g') && (ComRxBuff[22] == 'h') && (ComRxBuff[23] == 't'))
{
bResult = TRUE;
InfoMsg = _T("\r\n屏幕背光-最大亮度");
}
else if ((ComRxBuff[7] == 'E') && (ComRxBuff[8] == 'r') && (ComRxBuff[9] == 'r') && (ComRxBuff[10] == 'o') && (ComRxBuff[11] == 'r'))
{
bResult = FALSE;
ErrMsg = _T("\r\n下位机返回Error");
}
else
{
bResult = FALSE;
ErrMsg = _T("\r\n其他错误");
}
break;
//设置陀螺仪等Sensor的传输速度
case 0xE1:
if((ComRxBuff[7] == 'S') && (ComRxBuff[8] == 'e') && (ComRxBuff[9] == 'n') && (ComRxBuff[10] == 's') && (ComRxBuff[11] == 'o') && (ComRxBuff[12] == 'r') && (ComRxBuff[13] == ' ') \
&& (ComRxBuff[14] == '1') && (ComRxBuff[15] == '0') && (ComRxBuff[16] == '0') && (ComRxBuff[17] == '0') && (ComRxBuff[18] == 'H') && (ComRxBuff[19] == 'z'))
{
bResult = TRUE;
InfoMsg = _T("\r\n传感器采样率:1000Hz");
}
else if((ComRxBuff[7] == 'S') && (ComRxBuff[8] == 'e') && (ComRxBuff[9] == 'n') && (ComRxBuff[10] == 's') && (ComRxBuff[11] == 'o') && (ComRxBuff[12] == 'r') && (ComRxBuff[13] == ' ') \
&& (ComRxBuff[14] == '5') && (ComRxBuff[15] == '0') && (ComRxBuff[16] == '0') && (ComRxBuff[17] == 'H') && (ComRxBuff[18] == 'z'))
{
bResult = TRUE;
InfoMsg = _T("\r\n传感器采样率:500Hz");
}
else if((ComRxBuff[7] == 'S') && (ComRxBuff[8] == 'e') && (ComRxBuff[9] == 'n') && (ComRxBuff[10] == 's') && (ComRxBuff[11] == 'o') && (ComRxBuff[12] == 'r') && (ComRxBuff[13] == ' ') \
&& (ComRxBuff[14] == '1') && (ComRxBuff[15] == '0') && (ComRxBuff[16] == '0') && (ComRxBuff[17] == 'H') && (ComRxBuff[18] == 'z'))
{
bResult = TRUE;
InfoMsg = _T("\r\n传感器采样率:100Hz");
}
else if ((ComRxBuff[7] == 'E') && (ComRxBuff[8] == 'r') && (ComRxBuff[9] == 'r') && (ComRxBuff[10] == 'o') && (ComRxBuff[11] == 'r'))
{
bResult = FALSE;
ErrMsg = _T("\r\n下位机返回Error");
}
else
{
bResult = FALSE;
ErrMsg = _T("\r\n其他错误");
}
break;
default:
bResult = FALSE;
ErrMsg = _T("\r\n其他错误: 未定义指令");
break;
}
}
else
{
bResult = FALSE;
ErrMsg = _T("\r\n帧数据校验错误");
}
ClearCommError(ComHandle, &dwError, &ComReadStat);
//清空串口的输入缓冲区
PurgeComm(ComHandle, PURGE_RXABORT | PURGE_RXCLEAR); //立即中断所有读操作并立即返回,即使读操作还没有完成 | 清空输入缓冲区
ResetEvent(ComReadOverlapped.hEvent);
return bResult;
}
BOOL CVRGate_Product_TestDlg::USBSendPacket(unsigned char *sendbuffer)
{
DWORD dwBytesWrite = OutputReportLength;
BOOL bWriteStat;
if(!sendbuffer)
return FALSE;
ResetEvent(USBWriteOverlapped.hEvent);
bWriteStat = WriteFile(HidHandle, sendbuffer, dwBytesWrite, &dwBytesWrite, &USBWriteOverlapped);
if(!bWriteStat)
{
if(GetLastError() == ERROR_IO_PENDING)
{
WaitForSingleObject(USBWriteOverlapped.hEvent,2000);
}
else
{
ResetEvent(USBWriteOverlapped.hEvent);
AfxMessageBox(_T("USB发送数据失败!"));
return FALSE;
}
}
ResetEvent(USBWriteOverlapped.hEvent);
return TRUE;
}
BOOL CVRGate_Product_TestDlg::ComSendPacket(unsigned char *sendbuffer, int length)
{
DWORD dwBytesWrite = length;
DWORD dwErrorFlags;
BOOL bWriteStat;
if(!sendbuffer)
return FALSE;
ResetEvent(ComWriteOverlapped.hEvent);
//清空串口的输出缓冲区
PurgeComm(ComHandle, PURGE_TXABORT | PURGE_TXCLEAR); //立即中断所有写操作并立即返回,即使写操作还没有完成 | 清空输出缓冲区
ClearCommError(ComHandle, &dwErrorFlags, &ComWriteStat);
bWriteStat = WriteFile(ComHandle, sendbuffer, dwBytesWrite, &dwBytesWrite, &ComWriteOverlapped);
if(!bWriteStat)
{
if(GetLastError() == ERROR_IO_PENDING)
{
WaitForSingleObject(ComWriteOverlapped.hEvent,2000);
}
else
{
ClearCommError(ComHandle, &dwErrorFlags, &ComWriteStat);
//清空串口的输出缓冲区
PurgeComm(ComHandle, PURGE_TXABORT | PURGE_TXCLEAR); //立即中断所有写操作并立即返回,即使写操作还没有完成 | 清空输出缓冲区
ResetEvent(ComWriteOverlapped.hEvent);
AfxMessageBox(_T("串口发送数据失败!"));
return FALSE;
}
}
ClearCommError(ComHandle, &dwErrorFlags, &ComWriteStat);
//清空串口的输出缓冲区
PurgeComm(ComHandle, PURGE_TXABORT | PURGE_TXCLEAR); //立即中断所有写操作并立即返回,即使写操作还没有完成 | 清空输出缓冲区
ResetEvent(ComWriteOverlapped.hEvent);
return TRUE;
}
/*
DWORD WINAPI USBReadThread(LPVOID pParam)
{
while(bIsUSBThreadWorking)
{
USBReceivePacket();
}
bIsUSBThreadStop = 1;//到这里表示已经跳出循环了
return 0;
}
*/
CString CVRGate_Product_TestDlg::FindUSBDevice(CString Vid, CString Pid)
{
//查找本系统中HID类的GUID标识
GUID guidHID;
HidD_GetHidGuid(&guidHID);
//查找符合HID规范的USB设备
HDEVINFO hDevInfo = SetupDiGetClassDevs(&guidHID, NULL, 0, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
//失败
if (hDevInfo == INVALID_HANDLE_VALUE)
{
return NULL;
}
int InterfaceIndex = 0;
while (TRUE)
{
//查找USB设备接口
SP_DEVICE_INTERFACE_DATA strtInterfaceData;
strtInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); //必须有这句,否则下边枚举会失败!
//枚举接口,TRUE表示成功
BOOL result = SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &guidHID, InterfaceIndex, &strtInterfaceData);
if (!result)
{
break;
}
InterfaceIndex++;

int bufferSize = 0;
//若找到了接口,则读取设备(接口)路径名
SP_DEVINFO_DATA strtDevInfoData;
strtDevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);

//第一次调用出错,但可以返回正确的Size
result = SetupDiGetDeviceInterfaceDetail(hDevInfo, &strtInterfaceData, NULL, 0, (PDWORD)&bufferSize, &strtDevInfoData);
//第二次调用传递返回值,调用即可成功
/* Allocate memory for Device Detailed Data */
PSP_DEVICE_INTERFACE_DETAIL_DATA strtDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA) malloc(bufferSize); //此处必须用动态分配而不能定义局部变量,因为要在此结构体后边存放很大的内容,而局部变量没有如此大的空间!
/* Set cbSize in the DevDetail structure */
strtDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
result = SetupDiGetDeviceInterfaceDetail(hDevInfo, &strtInterfaceData, strtDetailData, bufferSize, (PDWORD)&bufferSize, &strtDevInfoData);
if (result == FALSE)
{
free(strtDetailData);
strtDetailData = NULL;
break;
}
//获取设备路径
wchar_t *pdevicePathName = strtDetailData->DevicePath;
CString tmpDevicePathName = CString(pdevicePathName);
free(strtDetailData);
strtDetailData = NULL;
pdevicePathName = NULL;
CString tmpstr = _T("hid#");
tmpstr += _T("vid_") + Vid.MakeLower() + '&' + _T("pid_") + Pid.MakeLower(); //tmpstr should be: "hid#vid_046d&pid_c077"
int idx = -1;
idx = tmpDevicePathName.Find(tmpstr);
if (idx >= 0)
{
//释放设备资源(hDevInfo是SetupDiGetClassDevs获取的)
if (hDevInfo != INVALID_HANDLE_VALUE)
SetupDiDestroyDeviceInfoList(hDevInfo);
return tmpDevicePathName;
}
} //End of while
//释放设备资源(hDevInfo是SetupDiGetClassDevs获取的)
if (hDevInfo != INVALID_HANDLE_VALUE)
Setu    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言VC/MFC频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved