当前位置: 首页 > news >正文

选择串口号STC串口收发通讯正常

选择串口号STC串口收发通讯正常

#include "stdafx.h"

#include "newa.h"

#include "newaDlg.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

class CAboutDlg : public CDialog

{

public:

CAboutDlg();

enum { IDD = IDD_ABOUTBOX };

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

protected:

DECLARE_MESSAGE_MAP()

};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

END_MESSAGE_MAP()

CNewaDlg::CNewaDlg(CWnd* pParent /*=NULL*/)

: CDialog(CNewaDlg::IDD, pParent)

{

//{{AFX_DATA_INIT(CNewaDlg)

m_count = _T("");

m_recmess = _T("");

m_sendmess = _T("");

//}}AFX_DATA_INIT

// Note that LoadIcon does not require a subsequent DestroyIcon in Win32

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

void CNewaDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CNewaDlg)

DDX_Control(pDX, IDC_COMSELECT, m_com);

DDX_Control(pDX, IDC_SENDDATA, m_clrsend);

DDX_Control(pDX, IDC_RECDATA, m_clrrec);

DDX_Control(pDX, IDC_OPENSEND, m_OPENSEND);

DDX_Control(pDX, IDC_MSCOMM1, m_Comm);

DDX_Text(pDX, IDC_COUNT, m_count);

DDX_Text(pDX, IDC_RECMESS, m_recmess);

DDX_Text(pDX, IDC_SENDMESS, m_sendmess);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CNewaDlg, CDialog)

//{{AFX_MSG_MAP(CNewaDlg)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_CBN_SELENDOK(IDC_COMSELECT, OnComselect)

ON_BN_CLICKED(IDC_OPENSEND, OnOpensend)

ON_BN_CLICKED(IDC_SENDDATA, OnSenddata)

ON_BN_CLICKED(IDC_RECDATA, OnRecdata)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CNewaDlg message handlers

BOOL CNewaDlg::OnInitDialog()

{

CDialog::OnInitDialog();

// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);

if (pSysMenu != NULL)

{

CString strAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX);

if (!strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

}

}

// Set the icon for this dialog. The framework does this automatically

// when the application's main window is not a dialog

SetIcon(m_hIcon, TRUE); // Set big icon

SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here

m_com.SetCurSel(2);

m_Comm.SetInputMode(1); //输入方式为二进制方式

m_Comm.SetInBufferSize(1024); //设置输入缓冲区大小

m_Comm.SetOutBufferSize(1024); //设置输出缓冲区大小,波特率4800无校验,8个数据位,2个停止位

//m_Comm.SetSettings("115200,n,8,1");

m_Comm.SetRThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件

m_Comm.SetSThreshold(1);//参数1表示当传输缓冲区完全空时将引发一个接收数据的OnComm事件

m_Comm.SetInputLen(0); //设置当前接收区数据长度为0

m_Comm.GetInput(); //先预读缓冲区以清除残留数据

if(!m_Comm.GetPortOpen())//判断串口的状态,如果是关闭状态,则打开

m_Comm.SetPortOpen(TRUE);//打开串口

return TRUE; // return TRUE unless you set the focus to a control

}

void CNewaDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

else

{

CDialog::OnSysCommand(nID, lParam);

}

}

// If you add a minimize button to your dialog, you will need the code below

// to draw the icon. For MFC applications using the document/view model,

// this is automatically done for you by the framework.

void CNewaDlg::OnPaint()

{

if (IsIconic())

{

CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle

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;

// Draw the icon

dc.DrawIcon(x, y, m_hIcon);

}

else

{

CDialog::OnPaint();

}

}

// The system calls this to obtain the cursor to display while the user drags

// the minimized window.

HCURSOR CNewaDlg::OnQueryDragIcon()

{

return (HCURSOR) m_hIcon;

}

BEGIN_EVENTSINK_MAP(CNewaDlg, CDialog)

//{{AFX_EVENTSINK_MAP(CNewaDlg)

ON_EVENT(CNewaDlg, IDC_MSCOMM1, 1 /* OnComm */, OnComm, VTS_NONE)

//}}AFX_EVENTSINK_MAP

END_EVENTSINK_MAP()

char HexChar(char c)//检测一个字符是不是十六进制字符,若是返回相应的值,否则返回0x10;

{ if((c>='0')&&(c<='9'))

return c-0x30;

else if((c>='A')&&(c<='F'))

return c-'A'+10;

else if((c>='a')&&(c<='f'))

return c-'a'+10;

else return 0x10;

}

int Str2Hex(CString str,CByteArray &data)

{//将一个字符串作为十六进制串转化为一个字节数组,字节间可用空格分隔,返回转换后的字节数组长度,同时字节数

int t,t1;

int rlen=0,len=str.GetLength();

data.SetSize(len/2);

for(int i=0;i<len;)

{char l,h=str[i];

if(h==' ')

{i++;

continue;

}

i++;

if(i>=len)break;

l=str[i];

t=HexChar(h);

t1=HexChar(l);

if((t==16)||(t1==16))

break;

else t=t*16+t1;

i++;

data[rlen]=(char)t;

rlen++;

}

data.SetSize(rlen);

return rlen;

}

void CNewaDlg::OnComm()

{

// TODO: Add your control notification handler code here

VARIANT m_input1;

COleSafeArray m_input2;

long length,i;

BYTE data[1024];

CString str;

m_count = _T("0");

UpdateData(FALSE); //更新编辑框内容

if(m_Comm.GetCommEvent()==2)//接收缓冲区内有字符

{

m_count = _T("1");

UpdateData(FALSE); //更新编辑框内容

m_input1=m_Comm.GetInput();//读取缓冲区内的数据

m_input2=m_input1;//将VARIANT型变量转换为ColeSafeArray型变量

length=m_input2.GetOneDimSize();//确定数据长度

for(i=0;i<length;i++)

m_input2.GetElement(&i,data+i);//将数据转换为BYTE型数组

m_count = _T("2");

UpdateData(FALSE); //更新编辑框内容

for(i=0;i<length;i++)//将数组转换为Cstring型变量

{

BYTE a=* (char *)(data+i);

str.Format("%02X ",a);

m_recmess+=str;

//UpdateData(FALSE); //更新编辑框内容

m_count = _T("3");

UpdateData(FALSE); //更新编辑框内容

}

}

UpdateData(FALSE);//更新编辑框内容

}

void CNewaDlg::OnComselect()

{

// TODO: Add your control notification handler code here

int i=9600;

CString temp;

temp.Format("%d,n,8,1",i);

m_Comm.SetSettings(temp);

if(m_Comm.GetPortOpen()) //

m_Comm.SetPortOpen(FALSE); //

m_Comm.SetCommPort(m_com.GetCurSel()+1); //

}

void CNewaDlg::OnOpensend()

{

if( !m_Comm.GetPortOpen())

m_Comm.SetPortOpen(TRUE);//打开串口

UpdateData(TRUE);

CByteArray data;

int len=Str2Hex(m_sendmess,data);

m_Comm.SetOutput(COleVariant(data));//发送数据

}

void CNewaDlg::OnSenddata()

{

// TODO: Add your control notification handler code here

m_sendmess= _T("");

m_count = _T("");

UpdateData(FALSE);

}

void CNewaDlg::OnRecdata()

{

// TODO: Add your control notification handler code here

m_recmess = _T("");

UpdateData(FALSE);

}

void CNewaDlg::OnOK()

{

// TODO: Add extra validation here

m_Comm.SetPortOpen(false);//关闭串口

CDialog::OnOK();

}

http://www.gsyq.cn/news/1635530.html

相关文章:

  • UnityHDRP数字人开发全流程与AI集成实战
  • DeepBump终极指南:3步实现AI驱动的3D纹理转换
  • AI绘画中文提示词生成“鬼画符”的根源与优化策略
  • 量子显微镜技术在皮米级芯片测试中的应用与突破
  • Python Pygame绘制2D坦克图形教程
  • Cocos Creator 3.8.7物理系统与动态碰撞体实战
  • Node.js+Vue构建高性能人员信息查询系统实战
  • KMX63与PIC18F96J94在HMI设计中的协同应用
  • 基于Python和CNN的花卉识别系统开发实践
  • 大数据BI工具中的分类预测模型实战指南
  • Windows 服务 Session 0 隔离:3 种方法实现服务与桌面用户界面交互
  • MLOps测试策略:从实验室到生产的模型质量保障
  • 2026免费图片去水印工具教程:网页端电脑手机无需下载、手机APP用法
  • SM4国密算法实战指南:从核心原理到Python代码实现
  • Python游戏开发入门:Pygame核心原理与实战
  • OpenClaw Skills开发指南:模块化AI能力扩展实战
  • Python单元测试实战:unittest与pytest框架对比与最佳实践
  • 千笔AI论文工具全流程实战与优化技巧
  • 计算机视觉入门:为何斯坦福CS231n仍是构建核心能力的基石?
  • AI自检机制:从代码审查到自我改进的技术架构与实践
  • 利用sinowealth-kb-tool逆向分析键盘固件:从原理到实战
  • 深度解析AirPlay 2协议在Windows平台的完整实现:技术架构揭秘与性能优化
  • 五款主流中文AI工具深度对比:按工作场景选对助手
  • AI自检机制:从概念到工程实践,构建AI开发的质量防线
  • 机器学习七步实战法:从问题定义到生产就绪的工程路径
  • 大模型RAG向量数据工程全链路实战解析
  • Qt桌面应用数据保护:AES与XOR混合加密方案设计与实现
  • Earth靶机渗透实战:从信息收集到权限提升的完整攻防演练
  • Prodigal实战指南:从宏基因组到单基因组的精准预测策略
  • 基于YOLO11的无NMS倒立摆角度识别系统设计与实现