串口实现
This commit is contained in:
parent
d3827b9cdb
commit
c4a1a02db5
@ -1,7 +1,7 @@
|
||||
#include "base_form.h"
|
||||
#include "serial_port.h"
|
||||
|
||||
const std::wstring BasicForm::kClassName = L"Basic";
|
||||
#define WM_USER_POS_CHANGED (WM_USER + 2)
|
||||
|
||||
BasicForm::BasicForm():
|
||||
mMonitorNewSelect(nullptr)
|
||||
@ -33,6 +33,39 @@ LRESULT BasicForm::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
if (uMsg == WM_USER_POS_CHANGED) {
|
||||
|
||||
}
|
||||
if (uMsg == WM_ADD_UART_MONITOR) {
|
||||
printf("add monitor");
|
||||
UartInfo* p = (UartInfo*)wParam;
|
||||
wprintf(L"%s", p->name.c_str());
|
||||
|
||||
ui::TreeNode* node = new ui::TreeNode;
|
||||
node->SetText(p->name);
|
||||
node->SetClass(L"listitem");
|
||||
node->SetFixedHeight(20);
|
||||
node->SetMargin({ 20, 0, 0, 0 });
|
||||
mMonitor->GetRootNode()->GetChildNode(0)->AddChildNode(node);
|
||||
|
||||
if (mUartForm.find(p->name) == mUartForm.end()) {
|
||||
auto form = new UartForm(p->name, p->baurate,
|
||||
p->data_bits, p->stop_bits, p->verify, p->flow_control);
|
||||
form->SetChildLayoutXML(L"basic/uart_form.xml");
|
||||
form->SetVisible(false);
|
||||
mUartForm[p->name] = form;
|
||||
}
|
||||
|
||||
node->AttachAllEvents([this](ui::EventArgs* ev){
|
||||
if (ui::EventType::kEventSelect == ev->Type) {
|
||||
mRightSide->RemoveAll();
|
||||
wprintf(L"%s\r\n",dynamic_cast<ui::TreeNode*> (ev->pSender)->GetText().c_str());
|
||||
UartForm* p = mUartForm[dynamic_cast<ui::TreeNode*> (ev->pSender)->GetText()];
|
||||
if (nullptr != p) {
|
||||
p->SetVisible(true);
|
||||
mRightSide->Add(mUartForm[dynamic_cast<ui::TreeNode*> (ev->pSender)->GetText()]);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
});
|
||||
}
|
||||
return WindowImplBase::HandleMessage(uMsg, wParam, lParam);
|
||||
}
|
||||
@ -45,14 +78,14 @@ void BasicForm::InitWindow()
|
||||
if (nullptr != btn_add_new) {
|
||||
btn_add_new->AttachClick([this](ui::EventArgs* args) {
|
||||
if (mMonitorNewSelect == nullptr) {
|
||||
mMonitorNewSelect = new NewMonitorForm();
|
||||
mMonitorNewSelect = new NewMonitorForm(this);
|
||||
mMonitorNewSelect->Create(this->GetHWND(), NewMonitorForm::kClassName.c_str(),
|
||||
WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX & WS_SIZEBOX, 0);
|
||||
mMonitorNewSelect->CenterWindow();
|
||||
mMonitorNewSelect->ShowModalFake(this->GetHWND());
|
||||
}
|
||||
else {
|
||||
mMonitorNewSelect = new NewMonitorForm();
|
||||
mMonitorNewSelect = new NewMonitorForm(this);
|
||||
mMonitorNewSelect->Create(this->GetHWND(), NewMonitorForm::kClassName.c_str(),
|
||||
WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX & WS_SIZEBOX, 0);
|
||||
mMonitorNewSelect->CenterWindow();
|
||||
@ -61,21 +94,21 @@ void BasicForm::InitWindow()
|
||||
return true;
|
||||
});
|
||||
}
|
||||
ui::TreeView* tree = dynamic_cast<ui::TreeView*>(FindControl(L"tree"));
|
||||
if (nullptr != tree) {
|
||||
mMonitor = dynamic_cast<ui::TreeView*>(FindControl(L"tree"));
|
||||
if (nullptr != mMonitor) {
|
||||
ui::TreeNode* node = new ui::TreeNode;
|
||||
node->SetText(nbase::StringPrintf(L"uart"));
|
||||
node->SetClass(L"listitem");
|
||||
node->SetFixedHeight(20);
|
||||
node->SetMargin({ 10, 0, 0, 0 });
|
||||
tree->GetRootNode()->AddChildNode(node);
|
||||
mMonitor->GetRootNode()->AddChildNode(node);
|
||||
|
||||
node = new ui::TreeNode;
|
||||
node->SetText(nbase::StringPrintf(L"tcp client"));
|
||||
node->SetClass(L"listitem");
|
||||
node->SetFixedHeight(20);
|
||||
node->SetMargin({ 10, 0, 0, 0 });
|
||||
tree->GetRootNode()->AddChildNode(node);
|
||||
mMonitor->GetRootNode()->AddChildNode(node);
|
||||
|
||||
|
||||
node = new ui::TreeNode;
|
||||
@ -83,34 +116,34 @@ void BasicForm::InitWindow()
|
||||
node->SetClass(L"listitem");
|
||||
node->SetFixedHeight(20);
|
||||
node->SetMargin({ 10, 0, 0, 0 });
|
||||
tree->GetRootNode()->AddChildNode(node);
|
||||
mMonitor->GetRootNode()->AddChildNode(node);
|
||||
|
||||
node = new ui::TreeNode;
|
||||
node->SetText(nbase::StringPrintf(L"udp client"));
|
||||
node->SetClass(L"listitem");
|
||||
node->SetFixedHeight(20);
|
||||
node->SetMargin({ 10, 0, 0, 0 });
|
||||
tree->GetRootNode()->AddChildNode(node);
|
||||
mMonitor->GetRootNode()->AddChildNode(node);
|
||||
|
||||
node = new ui::TreeNode;
|
||||
node->SetText(nbase::StringPrintf(L"udp server"));
|
||||
node->SetClass(L"listitem");
|
||||
node->SetFixedHeight(20);
|
||||
node->SetMargin({ 10, 0, 0, 0 });
|
||||
tree->GetRootNode()->AddChildNode(node);
|
||||
mMonitor->GetRootNode()->AddChildNode(node);
|
||||
|
||||
node = new ui::TreeNode;
|
||||
node->SetText(nbase::StringPrintf(L"udp group"));
|
||||
node->SetClass(L"listitem");
|
||||
node->SetFixedHeight(20);
|
||||
node->SetMargin({ 10, 0, 0, 0 });
|
||||
tree->GetRootNode()->AddChildNode(node);
|
||||
mMonitor->GetRootNode()->AddChildNode(node);
|
||||
}
|
||||
|
||||
ui::Window* ss = dynamic_cast<ui::Window*>(FindControl(L"ss"));
|
||||
if (nullptr != ss) {
|
||||
ss->SetWindowResourcePath(L"basic/newmonitor.xml");
|
||||
}
|
||||
mRightSide = dynamic_cast<ui::TabBox*>(FindControl(L"tab_side"));
|
||||
|
||||
mRightSide->RemoveAll();
|
||||
|
||||
}
|
||||
|
||||
LRESULT BasicForm::OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
|
||||
|
@ -16,6 +16,12 @@
|
||||
#include "ui_components/ui_components.h"
|
||||
#include "new_monitor_form.h"
|
||||
#include "uart_process.h"
|
||||
#include <vector>
|
||||
#include <map>
|
||||
|
||||
#define WM_USER_POS_CHANGED (WM_USER + 2)
|
||||
#define WM_ADD_UART_MONITOR (WM_USER + 3)
|
||||
|
||||
|
||||
class BasicForm : public ui::WindowImplBase
|
||||
{
|
||||
@ -46,5 +52,10 @@ public:
|
||||
static const std::wstring kClassName;
|
||||
private:
|
||||
NewMonitorForm* mMonitorNewSelect;
|
||||
ui::TabBox *mRightSide;
|
||||
ui::TreeView *mMonitor;
|
||||
|
||||
|
||||
std::map<std::wstring,UartForm*> mUartForm;
|
||||
|
||||
};
|
||||
|
@ -52,6 +52,8 @@ void MainThread::Init()
|
||||
ui::GlobalManager::Startup(L"resources\\", ui::CreateControlCallback(), false);
|
||||
#endif
|
||||
|
||||
|
||||
auto dpiManager = ui::DpiManager::GetInstance();
|
||||
// 创建一个默认带有阴影的居中窗口
|
||||
BasicForm* window = new BasicForm();
|
||||
window->Create(NULL, BasicForm::kClassName.c_str(), WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX & WS_SIZEBOX, 0);
|
||||
|
@ -6,6 +6,8 @@
|
||||
#include <windows.h>
|
||||
#include <iostream>
|
||||
#include <winspool.h>
|
||||
#include "serial_port.h"
|
||||
#include "base_form.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
@ -55,9 +57,10 @@ vector<wstring> EnumPortsWdm()
|
||||
return ret;
|
||||
}
|
||||
|
||||
NewMonitorForm::NewMonitorForm()
|
||||
{
|
||||
|
||||
NewMonitorForm::NewMonitorForm(ui::Window* parent)
|
||||
{
|
||||
m_parent = parent;
|
||||
}
|
||||
|
||||
NewMonitorForm::~NewMonitorForm()
|
||||
@ -96,10 +99,35 @@ void NewMonitorForm::InitWindow()
|
||||
}
|
||||
ui::Button* btn_add_new = dynamic_cast<ui::Button*>(FindControl(L"open_button"));
|
||||
if (nullptr != btn_add_new) {
|
||||
btn_add_new->SetText(L"退出");
|
||||
btn_add_new->AttachClick([this](ui::EventArgs*) {
|
||||
if(m_uart_select_combo->GetText() != L""){
|
||||
UINT PortNum = 0;
|
||||
for (int i = 3; m_uart_select_combo->GetText()[i] != '\0'; i++) //转换为数字
|
||||
{
|
||||
PortNum = PortNum * 10 + (m_uart_select_combo->GetText()[i] - '0');
|
||||
}
|
||||
if (1 == SerialPort::InitPort(PortNum, 115200, 0, 8, 0)) {
|
||||
// 打开成功
|
||||
MessageBox(0, L"打开成功", L"", 0);
|
||||
UartInfo* p = new UartInfo;
|
||||
p->name = m_uart_select_combo->GetText();
|
||||
p->baurate = 115200;
|
||||
p->data_bits = 8;
|
||||
p->flow_control = 0;
|
||||
p->verify = 0;
|
||||
p->stop_bits = 1;
|
||||
|
||||
auto succ = ::PostMessage(m_parent->GetHWND(), WM_ADD_UART_MONITOR, (WPARAM)p, 0);
|
||||
if (!succ) {
|
||||
printf("postmessage error :%d\r\n", GetLastError());
|
||||
}
|
||||
this->Close();
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
|
||||
}
|
||||
}
|
||||
return true;
|
||||
});
|
||||
}
|
||||
@ -160,6 +188,13 @@ void NewMonitorForm::InitWindow()
|
||||
m_uart_config_vbox = dynamic_cast<ui::VBox*>(FindControl(L"uart_config"));
|
||||
|
||||
m_uart_select_combo = dynamic_cast<ui::Combo*>(FindControl(L"uart_type"));
|
||||
m_uart_select_combo->AttachAllEvents([this](ui::EventArgs* ev) {
|
||||
if (ev->Type == 42) {
|
||||
|
||||
}
|
||||
return true;
|
||||
});
|
||||
|
||||
m_uart_baurate_select = dynamic_cast<ui::Combo*>(FindControl(L"uart_baurate_select"));
|
||||
|
||||
m_combo_type->AttachAllEvents([this](ui::EventArgs* ev) {
|
||||
|
@ -17,7 +17,7 @@
|
||||
class NewMonitorForm : public ui::WindowImplBase
|
||||
{
|
||||
public:
|
||||
NewMonitorForm();
|
||||
NewMonitorForm(ui::Window *);
|
||||
~NewMonitorForm();
|
||||
|
||||
/**
|
||||
@ -47,6 +47,7 @@ private:
|
||||
ui::Combo* m_uart_select_combo;
|
||||
ui::Combo* m_uart_baurate_select;
|
||||
ui::Combo* m_combo_type;
|
||||
ui::Window* m_parent;
|
||||
|
||||
};
|
||||
|
||||
|
@ -160,6 +160,7 @@
|
||||
<ClCompile Include="base_form.cpp" />
|
||||
<ClCompile Include="main.cpp" />
|
||||
<ClCompile Include="new_monitor_form.cpp" />
|
||||
<ClCompile Include="serial_port.cpp" />
|
||||
<ClCompile Include="uart_process.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
@ -167,6 +168,7 @@
|
||||
<ClInclude Include="main.h" />
|
||||
<ClInclude Include="new_monitor_form.h" />
|
||||
<ClInclude Include="resource1.h" />
|
||||
<ClInclude Include="serial_port.h" />
|
||||
<ClInclude Include="uart_process.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
@ -24,6 +24,12 @@
|
||||
<ClCompile Include="new_monitor_form.cpp">
|
||||
<Filter>源文件</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="uart_process.cpp">
|
||||
<Filter>源文件</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="serial_port.cpp">
|
||||
<Filter>源文件</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="main.h">
|
||||
@ -38,6 +44,12 @@
|
||||
<ClInclude Include="new_monitor_form.h">
|
||||
<Filter>头文件</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="uart_process.h">
|
||||
<Filter>头文件</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="serial_port.h">
|
||||
<Filter>头文件</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Xml Include="..\Debug\resources\themes\default\global.xml">
|
||||
|
@ -188,6 +188,7 @@ int SerialPort::InitPort(UINT PortNo, UINT Baud, byte Parity, byte Data, byte St
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int SerialPort::PortState(UINT PortNo)
|
||||
{
|
||||
map<int, HANDLE>::iterator iter;
|
||||
|
@ -5,6 +5,16 @@
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
||||
typedef struct{
|
||||
wstring name;
|
||||
uint32_t baurate;
|
||||
uint8_t data_bits;
|
||||
uint8_t stop_bits;
|
||||
uint8_t verify;
|
||||
uint8_t flow_control;
|
||||
}UartInfo;
|
||||
|
||||
class SerialPort
|
||||
{
|
||||
|
||||
|
@ -1,10 +1,65 @@
|
||||
#include "uart_process.h"
|
||||
|
||||
UartForm::UartForm()
|
||||
|
||||
UartForm::UartForm(std::wstring name,
|
||||
uint32_t baurate,
|
||||
uint8_t data_bits, uint8_t stop_bits,
|
||||
uint8_t verify, uint8_t flow_control)
|
||||
{
|
||||
m_name = name;
|
||||
m_baurate = baurate;
|
||||
m_data_bits = data_bits;
|
||||
m_stop_bits = stop_bits;
|
||||
m_verify = verify;
|
||||
m_flow_contro = flow_control;
|
||||
|
||||
}
|
||||
|
||||
|
||||
std:: string wstring2string(std::wstring wstr)
|
||||
{
|
||||
std::string result;
|
||||
//获取缓冲区大小,并申请空间,缓冲区大小事按字节计算的
|
||||
int len = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), NULL, 0, NULL, NULL);
|
||||
char* buffer = new char[len + 1];
|
||||
//宽字节编码转换成多字节编码
|
||||
WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), buffer, len, NULL, NULL);
|
||||
buffer[len] = '\0';
|
||||
//删除缓冲区并返回值
|
||||
result.append(buffer);
|
||||
delete[] buffer;
|
||||
return result;
|
||||
}
|
||||
|
||||
void UartForm::Init()
|
||||
{
|
||||
ui::ChildBox::Init();
|
||||
|
||||
auto mRightSide = dynamic_cast<ui::Label*> (FindSubControl(L"uart_info_label"));
|
||||
wchar_t p[100] = { 0 };
|
||||
wsprintf(p,L"串口号: %s 波特率%d 数据位: %d 停止位: %d ",
|
||||
m_name.c_str(),m_baurate,
|
||||
m_data_bits,m_stop_bits);
|
||||
mRightSide->SetText(std::wstring(p));
|
||||
|
||||
auto mEditSend = dynamic_cast<ui::RichEdit*>(FindSubControl(L"uart_send_edit"));
|
||||
auto mBtnSend = static_cast<ui::Button*>(FindSubControl(L"btn_send_data"));
|
||||
if (mBtnSend != nullptr) {
|
||||
mBtnSend->AttachClick([this, mEditSend](ui::EventArgs*) {
|
||||
|
||||
UINT PortNum = 0;
|
||||
for (int i = 3; m_name[i] != '\0'; i++) //转换为数字
|
||||
{
|
||||
PortNum = PortNum * 10 + (m_name[i] - '0');
|
||||
}
|
||||
|
||||
auto x = mEditSend->GetText();
|
||||
auto tmp = wstring2string(x);
|
||||
wprintf(L"%s\r\n", x.c_str());
|
||||
printf("%s\r\n", tmp.c_str());
|
||||
SerialPort::WritePort(PortNum, tmp.c_str(), tmp.size());
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
|
||||
// C runtime header
|
||||
#include <stdlib.h>
|
||||
@ -9,15 +10,27 @@
|
||||
|
||||
// base header
|
||||
#include "base/base.h"
|
||||
|
||||
#include "serial_port.h"
|
||||
// duilib
|
||||
#include "duilib/UIlib.h"
|
||||
|
||||
class UartForm : public ui::ChildBox
|
||||
{
|
||||
public:
|
||||
UartForm();
|
||||
UartForm(std::wstring name, uint32_t baurate,
|
||||
uint8_t data_bits,
|
||||
uint8_t stop_bits,
|
||||
uint8_t verify,
|
||||
uint8_t flow_control);
|
||||
|
||||
/// 重写父类方法,提供个性化功能,请参考父类声明
|
||||
virtual void Init() override;
|
||||
|
||||
std::wstring m_name;
|
||||
uint32_t m_baurate;
|
||||
uint8_t m_data_bits;
|
||||
uint8_t m_stop_bits;
|
||||
uint8_t m_verify;
|
||||
uint8_t m_flow_contro;
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user