#include "CDialogSerialPort.h"
#include "Win32Utils/CStrUtils.h"
#include <Windows.h>
#include <strsafe.h>
#include <thread>
#include "resource.h"
#pragma comment (lib ,"imm32.lib")
#define WM_TRAYICON (WM_USER + 10)
BEGIN_DLG_MESSAGE_MAP(CDialogSerialPort, CDialogBase)
ON_DLG_MESSAGE(WM_INITDIALOG, &CDialogSerialPort::OnInitDialog)
ON_DLG_MESSAGE(WM_TRAYICON, &CDialogSerialPort::OnTrayIcon)
ON_DLG_MESSAGE(WM_CLOSE, &CDialogSerialPort::OnClose)
ON_DLG_MESSAGE(WM_RBUTTONUP, &CDialogSerialPort::OnRButtonUp)
ON_DLG_MESSAGE(WM_CTLCOLORSTATIC, &CDialogSerialPort::OnColor)
//ON_DLG_MESSAGE(WM_CTLCOLOREDIT, &CDialogSerialPort::OnColor)
ON_DLG_MESSAGE(WM_CTLCOLORBTN, &CDialogSerialPort::OnColor)
ON_DLG_MESSAGE(WM_CTLCOLORDLG, &CDialogSerialPort::OnColor)
ON_DLG_MESSAGE(WM_TIMER, &CDialogSerialPort::OnTimer)
ON_DLG_COMMAND(ID_FILE_EXIT, &CDialogSerialPort::OnCommandExit)
ON_DLG_COMMAND(ID_SETTINGS_SHOW, &CDialogSerialPort::OnCommandShow)
ON_DLG_COMMAND(ID_SETTINGS_HIDE, &CDialogSerialPort::OnCommandHide)
ON_DLG_COMMAND(IDC_CHECK_READ_HEX, &CDialogSerialPort::OnCommandReadHexShow)
ON_DLG_COMMAND(IDC_CHECK_WRITE_HEX, &CDialogSerialPort::OnCommandWriteHexShow)
ON_DLG_COMMAND(IDC_BUTTON_CLEAR, &CDialogSerialPort::OnCommandReadClear)
ON_DLG_COMMAND(IDC_COMBO_PORT, &CDialogSerialPort::OnStatePort)
ON_DLG_COMMAND(IDC_COMBO_SPEED, &CDialogSerialPort::OnStateSpeed)
ON_DLG_COMMAND(IDC_COMBO_DATA, &CDialogSerialPort::OnStateData)
ON_DLG_COMMAND(IDC_COMBO_PARITY, &CDialogSerialPort::OnStateParity)
ON_DLG_COMMAND(IDC_COMBO_STOP, &CDialogSerialPort::OnStateStop)
ON_DLG_COMMAND(IDC_BUTTON_OPEN, &CDialogSerialPort::OnCommOpen)
ON_DLG_COMMAND(IDC_BUTTON_SEND, &CDialogSerialPort::OnCommSend)
ON_DLG_COMMAND(IDC_BUTTON_TIMEOUT, &CDialogSerialPort::OnApplyTime)
ON_DLG_COMMAND(ID_HELP_ABOUT, &CDialogSerialPort::OnCommandAbout)
ON_DLG_COMMAND(ID_SETTINGS_CODE_UNICODE, &CDialogSerialPort::OnCommandUnicode)
ON_DLG_COMMAND(ID_SETTINGS_CODE_UTF_8, &CDialogSerialPort::OnCommandUtf8)
ON_DLG_COMMAND(ID_SETTINGS_CODE_ANSI, &CDialogSerialPort::OnCommandAnsi)
ON_DLG_COMMAND(IDC_CHECK_AUTO_SEND, &CDialogSerialPort::OnCommandAutoSend)
ON_DLG_COMMAND(ID_SETTINGS_TOPMOST, &CDialogSerialPort::OnCommandTopmost)
END_DLG_MESSAGE_MAP()
BOOL CDialogSerialPort::PreTranslateMessage(LPMSG pMsg)
{
if (WM_KEYDOWN == pMsg->message && pMsg->hwnd == m_hWndSend && m_bWriteHex)
{
TCHAR ch = (TCHAR)pMsg->wParam;
SHORT ctrlState = GetAsyncKeyState(VK_CONTROL) & 0x8000;
if (ctrlState)
{
if (ch == _T('C') ||
ch == _T('V') ||
ch == _T('X') ||
ch == _T('A')
)
{
return FALSE;
}
else
{
return TRUE;
}
}
if (VK_BACK == ch || VK_SPACE == ch || VK_TAB == ch || VK_RETURN == ch)
{
return FALSE;
}
if ((ch >= _T('0') && ch <= _T('9')) ||
(ch >= _T('A') && ch <= _T('F'))
)
{
return FALSE;
}
return TRUE;
}
return FALSE;
}
int CDialogSerialPort::GetAllSerials(std::vector<_tstring>& CommList)
{
HKEY hKey = nullptr;
int nretval = 0;
nretval = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,
_T("Hardware\\DeviceMap\\SerialComm"),
NULL, KEY_READ, &hKey);
int i = 0;
if (nretval == ERROR_SUCCESS)
{
TCHAR szPortName[MAX_PATH];
DWORD dwLong, dwSize;
while (true)
{
TCHAR szCommName[MAX_PATH] = { 0 };
dwLong = MAX_PATH;
dwSize = MAX_PATH;
nretval = RegEnumValue(hKey, i, szPortName, &dwLong,
NULL, NULL, (PUCHAR)szCommName, &dwSize);
if (nretval != ERROR_NO_MORE_ITEMS)
{
CommList.push_back(szCommName);
}
else
{
break;
}
i++;
}
RegCloseKey(hKey);
}
return i;
}
void CDialogSerialPort::UpdateSerialDcb()
{
// 波特率
{
TCHAR szBuf[MAX_PATH] = { 0 };
HWND hWndSpeed = GetDlgItem(m_hWnd, IDC_COMBO_SPEED);
LRESULT nCurSel = SendMessage(hWndSpeed, CB_GETCURSEL, 0, 0);
if (CB_ERR != nCurSel)
{
SendMessage(hWndSpeed, CB_GETLBTEXT, nCurSel, (LPARAM)szBuf);
m_SerialDcb.BaudRate = _tcstoul(szBuf, nullptr, 10);
}
}
// 数据位
{
HWND hWndSpeed = GetDlgItem(m_hWnd, IDC_COMBO_DATA);
LRESULT nCurSel = SendMessage(hWndSpeed, CB_GETCURSEL, 0, 0);
if (0 <= nCurSel && nCurSel <= 3)
{
m_SerialDcb.ByteSize = (BYTE)(5 + nCurSel);
}
else
{
m_SerialDcb.ByteSize = 8;
}
}
// 校验位
{
HWND hWndParity = GetDlgItem(m_hWnd, IDC_COMBO_PARITY);
LRESULT nCurSel = SendMessage(hWndParity, CB_GETCURSEL, 0, 0);
if (NOPARITY <= nCurSel && nCurSel <= SPACEPARITY)
{
m_SerialDcb.Parity = (BYTE)nCurSel;
}
else
{
m_SerialDcb.Parity = NOPARITY;
}
}
// 停止位
{
HWND hWndStop = GetDlgItem(m_hWnd, IDC_COMBO_STOP);
LRESULT nCurSel = SendMessage(hWndStop, CB_GETCURSEL, 0, 0);
if (ONESTOPBIT <= nCurSel && nCurSel <= TWOSTOPBITS)
{
m_SerialDcb.StopBits = (BYTE)nCurSel;
}
else
{
m_SerialDcb.StopBits = ONESTOPBIT;
}
}
m_SerialPort.SetState(&m_SerialDcb);
}
void CDialogSerialPort::ApplyTimeOut()
{
if (m_SerialPort.IsOpen())
{
DWORD ReadInterval = ::GetDlgItemInt(m_hWnd, IDC_EDIT_READ_INTERVAL, nullptr, false);
DWORD ReadTotalMultiplier = ::GetDlgItemInt(m_hWnd, IDC_EDIT_READ_TOTAL_MULTIPLIER, nullptr, false);
DWORD ReadTotalConstant = ::GetDlgItemInt(m_hWnd, IDC_EDIT_READ_TOTAL_CONSTANT, nullptr, false);
DWORD WriteTotalMultiplier = ::GetDlgItemInt(m_hWnd, IDC_EDIT_WRITE_TOTAL_MULTIPLIER, nullptr, false);
DWORD WriteTotalConstant = ::GetDlgItemInt(m_hWnd, IDC_EDIT_WRITE_TOTAL_CONSTANT, nullptr, false);
m_SerialPort.Purge(PURGE_TXCLEAR |
PURGE_RXCLEAR |
PURGE_TXABORT |
PURGE_RXABORT);
m_SerialPort.ClearError();
m_SerialPort.SetTimeOut(ReadInterval,
ReadTotalMultiplier,
ReadTotalConstant,
WriteTotalMultiplier,
WriteTotalConstant);
}
}
LRESULT CDialogSerialPort::OnInitDialog(WPARAM wParam, LPARAM lParam)
{
// 设置图标
HICON hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON));
if (hIcon)
{
::SendMessage(m_hWnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
::SendMessage(m_hWnd, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);
}
m_hHideWnd = CreateWindow(
_T("Static"), _T("Hide"), WS_CHILDWINDOW, 0, 0, 0, 0,
m_hWnd, NULL, GetModuleHandle(NULL), NULL);
if (m_hHideWnd)
{
::SetParent(m_hHideWnd, NULL);
}
m_hMainMenu = ::GetMenu(m_hWnd);
if (nullptr == m_hMainMenu)
{
m_hMainMenu = ::LoadMenu(GetModuleHandle(NULL), MAKEINTRESOURCE(IDR_MENU));
}
if (m_hMainMenu)
{
::SetMenu(m_hWnd, m_hMainMenu);
ShowTrayIcon();
}
{
HWND hWndPort = GetDlgItem(m_hWnd, IDC_COMBO_PORT);
std::vector<_tstring> CommList;
GetAllSerials(CommList);
for (auto item : CommList)
{
SendMessage(hWndPort, CB_ADDSTRING, 0, (LPARAM)item.c_str());
}
if (!CommList.empty())
{
SendMessage(hWndPort, CB_SETCURSEL, 0, 0);
}
}
{
std::vector<int> vSpeed = {
75,
110,
134,
150,
300,
600,
没有合适的资源?快使用搜索试试~ 我知道了~
Win32 api编写的串口助手源码与二进制
共20个文件
h:6个
cpp:6个
vcxproj:1个
需积分: 5 13 下载量 139 浏览量
2023-05-30
11:04:01
上传
评论 1
收藏 148KB ZIP 举报
温馨提示
封装串口常用操作, 使用Win32 api对话框做了简洁的UI界面 1.支持Unicode, UTF8, ANSI的字符串编码与十六进制收发数据 2.支持自定义自动发送数据, 可调整发送间隔时间(最低10毫秒) 3.自定义串口打开配置与超时配置 4.源码类简单封装window消息机制, 命令消息操作, 可以向MFC那样添加控件ID与事件, 使得win32编写窗口更加简洁, 使用如下: BEGIN_DLG_MESSAGE_MAP(CDialogSerialPort, CDialogBase) ON_DLG_MESSAGE(WM_INITDIALOG, &CDialogSerialPort::OnInitDialog) ON_DLG_MESSAGE(WM_TRAYICON, &CDialogSerialPort::OnTrayIcon) ON_DLG_MESSAGE(WM_CLOSE, &CDialogSerialPort::OnClose) END_DLG_MESSAGE_MAP() 不必写一堆switch和if else了
资源推荐
资源详情
资源评论
收起资源包目录
fc-serial-port.zip (20个子文件)
FCSerialPort
CDialogSerialPort.rc 8KB
CDialogSerialPort.cpp 28KB
resource.h 2KB
CAboutDialog.cpp 3KB
FCSerialPort.vcxproj 8KB
FCSerialPort.vcxproj.filters 3KB
CAboutDialog.h 618B
CWindow
CDialogBase.h 6KB
CDialogBase.cpp 8KB
main.cpp 518B
FCSerialPort.vcxproj.user 168B
CDialogSerialPort.aps 53KB
Win32Utils
CSerialPort.h 3KB
CStrUtils.cpp 7KB
CStrUtils.h 3KB
CSerialPort.cpp 8KB
icon.ico 44KB
CDialogSerialPort.h 3KB
Bin
x64
Release
FCSerialPort.exe 242KB
FCSerialPort.sln 1KB
共 20 条
- 1
资源评论
Flame_Cyclone
- 粉丝: 253
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功