GetDlgItem(IDC_EDIT1)->EnableWindow(false);

本文介绍了如何通过GetDlgItem(IDC_EDIT1)获取控件指针,并使用EnableWindow(false)使该控件不可用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GetDlgItem(IDC_EDIT1)->EnableWindow(false);

1)GetDlgItem(IDC_EDIT1)得到IDC_EDIT1控件指针。

2)EnableWindow(false) 不可用。

// B2saomiaotuxiangchuangkou.cpp : 实现文件 // #include "stdafx.h" #include "Imageprocessing.h" #include "B2saomiaotuxiangchuangkou.h" #include "afxdialogex.h" // B2saomiaotuxiangchuangkou 对话框 IMPLEMENT_DYNAMIC(B2saomiaotuxiangchuangkou, CDialogEx) B2saomiaotuxiangchuangkou::B2saomiaotuxiangchuangkou(CWnd* pParent /*=NULL*/) : CDialogEx(IDD_B2saomiaotuxiangchuangkou, pParent) { //m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } //B2saomiaotuxiangchuangkou::~B2saomiaotuxiangchuangkou() //{ //} void B2saomiaotuxiangchuangkou::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_EDIT_FOLDER_PATH, m_editFolderPath); DDX_Control(pDX, IDC_LIST_IMAGES, m_listImages); DDX_Control(pDX, IDC_STATIC_ORIGINAL_IMAGE, m_staticOriginalImage); DDX_Control(pDX, IDC_STATIC_PROCESSED_IMAGE, m_staticProcessedImage); DDX_Control(pDX, IDC_COMBO_SAVE_OPTION, m_comboSaveOption); } BEGIN_MESSAGE_MAP(B2saomiaotuxiangchuangkou, CDialogEx) ON_WM_PAINT() ON_WM_TIMER() ON_WM_MOUSEWHEEL() ON_BN_CLICKED(IDC_BUTTON_SELECT_FOLDER, &B2saomiaotuxiangchuangkou::OnBnClickedButtonSelectFolder) ON_BN_CLICKED(IDC_BUTTON_START, &B2saomiaotuxiangchuangkou::OnBnClickedButtonStart) ON_BN_CLICKED(IDC_BUTTON_PAUSE, &B2saomiaotuxiangchuangkou::OnBnClickedButtonPause) ON_BN_CLICKED(IDC_BUTTON_STOP, &B2saomiaotuxiangchuangkou::OnBnClickedButtonStop) ON_BN_CLICKED(IDC_BUTTON_RESET, &B2saomiaotuxiangchuangkou::OnBnClickedButtonReset) ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_IMAGES, &B2saomiaotuxiangchuangkou::OnLvnItemchangedListImages) ON_MESSAGE(WM_UPDATE_IMAGE, [](WPARAM wParam, LPARAM lParam) { B2saomiaotuxiangchuangkou* pThis = (B2saomiaotuxiangchuangkou*)lParam; pThis->DisplayImage((int)wParam); return 0; }) ON_MESSAGE(WM_PROCESSING_DONE, [](WPARAM wParam, LPARAM lParam) { B2saomiaotuxiangchuangkou* pThis = (B2saomiaotuxiangchuangkou*)lParam; pThis->ResetProcessing(); return 0; }) ON_MESSAGE(WM_UPDATE_IMAGE, &B2saomiaotuxiangchuangkou::OnUpdateImage) ON_MESSAGE(WM_PROCESSING_DONE, &B2saomiaotuxiangchuangkou::OnProcessingDone) END_MESSAGE_MAP() BOOL B2saomiaotuxiangchuangkou::OnInitDialog() { CDialogEx::OnInitDialog(); /*SetIcon(m_hIcon, TRUE); SetIcon(m_hIcon, FALSE);*/ // 初始化列表控件 m_listImages.InsertColumn(0, _T("图片文件"), LVCFMT_LEFT, 300); m_listImages.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); // 初始化下拉框 m_comboSaveOption.AddString(_T("覆盖原图")); m_comboSaveOption.AddString(_T("另存为")); m_comboSaveOption.SetCurSel(0); m_comboSaveOption.EnableWindow(FALSE); // 初始按钮状态 GetDlgItem(IDC_BUTTON_START)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_PAUSE)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_RESET)->EnableWindow(FALSE); return TRUE; } void B2saomiaotuxiangchuangkou::OnBnClickedButtonSelectFolder() { CString strFolder; BROWSEINFO bi = { 0 }; bi.lpszTitle = _T("选择图片文件夹"); LPITEMIDLIST pidl = SHBrowseForFolder(&bi); if (pidl != nullptr) { TCHAR szPath[MAX_PATH]; if (SHGetPathFromIDList(pidl, szPath)) { m_strFolderPath = szPath; m_editFolderPath.SetWindowText(m_strFolderPath); LoadImageList(); m_comboSaveOption.EnableWindow(TRUE); UpdateButtonStates(); } CoTaskMemFree(pidl); } } void B2saomiaotuxiangchuangkou::LoadImageList() { m_listImages.DeleteAllItems(); m_imageFiles.RemoveAll(); CFileFind finder; BOOL bWorking = finder.FindFile(m_strFolderPath + _T("\\*.*")); int nIndex = 0; while (bWorking) { bWorking = finder.FindNextFile(); if (finder.IsDots()) continue; if (!finder.IsDirectory()) { CString strFile = finder.GetFileName(); CString strExt = strFile.Right(3); strExt.MakeLower(); if (strExt == _T("jpg") || strExt == _T("jpeg") || strExt == _T("bmp") || strExt == _T("png")) { m_listImages.InsertItem(nIndex, strFile); m_imageFiles.Add(finder.GetFilePath()); nIndex++; } } } finder.Close(); if (m_imageFiles.GetSize() > 0) { m_nCurrentIndex = 0; DisplayImage(0); GetDlgItem(IDC_BUTTON_START)->EnableWindow(TRUE); } } void B2saomiaotuxiangchuangkou::DisplayImage(int nIndex) { if (nIndex < 0 || nIndex >= m_imageFiles.GetSize()) return; m_nCurrentIndex = nIndex; m_currentImage.Destroy(); if (SUCCEEDED(m_currentImage.Load(m_imageFiles[nIndex]))) { m_staticOriginalImage.Invalidate(); m_staticProcessedImage.Invalidate(); } } void B2saomiaotuxiangchuangkou::DisplayProcessedImage() { if (m_processedImage.IsNull()) return; m_staticProcessedImage.Invalidate(); } void B2saomiaotuxiangchuangkou::OnPaint() { CDialogEx::OnPaint(); if (m_currentImage.IsNull()) return; // 绘制原图 CDC* pDC = m_staticOriginalImage.GetDC(); CRect rect; m_staticOriginalImage.GetClientRect(&rect); pDC->FillSolidRect(rect, RGB(240, 240, 240)); DrawImage(pDC, m_currentImage, rect, m_dZoomOriginal, m_ptZoomCenterOriginal); m_staticOriginalImage.ReleaseDC(pDC); // 绘制处理后的图像 if (!m_processedImage.IsNull()) { pDC = m_staticProcessedImage.GetDC(); m_staticProcessedImage.GetClientRect(&rect); pDC->FillSolidRect(rect, RGB(240, 240, 240)); DrawImage(pDC, m_processedImage, rect, m_dZoomProcessed, m_ptZoomCenterProcessed); m_staticProcessedImage.ReleaseDC(pDC); } } void B2saomiaotuxiangchuangkou::DrawImage(CDC* pDC, CImage& image, CRect rect, double dZoom, CPoint ptCenter) { int origWidth = image.GetWidth(); int origHeight = image.GetHeight(); // 计算保持比例的显示尺寸 double dAspect = (double)origHeight / (double)origWidth; int displayWidth = (int)(origWidth * dZoom); int displayHeight = (int)(origHeight * dZoom * dAspect); // 计算显示位置(居中) int x = ptCenter.x - (int)(displayWidth * (double)ptCenter.x / rect.Width()); int y = ptCenter.y - (int)(displayHeight * (double)ptCenter.y / rect.Height()); // 确保图像在控件范围内 if (x < 0) x = 0; if (y < 0) y = 0; if (x + displayWidth > rect.Width()) x = rect.Width() - displayWidth; if (y + displayHeight > rect.Height()) y = rect.Height() - displayHeight; // 绘制图像 image.StretchBlt(pDC->m_hDC, x, y, displayWidth, displayHeight, SRCCOPY); } BOOL B2saomiaotuxiangchuangkou::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) { // 确定鼠标在哪个控件上 CRect rectOriginal, rectProcessed; m_staticOriginalImage.GetWindowRect(&rectOriginal); m_staticProcessedImage.GetWindowRect(&rectProcessed); if (rectOriginal.PtInRect(pt)) { // 原图缩放 double dFactor = (zDelta > 0) ? 1.1 : 0.9; m_dZoomOriginal *= dFactor; // 限制缩放范围 if (m_dZoomOriginal < 0.1) m_dZoomOriginal = 0.1; if (m_dZoomOriginal > 5.0) m_dZoomOriginal = 5.0; // 设置缩放中心点 m_ptZoomCenterOriginal = pt - rectOriginal.TopLeft(); m_staticOriginalImage.Invalidate(); } else if (rectProcessed.PtInRect(pt)) { // 处理后图像缩放 double dFactor = (zDelta > 0) ? 1.1 : 0.9; m_dZoomProcessed *= dFactor; // 限制缩放范围 if (m_dZoomProcessed < 0.1) m_dZoomProcessed = 0.1; if (m_dZoomProcessed > 5.0) m_dZoomProcessed = 5.0; // 设置缩放中心点 m_ptZoomCenterProcessed = pt - rectProcessed.TopLeft(); m_staticProcessedImage.Invalidate(); } return CDialogEx::OnMouseWheel(nFlags, zDelta, pt); } void B2saomiaotuxiangchuangkou::OnLvnItemchangedListImages(NMHDR *pNMHDR, LRESULT *pResult) { LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); if ((pNMLV->uChanged & LVIF_STATE) && (pNMLV->uNewState & LVIS_SELECTED)) { if (m_bProcessing) { // 处理过程中:临时显示3秒 m_bUserBrowsing = TRUE; PostMessage(WM_UPDATE_IMAGE, pNMLV->iItem, (LPARAM)this); SetTimer(1, 3000, nullptr); // 3秒定时器 } else { // 非处理状态:持续显示 DisplayImage(pNMLV->iItem); } } *pResult = 0; } void B2saomiaotuxiangchuangkou::OnTimer(UINT_PTR nIDEvent) { if (nIDEvent == 1 && m_bUserBrowsing) { KillTimer(1); m_bUserBrowsing = FALSE; DisplayImage(m_nProcessingIndex); // 切回处理中的图片 } CDialogEx::OnTimer(nIDEvent); } void B2saomiaotuxiangchuangkou::OnBnClickedButtonStart() { if (m_imageFiles.GetSize() == 0) return; m_bProcessing = TRUE; m_nProcessingIndex = 0; UpdateButtonStates(); // 启动处理线程 AfxBeginThread([](LPVOID pParam) -> UINT { B2saomiaotuxiangchuangkou* pThis = (B2saomiaotuxiangchuangkou*)pParam; while (pThis->m_nProcessingIndex < pThis->m_imageFiles.GetSize()) { if (pThis->m_bPaused) { Sleep(100); continue; } // 更新显示 pThis->PostMessage(WM_UPDATE_IMAGE, pThis->m_nProcessingIndex, (LPARAM)pThis); // 处理当前图像 pThis->ProcessCurrentImage(); pThis->DisplayProcessedImage(); // 保存处理结果 pThis->SaveProcessedImage(); pThis->m_nProcessingIndex++; Sleep(500); // 模拟处理时间 } pThis->PostMessage(WM_PROCESSING_DONE, 0, (LPARAM)pThis); return 0; }, this); } void B2saomiaotuxiangchuangkou::ProcessCurrentImage() { if (m_currentImage.IsNull()) return; // 示例处理:转换为灰度图 m_processedImage.Destroy(); m_processedImage.Create(m_currentImage.GetWidth(), m_currentImage.GetHeight(), m_currentImage.GetBPP()); for (int y = 0; y < m_currentImage.GetHeight(); y++) { for (int x = 0; x < m_currentImage.GetWidth(); x++) { COLORREF color = m_currentImage.GetPixel(x, y); BYTE r = GetRValue(color); BYTE g = GetGValue(color); BYTE b = GetBValue(color); BYTE gray = static_cast<BYTE>(0.299 * r + 0.587 * g + 0.114 * b); m_processedImage.SetPixel(x, y, RGB(gray, gray, gray)); } } } void B2saomiaotuxiangchuangkou::SaveProcessedImage() { if (m_processedImage.IsNull()) return; int nOption = m_comboSaveOption.GetCurSel(); CString strPath; if (nOption == 0) { // 覆盖原图 strPath = m_imageFiles[m_nProcessingIndex]; } else { // 另存为 CString strDir = m_strFolderPath + _T("\\Processed"); CreateDirectory(strDir, nullptr); CString strFile; m_listImages.GetItemText(m_nProcessingIndex, 0, strFile); strPath = strDir + _T("\\") + strFile; } // 保存图像 HRESULT hr = m_processedImage.Save(strPath); } void B2saomiaotuxiangchuangkou::OnBnClickedButtonPause() { m_bPaused = !m_bPaused; CButton* pButton = (CButton*)GetDlgItem(IDC_BUTTON_PAUSE); pButton->SetWindowText(m_bPaused ? _T("继续") : _T("暂停")); UpdateButtonStates(); } void B2saomiaotuxiangchuangkou::OnBnClickedButtonStop() { m_bProcessing = FALSE; m_bPaused = FALSE; GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_RESET)->EnableWindow(TRUE); } void B2saomiaotuxiangchuangkou::OnBnClickedButtonReset() { m_processedImage.Destroy(); m_staticProcessedImage.Invalidate(); GetDlgItem(IDC_BUTTON_RESET)->EnableWindow(FALSE); } void B2saomiaotuxiangchuangkou::ResetProcessing() { m_bProcessing = FALSE; m_bPaused = FALSE; m_nProcessingIndex = -1; UpdateButtonStates(); GetDlgItem(IDC_BUTTON_RESET)->EnableWindow(TRUE); } void B2saomiaotuxiangchuangkou::UpdateButtonStates() { GetDlgItem(IDC_BUTTON_START)->EnableWindow(!m_bProcessing && m_imageFiles.GetSize() > 0); GetDlgItem(IDC_BUTTON_PAUSE)->EnableWindow(m_bProcessing); GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(m_bProcessing); GetDlgItem(IDC_BUTTON_RESET)->EnableWindow(FALSE); } LRESULT B2saomiaotuxiangchuangkou::OnUpdateImage(WPARAM wParam, LPARAM lParam) { DisplayImage(static_cast<int>(wParam)); return 0; } LRESULT B2saomiaotuxiangchuangkou::OnProcessingDone(WPARAM wParam, LPARAM lParam) { ResetProcessing(); return 0; }报严重性 代码 说明 项目 文件 行 禁止显示状态 错误(活动) 不存在从 "lambda []int (WPARAM wParam, LPARAM lParam)->int" 到 "LRESULT (CWnd::*)(WPARAM, LPARAM)" 的适当转换函数 Imageprocessing c:\Users\Administrator\Desktop\111\Imageprocessing\Imageprocessing\B2saomiaotuxiangchuangkou.cpp 45 错误(活动) 不存在从 "lambda []int (WPARAM wParam, LPARAM lParam)->int" 到 "LRESULT (CWnd::*)(WPARAM, LPARAM)" 的适当转换函数 Imageprocessing c:\Users\Administrator\Desktop\111\Imageprocessing\Imageprocessing\B2saomiaotuxiangchuangkou.cpp 50 错误(活动) 没有与参数列表匹配的 重载函数 "CListCtrl::GetItemText" 实例 Imageprocessing c:\Users\Administrator\Desktop\111\Imageprocessing\Imageprocessing\B2saomiaotuxiangchuangkou.cpp 353 错误 C2440 “static_cast”: 无法从“B2saomiaotuxiangchuangkou::GetThisMessageMap::<lambda_ac786482bcca587bd9cc736ece35bc71>”转换为“LRESULT (__cdecl CWnd::* )(WPARAM,LPARAM)” Imageprocessing c:\users\administrator\desktop\111\imageprocessing\imageprocessing\b2saomiaotuxiangchuangkou.cpp 49 错误 C2440 “static_cast”: 无法从“B2saomiaotuxiangchuangkou::GetThisMessageMap::<lambda_a9c7879179f942e6187dc0172c95ae29>”转换为“LRESULT (__cdecl CWnd::* )(WPARAM,LPARAM)” Imageprocessing c:\users\administrator\desktop\111\imageprocessing\imageprocessing\b2saomiaotuxiangchuangkou.cpp 54 错误 C2661 “CListCtrl::GetItemText”: 没有重载函数接受 3 个参数 Imageprocessing c:\users\administrator\desktop\111\imageprocessing\imageprocessing\b2saomiaotuxiangchuangkou.cpp 353
06-20
我做了一个宠物智能投喂系统,现在我有一个stm32f103c6单片机外接8的晶振,其PA1连作为RXD,PA2作为TXD,PB0、PB1连接了发光二极管的负极,发光二极管的正极接的电源,发光二极管用来模拟电机转动状态,在收到喂食的指令后PB0先亮两秒,PB1先不亮,然后在PB1亮两秒PB0熄灭,最后一起闪烁两秒表示喂食已完成,我创建了一个mfc程序(PCMFCDLG),添加了5个Combo Box控件分别用来选择端口号(控件类,m_cbPort)、波特率(控件类,m_cbBaud)、校验位(控件类,m_cbParity)、数据位(控件类,m_cbDate)以及停止位(控件类,m_cbStop),4个按钮控件分别用来打开串口连接stm32单片机、关闭串口、立即投喂、定时投喂,3个Edit control控件(value类,m_strTime1/2/3)用来定时3个时间点实现定时投喂,最后还有一个List Box(控件类,m_listStatus)用来显示执行状态,在PC机与单片机没有建立连接的时候除了连接按钮,其他按钮都不能点击,在定时按钮没有按下的时候edit control控件不能输入,在单片机执行完相应操作后,会返还给PC机信息,然后显示在list box里面如mfc界面点击立即投喂,单片机执行完操作后返回给pc端mfc界面一个标志,告诉pc端操作已完成,然后在mfc界面的list里面显示对应操作已完成。 下面是我的代码 #pragma once #include <windows.h> #include <afxwin.h> class CSerialPort { public: CSerialPort(); ~CSerialPort(); bool OpenPort(LPCTSTR port, UINT baud); void ClosePort(); bool WriteByte(BYTE data); bool IsConnected() const { return m_hComm != INVALID_HANDLE_VALUE; } private: HANDLE m_hComm; }; #include "pch.h" #include "SerialPort.h" CSerialPort::CSerialPort() : m_hComm(INVALID_HANDLE_VALUE) {} CSerialPort::~CSerialPort() { ClosePort(); } bool CSerialPort::OpenPort(LPCTSTR port, UINT baud) { m_hComm = CreateFile(port, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if (m_hComm == INVALID_HANDLE_VALUE) return false; // 配置串口参数 DCB dcb = { 0 }; dcb.DCBlength = sizeof(DCB); GetCommState(m_hComm, &dcb); dcb.BaudRate = baud; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; dcb.fBinary = TRUE; if (!SetCommState(m_hComm, &dcb)) { CloseHandle(m_hComm); m_hComm = INVALID_HANDLE_VALUE; return false; } return true; } void CSerialPort::ClosePort() { if (IsConnected()) { CloseHandle(m_hComm); m_hComm = INVALID_HANDLE_VALUE; } } bool CSerialPort::WriteByte(BYTE data) { if (!IsConnected()) return false; DWORD bytesWritten; return WriteFile(m_hComm, &data, 1, &bytesWritten, NULL) && bytesWritten == 1; } #pragma once #include "SerialPort.h" #include "resource.h" // 包含资源ID定义 class CPCMFCDlg : public CDialogEx { public: CPCMFCDlg(CWnd* pParent = nullptr); // 控件变量 CComboBox m_cbPort; CListBox m_listStatus; CString m_strTime1, m_strTime2, m_strTime3; protected: virtual void DoDataExchange(CDataExchange* pDX); virtual BOOL OnInitDialog(); DECLARE_MESSAGE_MAP() private: CSerialPort m_SerialPort; BOOL m_bConnected; UINT_PTR m_nTimerID; BOOL m_bTimerEnabled; void AddStatus(LPCTSTR msg); void UpdateUI(); BOOL ValidateTime(CString time); afx_msg void OnOpen(); afx_msg void OnClose(); afx_msg void OnNowFeed(); afx_msg void OnTimeFeed(); afx_msg void OnTimer(UINT_PTR nIDEvent); }; #include "pch.h" #include "PCMFCDlg.h" // 消息映射 BEGIN_MESSAGE_MAP(CPCMFCDlg, CDialogEx) ON_BN_CLICKED(IDC_BUTTON_OPEN, &CPCMFCDlg::OnOpen) ON_BN_CLICKED(IDC_BUTTON_CLOSE, &CPCMFCDlg::OnClose) ON_BN_CLICKED(IDC_BUTTON_NOWFEED, &CPCMFCDlg::OnNowFeed) ON_BN_CLICKED(IDC_BUTTON_TIMEFEED, &CPCMFCDlg::OnTimeFeed) ON_WM_TIMER() END_MESSAGE_MAP() CPCMFCDlg::CPCMFCDlg(CWnd* pParent) : CDialogEx(IDD_PCMFC_DIALOG, pParent) , m_strTime1(_T("08:00")), m_strTime2(_T("12:00")), m_strTime3(_T("18:00")) , m_bConnected(FALSE), m_nTimerID(0), m_bTimerEnabled(FALSE) { } void CPCMFCDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_COMBO_PORT, m_cbPort); DDX_Control(pDX, IDC_LIST, m_listStatus); DDX_Text(pDX, IDC_EDIT_TIME1, m_strTime1); DDX_Text(pDX, IDC_EDIT_TIME2, m_strTime2); DDX_Text(pDX, IDC_EDIT_TIME3, m_strTime3); } BOOL CPCMFCDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 初始化串口列表 for (int i = 1; i <= 16; i++) { CString port; port.Format(_T("COM%d"), i); m_cbPort.AddString(port); } m_cbPort.SetCurSel(0); UpdateData(FALSE); UpdateUI(); AddStatus(_T("系统就绪")); return TRUE; } void CPCMFCDlg::AddStatus(LPCTSTR msg) { CString time = CTime::GetCurrentTime().Format(_T("[%H:%M:%S] ")); m_listStatus.AddString(time + msg); m_listStatus.SetCurSel(m_listStatus.GetCount() - 1); } void CPCMFCDlg::UpdateUI() { GetDlgItem(IDC_BUTTON_CLOSE)->EnableWindow(m_bConnected); GetDlgItem(IDC_BUTTON_NOWFEED)->EnableWindow(m_bConnected); GetDlgItem(IDC_BUTTON_TIMEFEED)->EnableWindow(m_bConnected); BOOL enableEdit = m_bConnected && m_bTimerEnabled; GetDlgItem(IDC_EDIT_TIME1)->EnableWindow(enableEdit); GetDlgItem(IDC_EDIT_TIME2)->EnableWindow(enableEdit); GetDlgItem(IDC_EDIT_TIME3)->EnableWindow(enableEdit); } void CPCMFCDlg::OnOpen() { CString port; m_cbPort.GetWindowText(port); if (m_SerialPort.OpenPort(port, 9600)) { m_bConnected = TRUE; AddStatus(_T("已连接到: ") + port); UpdateUI(); } else { AddStatus(_T("连接失败: ") + port); } } void CPCMFCDlg::OnClose() { m_SerialPort.ClosePort(); m_bConnected = FALSE; AddStatus(_T("连接已关闭")); UpdateUI(); } BOOL CPCMFCDlg::ValidateTime(CString time) { return time.GetLength() == 5 && time[2] == ':' && _ttoi(time.Left(2)) < 24 && _ttoi(time.Mid(3)) < 60; } void CPCMFCDlg::OnNowFeed() { if (m_SerialPort.WriteByte(0xAA)) { AddStatus(_T("喂食指令已发送")); } else { AddStatus(_T("发送失败")); } } void CPCMFCDlg::OnTimeFeed() { UpdateData(TRUE); if (!ValidateTime(m_strTime1) || !ValidateTime(m_strTime2) || !ValidateTime(m_strTime3)) { AddStatus(_T("时间格式应为 HH:MM")); return; } if (m_nTimerID) { KillTimer(m_nTimerID); m_nTimerID = 0; m_bTimerEnabled = FALSE; AddStatus(_T("定时喂食已停止")); GetDlgItem(IDC_BUTTON_TIMEFEED)->SetWindowText(_T("启动定时")); } else { m_nTimerID = SetTimer(1, 1000, NULL); m_bTimerEnabled = TRUE; CString msg; msg.Format(_T("定时喂食启动: %s, %s, %s"), m_strTime1, m_strTime2, m_strTime3); AddStatus(msg); GetDlgItem(IDC_BUTTON_TIMEFEED)->SetWindowText(_T("停止定时")); } UpdateUI(); } void CPCMFCDlg::OnTimer(UINT_PTR nIDEvent) { if (nIDEvent == 1) { CString now = CTime::GetCurrentTime().Format(_T("%H:%M")); if (now == m_strTime1 || now == m_strTime2 || now == m_strTime3) { CString msg; msg.Format(_T("定时喂食: %s"), now); AddStatus(msg); OnNowFeed(); } } CDialogEx::OnTimer(nIDEvent); } 下面是keil部分 #include "stm32f10x.h" // 简化函数声明 void GPIO_Config(void); void USART2_Config(void); void FeedOperation(void); void Delay_ms(uint32_t ms); int main(void) { // 系统初始化 RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN; RCC->APB1ENR |= RCC_APB1ENR_USART2EN; GPIO_Config(); USART2_Config(); // 初始状态:LED全灭 GPIOB->ODR |= GPIO_Pin_0 | GPIO_Pin_1; while(1) { // 检查接收数据 if(USART2->SR & USART_SR_RXNE) { uint8_t data = USART2->DR; if(data == 0xAA) { FeedOperation(); while(!(USART2->SR & USART_SR_TXE)); USART2->DR = 0x55; // 发送完成信号 } } } } // GPIO配置 void GPIO_Config(void) { // USART2 TX (PA2)复用推挽输出 GPIOA->CRL &= ~(GPIO_CRL_CNF2 | GPIO_CRL_MODE2); GPIOA->CRL |= GPIO_CRL_CNF2_1 | GPIO_CRL_MODE2; // USART2 RX (PA1)浮空输入 GPIOA->CRL &= ~(GPIO_CRL_CNF1 | GPIO_CRL_MODE1); GPIOA->CRL |= GPIO_CRL_CNF1_0; // LED控制引脚 PB0, PB1 (推挽输出) GPIOB->CRL &= ~(GPIO_CRL_CNF0 | GPIO_CRL_CNF1 | GPIO_CRL_MODE0 | GPIO_CRL_MODE1); GPIOB->CRL |= GPIO_CRL_MODE0 | GPIO_CRL_MODE1; } // USART2配置 void USART2_Config(void) { // 波特率9600 (36MHz/9600=3750=0x0EA6) USART2->BRR = 0x0EA6; USART2->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_UE; } // 喂食操作 void FeedOperation(void) { // 阶段1: PB0亮2秒,PB1灭 GPIOB->BRR = GPIO_Pin_0; // PB0亮 GPIOB->BSRR = GPIO_Pin_1; // PB1灭 Delay_ms(2000); // 阶段2: PB1亮2秒,PB0灭 GPIOB->BSRR = GPIO_Pin_0; // PB0灭 GPIOB->BRR = GPIO_Pin_1; // PB1亮 Delay_ms(2000); // 阶段3: 一起闪烁2秒 for(uint8_t i = 0; i < 4; i++) { GPIOB->BRR = GPIO_Pin_0 | GPIO_Pin_1; // 全亮 Delay_ms(250); GPIOB->BSRR = GPIO_Pin_0 | GPIO_Pin_1; // 全灭 Delay_ms(250); } // 确保全灭 GPIOB->BSRR = GPIO_Pin_0 | GPIO_Pin_1; } // 简单延时函数 void Delay_ms(uint32_t ms) { for(; ms > 0; ms--) { for(volatile uint32_t i = 0; i < 9000; i++); } } 请你帮我在mfc里面增加那些端口号,自动识别出可以连接的供选择,然后波特率、停止位、校验位、数据位也提供常用的供选择的功能,然后输出更改后的代码,然后我点击立即投喂后单片机的led灯不亮,请你分析原因
06-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值