15,471
社区成员
发帖
与我相关
我的任务
分享
// A0317Dlg.cpp : 实现文件
//
#include "stdafx.h"
#include "A0317.h"
#include "A0317Dlg.h"
#include "afxdialogex.h"
#include "WinBase.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
// 对话框数据
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
// 新----------------------------------------------------------------------------------
//#define CM_RECEIVE WM_USER+100
const int CM_RECEIVE = WM_USER+100;
OVERLAPPED tOverLaped = {0}; //线程函数使用的OVERLAPPED结构
OVERLAPPED wOverLaped = {0}; // 写操作使用的
OVERLAPPED rOverLaped = {0}; // 读操作使用的OVERLAPPED结构
BOOL IsFun = FALSE; //线程是否运行
BOOL IsStop = FALSE; //数据是否发送完毕
DWORD ThreadFunction(LPVOID pParam) //线程函数
{
DWORD dwEvtMask,dwResult;
tOverLaped.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL); //创建一个事件
while(IsFun)
{ //等待一个事件发生 //
// WaitCommEvent(((CA0317Dlg*)AfxGetMainWnd())->hCom,&dwEvtMask,&tOverLaped); //等待窗口事件
//强制转换为其窗体的指针
dwResult = WaitForSingleObject(tOverLaped.hEvent,100);//如果事件没有信号,延时0.1秒
switch(dwResult)
{
case WAIT_OBJECT_0://事件对象有信号
switch(dwEvtMask)
{
case EV_RXCHAR: //接收到数据
{
if(IsStop)//发送停止
{
IsStop=FALSE; //发送消息,由消息处理函数接收数据
//::PostMessage(CM_RECEIVE);
::PostMessage(AfxGetMainWnd()->m_hWnd,CM_RECEIVE,0,(LPARAM)EV_RXCHAR); //AfxGetMainWnd()-> m_hWnd 主窗口的句柄
}
break;
}
}
break;
}
}
return 0;
}
//结束
CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
// CA0317Dlg 对话框
CA0317Dlg::CA0317Dlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CA0317Dlg::IDD, pParent)
, m_EditReceive(_T(""))
, m_Editsend(_T(""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CA0317Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT_Rev, m_EditReceive);
DDX_Text(pDX, IDC_EDIT_Sen, m_Editsend);
DDX_Control(pDX, IDC_COMBO1, m_comb1);
DDX_Control(pDX, IDC_COMBO2, m_comb2);
//DDX_Control(pDX, IDC_MSCOMM1, m_mscom);
}
BEGIN_MESSAGE_MAP(CA0317Dlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(CM_RECEIVE,OnRecieveData)
ON_BN_CLICKED(IDC_BUTTON_OPEN, &CA0317Dlg::OnBnClickedButtonOpen)
ON_BN_CLICKED(IDC_BUTTON_SEND, &CA0317Dlg::OnBnClickedButtonSend)
ON_BN_CLICKED(IDC_BUTTON_CLEAN, &CA0317Dlg::OnBnClickedButtonClean)
ON_BN_CLICKED(IDC_BUTTON_CLOSE, &CA0317Dlg::OnBnClickedButtonClose)
END_MESSAGE_MAP()
// CA0317Dlg 消息处理程序
BOOL CA0317Dlg::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); // 设置小图标
// TODO: 在此添加额外的初始化代码---------------------------------------============
CString str;
int i;
for(i=0;i<15;i++)
{
str.Format(_T("COM%d"),i+1);
m_comb1.InsertString(i,str); // 插入字符串
}
m_comb1.SetCurSel(0);
//选择波特率选择
CString str1[]={_T("9600"),_T("38400"),_T("115200"),_T("600")};
for(int i = 0; i < 4; i++)
{
int judge_tf=m_comb2.AddString(str1[i]); //按顺序添加字符串
if((judge_tf == CB_ERR)||(judge_tf == CB_ERRSPACE))
{
MessageBox(_T("build haud error"));
}
}
m_comb2.SetCurSel(0);
//--------------------------------------------------------------------============
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void CA0317Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CA0317Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(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 CA0317Dlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
} //152
void CA0317Dlg::OnBnClickedButtonOpen() //打开串口
{
CString str,str1,n;
//LPCTSTR
CString PortStr,BTLstr;
GetDlgItemText(IDC_BUTTON_OPEN,str); //读按钮显示的内容
CWnd *h1; //窗口类地址指针
h1 = GetDlgItem(IDC_BUTTON_OPEN); //H1指向 按钮OPEN
GetDlgItemText(IDC_COMBO1,PortStr);
GetDlgItemText(IDC_COMBO1,BTLstr); //取波特率字符串
int i_BTL = _ttoi(BTLstr); //转化为int
//PortStr = GetLBText();
// (m_comb1 + 1);
if(str==_T("打开串口")) //如果串口没有打开
{
//打开串口1 //允许读和写操作 //独占方式 //打开一个存在的串口 //异步方式打开
hCom = CreateFile(PortStr, GENERIC_READ|GENERIC_WRITE, 0, NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
NULL );
//hCom = CreateFile(PortStr,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
if (hCom==INVALID_HANDLE_VALUE)
{
//MessageBox("端口打开失败.");
return;
}
else
{
str=_T("关闭串口");
UpdateData(true); //读数据
h1->SetWindowText(str); //变更显示按钮为串口关闭
}
DCB dcb;
if(IsFun == FALSE) // 这条语句执行了
{
//设置串口
SetupComm(hCom,10240,10240); //设置发送和接收缓冲区大小
//设置串口信息
GetCommState(hCom,&dcb);
dcb.BaudRate = 115200;//i_BTL;//
dcb.fBinary = TRUE;
dcb.fParity = FALSE;//TRUE;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;//ODDPARITY;
dcb.StopBits = ONESTOPBIT;
if (!SetCommState(hCom,&dcb))
{ //A
// MessageBox("设置失败.","提示");
return;
} //A
if (!SetCommMask(hCom,EV_RXCHAR | EV_TXEMPTY))
{ //B
//MessageBox("掩码设置失败.","提示");
return;
} //B
DWORD param;
hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunction,¶m,0,&dwThreadID);
if (hThread==INVALID_HANDLE_VALUE)
{ //C
//MessageBox("线程创建失败.","提示",64);
return;
} //C
IsFun = TRUE;
//UartRStatus = 0;
//
// ((CWnd*)GetDlgItem(IDC_RADIO1))->EnableWindow(false);// 让按钮失效
// ((CWnd*)GetDlgItem(IDC_RADIO2))->EnableWindow(false);
//m_ComMode = 0;
}
}
else // 如果显示的是关闭串口
{ //关闭串口
CloseHandle(hCom);
str=_T("打开串口");
UpdateData(true); //读数据
h1->SetWindowText(str); //变更显示按钮为串口关闭
IsFun = FALSE;
//
//((CWnd*)GetDlgItem(IDC_RADIO1))->EnableWindow(true);
//((CWnd*)GetDlgItem(IDC_RADIO2))->EnableWindow(true);
}
UpdateData(FALSE);
}//函数结束括号
void CA0317Dlg::OnBnClickedButtonSend() //发送数据的程序
{
//
//
//CByteArray senddata;
DWORD res;
DWORD factdata = 0;
UpdateData(true);
unsigned char nArray[20];
wOverLaped.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL); // 创建一个事件对象
int len=String2Hex(m_Editsend,nArray); //此处返回的len可以用于计算发送了多少个十六进制数
IsStop = FALSE;
//unsigned char *ptr = new unsigned char[len];
//for(int i = 0;i<len;i++)
//{nArray[i] = senddata[i]-'0';}
//nArray[0]=0X11;
//nArray[1]=0X33;
//nArray[2]=0X77;
//int len = 3;
// strncpy(a,(LPCTSTR)str,sizeof(a)); (m_Editsend)
// senddata.SetSize(len);
//------------------------------------------------------
if (WriteFile(hCom,nArray,len,&factdata,&wOverLaped))
{
IsStop = TRUE;
//MessageBox("发送成功");
}
else
{
res = WaitForSingleObject(wOverLaped.hEvent,5000); //延时5秒,等待数据发送
if (WAIT_OBJECT_0 == res) //如果事件处于有信号状态,表示发送完成
{
IsStop = TRUE;
//MessageBox("发送成功");
}
else {
IsStop = FALSE;
//MessageBox("发送失败");
}
//
Sleep(1000); //延时1秒钟
}
//m_mscom.put_Output(COleVariant(senddata));// 把发送编辑框的数据发出去 COleVariant 不明白
}
void CA0317Dlg::OnBnClickedButtonClean() // 清除数据
{
//
// m_EditReceive=_T("");
// m_EditReceive+=nArray[0];
UpdateData(false);
}
//BEGIN_EVENTSINK_MAP(CA0317Dlg, CDialogEx)
// ON_EVENT(CA0317Dlg, IDC_MSCOMM1, 1, CA0317Dlg::OnCommMscomm1, VTS_NONE)
//END_EVENTSINK_MAP()
void CA0317Dlg::OnBnClickedButtonClose()
{
// TODO: 在此添加控件通知处理程序代码
}
// 串口接收函数
LRESULT CA0317Dlg::OnRecieveData(WPARAM wParam, LPARAM lParam)
{
DWORD res,factbyte;
char* DataBuffer = new char[1024];
memset(DataBuffer,0,1024); // 初始化数据缓冲区
COMSTAT rst;
ClearCommError(hCom,&res,&rst); // 清空串口错误标志 , 记录当前通信状态
rOverLaped.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL); // 创建一个事件对象
if (ReadFile(hCom,DataBuffer,rst.cbInQue,&factbyte,&rOverLaped)) // 读取数据到缓冲区中
{
DataBuffer[rst.cbInQue]= 0;
IsStop = FALSE;
}
else
{
res = WaitForSingleObject(rOverLaped.hEvent,5000);
}
IsStop = FALSE;
//m_EditReceive+=DataBuffer;
m_EditReceive+="a4";
UpdateData(FALSE);
return 0;
}
// 字符串转换为16进制 2 2 一组 ---------------------------------------下面均为功能函数