首页 VC编写串口调试助手含VC6工程源文件

VC编写串口调试助手含VC6工程源文件

举报
开通vip

VC编写串口调试助手含VC6工程源文件..-..word.zl-纯业余者用VC(MFC)编写串口调试助手序毕业到现在,转眼就做射频开发10年了,一直从事直放站、干放等通信边缘行业,从低噪放、锁相源、选频、功放到整机,射频就那么点东西,而且越来越集成化,软件无线电是必然趋势。做射频从业面会越来越窄,我知道所有人都会说,当你成为专家的时候,一切就都不是问题,可有几个真正的专家,再者说,射频需要经历的积累,只有实际工程做的越多越广,经历也就积累得越多,并不是一朝一夕能到达的。前不久突然觉得,我的射频模块控制要是也是自己来编程控制多好啊!那就得学单片机编程,学...

VC编写串口调试助手含VC6工程源文件
..-..word.zl-纯业余者用VC(MFC)编写串口调试助手序毕业到现在,转眼就做射频开发10年了,一直从事直放站、干放等通信边缘行业,从低噪放、锁相源、选频、功放到整机,射频就那么点东西,而且越来越集成化,软件无线电是必然趋势。做射频从业面会越来越窄,我知道所有人都会说,当你成为专家的时候,一切就都不是问题,可有几个真正的专家,再者说,射频需要经历的积累,只有实际工程做的越多越广,经历也就积累得越多,并不是一朝一夕能到达的。前不久突然觉得,我的射频模块控制要是也是自己来编程控制多好啊!那就得学单片机编程,学习上位机编程了,可我都不会啊,要不就先来整整上位机,windows方面的。大学唯一学的编程语言是C语言,可根本不能理解用C做什么,还都还给教师10多年了,这怎么办?从BASIC,C/C++,JAVA,PASCAL搜索了一圈,还是选C++吧,毕竟是C语言开展而来,用VC环境,身边有可以请教的人。在网上转悠了很久,发现?windows程序设计?是必看,?MFCWindows程序设计?是学MFC最经典的书籍。OMG,这些书啊,都是上千页的,白天都在上班,哪有时间看哦,只有先下载下来作为参考资料了。扯远了啊。这也不行那也不行,怎么办呢?干脆硬着头皮上吧,找几个实例照搬,再修修改改加深理解吧。第一个目标,自己编写个串口调试助手,掌握串口通信编程,这样上位机的编写就有希望了。好了,目标定下来了。网上下载了个串口调试助手,确定根本功能:1.自动寻找串口,并自动添加到下拉框中共选择;2.有波特率、数据位、停顿位、校验位的选择设置;3.串口翻开控制按钮;4.发送、去除按钮;5.接收是自动实现的;6.有定时自动发送功能;7.有传送文件功能;8.有状态栏显示,指示串口状态,设置参数和发送接收显示。下面就一步步实现,本人纯业余,只是记录下来这个学习过程,请勿拍砖。开发平台VisualC++6.0英文版,电脑是i7-2670Q四核8G存1G独显的笔记本,装的win764位旗舰版,因此VC6兼容不是太好,有些小毛病,不过不影响编写。创立MFC工程File->New->Projects选择MFCAppWizard(exe),工程名称massist选择OK选中Dialogbased,点击Next>。默认选项,点击Next>,继续默认选项,点击Next>,如果选中Asastaticallylinkedlibrary,生产的EXE可直接在没装VC的机器上运行。可以在工程中进展更改。选择第二个CmassistDlg,点击Finish点击OK。工程创立完毕,进入工程。删除界面上确定和取消按钮以及静态文字。创立界面保存后便可以开场创立界面了。参考界面仿照设计的界面,具体添加按钮或编辑框等的布局步骤就不用细说了。图标修改在资源视图中选择Icon右键InsertIcon参加翻开和关闭的Icon图标或自行绘制,如以下图IDR_MAINFRAME原为MFC提供的图标,这里我直接改成自己的,生成EXE后将会显示这个图标。下面将帮助页面图标也改为自绘图标。在翻开按钮旁边参加自绘的翻开和关闭图标:先参加工具条中的Picture,然后选中右键看属性,并如图将Image选为默认的IDI_ICON_CLOSE。如以下图根本设置下面对各个按钮及编辑框设置进展描述右键串口对应的boBox,ID设置为IDC_LIST,Type设置为DropList,Sort不选择(我系统是WIN764位,不选中反而自动排序,至于XP得试试看了,以下的选择一样)。右键波特率对应的boBox,ID设置为IDC_BAUD,Type及Sort同上。右键数据位对应的boBox,ID设置为IDC_BDATA,Type及Sort同上。右键停顿位对应的boBox,ID设置为IDC_BSTOP,Type及Sort同上。右键校验位对应的boBox,ID设置为IDC_CAL,Type及Sort同上。每个下拉框要点击右边的小箭头,然后将其拉长,不然显示不出容。接收EDIT框ID设置为IDC_EDIT_RX。发送EDIT框ID设置为IDC_EDIT_TX。自动发送时间间隔的EDIT框ID设置为IDC_EDIT_TIMER。选择文件后面的EDIT框ID设置为IDC_EDIT_FILEPATH。接收区的十六进制显示的CheckBox复选框ID设置为IDC_CHECK_HEXRX。发送区的十六进制发送的CheckBox复选框ID设置为IDC_CHECK_HEXTX。按钮“翻开串口〞ID设置为IDC_CONTROL。按钮“清空显示区〞ID设置为IDC_BTN_CLRRX。按钮“手动发送〞ID设置为IDC_BTN_HANDSEND。按钮“清空发送区〞ID设置为IDC_BTN_CLRTX。按钮“自动发送〞ID设置为IDC_BTN_AUTOSEND。按钮“选择文件〞ID设置为IDC_BTN_SELCTFILE。按钮“发送文件〞ID设置为IDC_BTN_SENDFILE。开场写代码根本思路:因为串口通信局部代码我可能用在以后的单片机上位机上,因此考虑单独形成CPP和H文件,定义为m.cpp和m.h。在m.cpp中编写串口创立、翻开、关闭以及串口监听线程(用于自动接收)的代码,同时参加进制转换或显示的函数,这些在m.h文件中申明,在主对话框中包含m.h即可。想修改按钮样式,在网上搜了一圈,结果不轻松,最后确定创立新类来实现。创立自定义按钮类:View->ClassWizard选择AddClass->New,名字MyButton,基类选择CButton。在头文件MyButton.h中参加以下变量和函数定义:private:intm_Style;//按钮形状(0-正常,1-当前,2-按下,3-锁定)boolb_InRect;//鼠标进入标志CStringm_strText;//按钮文字COLORREFm_ForeColor;//文本颜色COLORREFm_MouseInColor;//鼠标进入时文本颜色COLORREFm_BackColor;//背景颜色COLORREFm_LockForeColor;//锁定按钮的文字颜色CRectm_ButRect;//按钮尺寸CFont*p_Font;//字体voidDrawButton(CDC*pDC);//画正常按钮//接口函数public:MyButton();voidSetText(CStringstr);//设置文字voidSetForeColor(COLORREFcolor);//设置文本颜色voidSetBkColor(COLORREFcolor);//设置背景颜色voidSetTextFont(intFontHight,LPCTSTRFontName);//设置字体在MyButton.cpp的构造函数中初始化变量:m_Style=1;//m_Style=0;//按钮形状风格b_InRect=false;//鼠标进入标志m_strText=_T("");//按钮文字(使用默认文字)m_ForeColor=RGB(0,0,0);//文字颜色(黑色)m_MouseInColor=RGB(0,0,255);//鼠标进入时文字颜色(蓝色)m_BackColor=RGB(230,230,230);//m_BackColor=RGB(243,243,243);//背风光(灰白色)m_LockForeColor=GetSysColor(COLOR_GRAYTEXT);//锁定按钮的文字颜色p_Font=NULL;//字体指针用ClassWizard添加以下消息函数:PreSubclassWindow();DrawItem();onMouseMove();OnLButtonDown();OnLButtonUp();在各函数参加代码:voidMyButton::PreSubclassWindow(){//TODO:Addyourspecializedcodehereand/orcallthebaseclassModifyStyle(0,BS_OWNERDRAW);//设置按钮属性为自画式//PreSubclassWindow()在按钮创立前自动执行,所以我们可以在其中做一些初始工作。//这里只做了一项工作,就是为按钮设置属性为“自绘〞式,这样,用户在添加按钮后,就不需设置“Ownerdraw〞属性了。CButton::PreSubclassWindow();}voidMyButton::DrawItem(LPDRAWITEMSTRUCTlpDrawItemStruct){//TODO:AddyourcodetodrawthespecifieditemCDC*pDC=CDC::FromHandle(lpDrawItemStruct->hDC);m_ButRect=lpDrawItemStruct->rcItem;//获取按钮尺寸if(m_strText.IsEmpty())GetWindowText(m_strText);//获取按钮文本intnSavedDC=pDC->SaveDC();VERIFY(pDC);DrawButton(pDC);//绘制按钮pDC->RestoreDC(nSavedDC);}//DrawItem()函数是一个关键函数,按钮的绘制工作就在这里进展,它的作用相当于对话框中的OnPaint()函数和视图中的OnDraw()函数。//这里我做了三项工作:获取按钮尺寸、获取按钮文本、绘制按钮。其中绘制工作在自定义函数DrawButton()中完成。以下就是绘制过程:voidMyButton::DrawButton(CDC*pDC){//调整状态if(m_Style==3)m_Style=0;if(GetStyle()&WS_DISABLED)m_Style=3;//制止状态//根据状态调整边框颜色和文字颜色COLORREFbColor,fColor;//bColor为边框颜色,fColor为文字颜色switch(m_Style){case0:bColor=RGB(192,192,192);fColor=m_ForeColor;break;//正常按钮case1:bColor=RGB(255,255,255);fColor=m_ForeColor;break;//鼠标进入时按钮case2:bColor=RGB(192,192,192);fColor=m_MouseInColor;break;//按下的按钮case3:bColor=m_BackColor;fColor=m_LockForeColor;break;//锁定的按钮}//绘制按钮背景CBrushBrush;Brush.CreateSolidBrush(m_BackColor);//背景刷pDC->SelectObject(&Brush);CPenPen;Pen.CreatePen(PS_SOLID,3,bColor);pDC->SelectObject(&Pen);pDC->RoundRect(&m_ButRect,CPoint(10,10));//画圆角矩形//绘制按钮按下时的边框if(m_Style!=2){CRectRect;Rect.SetRect(m_ButRect.left+1,m_ButRect.top+1,m_ButRect.right,m_ButRect.bottom);pDC->DrawEdge(&Rect,BDR_RAISEDINNER,BF_RECT);//画边框}//绘制按钮文字pDC->SetTextColor(fColor);//画文字pDC->SetBkMode(TRANSPARENT);pDC->DrawText(m_strText,&m_ButRect,DT_SINGLELINE|DT_CENTER|DT_VCENTER|DT_END_ELLIPSIS);//绘制拥有焦点按钮的虚线框if(GetFocus()==this){CRectRect;Rect.SetRect(m_ButRect.left+3,m_ButRect.top+2,m_ButRect.right-3,m_ButRect.bottom-2);pDC->DrawFocusRect(&Rect);//画拥有焦点的虚线框}}//变量m_Style 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 征当前按钮状态,它的取值为:0-正常,1-当前,2-按下,3-锁定。不同状态下按钮的边框颜色和文字颜色有所不同。//m_Style的值在鼠标响应函数中进展修改。//绘制工作主要利用CDC类的绘图函数完成,主要注意在m_Style不同取值下表现出来的差异。voidMyButton::OnLButtonDown(UINTnFlags,CPointpoint){//TODO:Addyourmessagehandlercodehereand/orcalldefaultm_Style=2;Invalidate();//重绘按钮CButton::OnLButtonDown(nFlags,point);}//OnLButtonDown()函数是单击鼠标左键时的消息函数。这里只是重新绘制按钮,具体的单击响应应该在拥有按钮的对话框或视图中进展。voidMyButton::OnMouseMove(UINTnFlags,CPointpoint){//TODO:Addyourmessagehandlercodehereand/orcalldefaultif(!b_InRect||GetCapture()!=this)//鼠标进入按钮{b_InRect=true;//设置进入标志SetCapture();//捕获鼠标m_Style=2;//m_Style=1;//设置按钮状态Invalidate();//重绘按钮}else{if(!m_ButRect.PtInRect(point))//鼠标离开按钮{b_InRect=false;//去除进入标志ReleaseCapture();//释放捕获的鼠标m_Style=1;//m_Style=0;//设置按钮状态Invalidate();//重绘按钮}}CButton::OnMouseMove(nFlags,point);}//onMouseMove()函数是鼠标移动消息函数,用于判定当前鼠标指针是否在按钮上。b_InRect是个标志,为true表示鼠标指针进入了按钮区域,//此时要捕获鼠标,让鼠标命令传送给按钮。当鼠标指针离开按钮时,要去除b_InRect标志,并且释放捕获的鼠标,让其它窗口可以接收鼠标命令。//Invalidate()函数用于更新按钮,它会自动调用DrawItem()函数重新绘制按钮。//设置条件的目的是仅在鼠标指针进入按钮和离开按钮时更新按钮,这样可以防止鼠标在按钮上移动时发生闪烁。voidMyButton::OnLButtonUp(UINTnFlags,CPointpoint){//TODO:Addyourmessagehandlercodehereand/orcalldefaultm_Style=1;Invalidate();//重绘按钮CButton::OnLButtonUp(nFlags,point);}//OnLButtonUp()函数是单击鼠标左键后弹起时的消息函数。这里也只是重绘按钮,这样能使按钮在按下和弹起时有所不同,使按钮看上去有动态效果。//接口函数是用CMyButton类定义的按钮修改颜色、字体和按钮文字的接口,由以下函数组成://设置按钮文本voidMyButton::SetText(CStringstr){m_strText=_T("");SetWindowText(str);}//设置文本颜色voidMyButton::SetForeColor(COLORREFcolor){m_ForeColor=color;Invalidate();}//设置背景颜色voidMyButton::SetBkColor(COLORREFcolor){m_BackColor=color;Invalidate();}//设置字体(字体高度、字体名)voidMyButton::SetTextFont(intFontHight,LPCTSTRFontName){if(p_Font)deletep_Font;//删除旧字体p_Font=newCFont;p_Font->CreatePointFont(FontHight,FontName);//创立新字体SetFont(p_Font);//设置字体}///由于新字体由new生成,必须显式回收,这项工作可以在CMyButton类的析构函数中进展:/*CMyButton::~CMyButton(){if(p_Font)deletep_Font;//删除字体}*///这样一个可设置颜色、字体的按钮类就做好了。使用时,先在对话框中放置好按钮,再用ClassWizard为按钮添加控制变量,//并且将变量的类型设置为CMyButton。之后,可以用该变量调用接口函数设置按钮颜色和字体。OK,自定义按钮完成。实现过程及代码:现在可以对按钮,EDIT框等控件添加变量,文字描述麻烦,上图。m.cpp编写容如下#include"stdafx.h"#include"massist.h"#include"massistDlg.h"#include"m.h"charConvertHexChar(charch);HANDLEh;//串口句柄CStringstrname;//串口名,如"1"boolIsOK;//串口翻开状态标识,为真表示已翻开,否那么未翻开//============自动寻找串口函数=================================//函数功能:通过扫描注册表来找出当前所有物理串口//输入参数:无//返回类型:无//说明:假设搜索成功,那么每搜到一个串口便发送消息通知主对话框,并将串口号以WPARAM传递voidFindm(){//枚举当前系统中的串口LONGresult=0;HKEYkey=NULL;result=RegOpenKeyEx(HKEY_LOCAL_MACHINE,//需要翻开的主键的名称"HARDWARE\\DEVICEMAP\\SERIALM",//需要翻开的子键的名称,设备串口0,//保存,必须设置为0KEY_READ,//平安访问标记,也就是权限&key);//得到的将要翻开键的句柄,当不再需要句柄,//必须调用RegCloseKey关闭它if(result){AfxMessageBox("无法获取串口,请确认是否安装并连接串口!");return;}TCHARportname[250];//串口名TCHARdata[250];DWORDportnamelen=0;//串口名长度DWORDdatalen=0;intindex=0;while(1)//找完后跳出{portnamelen=255;datalen=255;result=RegEnumValue(key,//Long,一个已翻开项的句柄,或者指定一个标准项名index++,//Long,欲获取值的索引。注意第一个值的索引编号为零portname,//String,用于装载位于指定索引处值名的一个缓冲区&portnamelen,//Long,用于装载lpValueName缓冲区长度的一个变量。//一旦返回,它会设为实际载入缓冲区的字符数量NULL,//Long,未用;设为零NULL,//Long,用于装载值的类型代码的变量(LPBYTE)data,//Byte,用于装载值数据的一个缓冲区&datalen);//Long,用于装载lpData缓冲区长度的一个变量。//一旦返回,它会设为实际载入缓冲区的字符数量if(result)break;//发送消息,WM_USER+1为自定义消息,即找到串口的,并将串口号"x"通过WPARAM参数传送给主对话框窗口//::AfxGetMainWnd()->m_hWnd,获得主对话框句柄//(WPARAM)(LPCTSTR)data,类型转换::SendMessage(::AfxGetMainWnd()->m_hWnd,WM_FOUNDM,(WPARAM)(LPCTSTR)data,0);}RegCloseKey(key);//调用RegCloseKey关闭翻开键的句柄}//============自动寻找串口函数完毕==================//==========串口翻开函数===========================//功能:翻开串口,将已翻开的串口句柄赋值给h,给出串口翻开状态IsOK,完成串口状态设置//输入参数:波特率,数据位,停顿位,校验位//返回类型:无voidOpenm(intnBaud,intnData,intnStop,intnCal){h=CreateFile(strname,//串口号GENERIC_READ|GENERIC_WRITE,//允许读或写0,//独占方式NULL,OPEN_EXISTING,//翻开而不是创立FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,//重叠方式,用于异步通信NULL);if(h==INVALID_HANDLE_VALUE){AfxMessageBox("翻开失败,串口不存在或已被占用!");IsOK=false;return;}IsOK=true;SetmMask(h,EV_TXEMPTY|EV_RXCHAR);//设置事件掩码,暂时没用上Setupm(h,1024,1024);//设置输入缓冲区和输出缓冲区的大小都是1024MTIMEOUTSTimeOuts;//设定读超时TimeOuts.ReadIntervalTimeout=MAXDWORD;TimeOuts.ReadTotalTimeoutConstant=0;TimeOuts.ReadTotalTimeoutMultiplier=0;//设定写超时TimeOuts.WriteTotalTimeoutConstant=500;TimeOuts.WriteTotalTimeoutMultiplier=100;if(SetmTimeouts(h,&TimeOuts)==false){CloseHandle(h);IsOK=false;return;}//串口属性配置DCBdcb;GetmState(h,&dcb);dcb.BaudRate=nBaud;//dcb.BaudRate=9600;//波特率为9600dcb.ByteSize=nData;//dcb.ByteSize=8;//每个字节为8位dcb.StopBits=nStop;//dcb.StopBits=ONESTOPBIT;//1位停顿位dcb.Parity=nCal;//dcb.Parity=NOPARITY;//无奇偶检验位SetmState(h,&dcb);Purgem(h,PURGE_TXCLEAR|PURGE_RXCLEAR);if(SetmState(h,&dcb)==false){CloseHandle(h);IsOK=false;return;}return;}//==========串口翻开函数完毕=====================//==========串口关闭控制函数=====================voidClosem(){CloseHandle(h);h=NULL;IsOK=false;}//==========串口关闭控制函数完毕==================//==========串口监听线程函数======================UINTThreadFunc(LPVOIDpParam){//CmassistDlg*pdlg=(CmassistDlg*)pParam;//定义指针指向主对话框STATStat;DWORDdwErrorFlags;while(IsOK){DWORDdwBytesRead=100;ClearmError(h,&dwErrorFlags,&Stat);dwBytesRead=min(dwBytesRead,(DWORD)Stat.cbInQue);if(!dwBytesRead){Sleep(10);//continue;//使用continue时,翻开串口后CPU占用率非常高}else::SendMessage(::AfxGetMainWnd()->m_hWnd,WM_READM,1,0);//发送消息,已读到}return0;}//==========串口监听线程函数完毕================//=================字符串转16进制显示==========//字符串转16进制显示的函数//传入参数Data为字符串//Blank_allow为空格允许标志,为真那么代表允许参加空格//函数返回为CString的结果sResultCStringDisplayCString2Hex(CStringData,boolBlank_allow){CStringsResult;CStringsTemp;intData_Length;Data_Length=Data.GetLength();if(Data_Length==0)return"";char*pchar=newchar[Data_Length];//用了new分配存空间,要记得释放strncpy(pchar,Data,Data_Length);for(inti=0;i='0')&&(ch<='9'))returnch-48;//0x30;elseif((ch>='A')&&(ch<='F'))returnch-'A'+10;elseif((ch>='a')&&(ch<='f'))returnch-'a'+10;elsereturn(-1);}//=================16进制转字符串显示=====================//16进制转字符串显示的函数//传入参数Data为16进制的字符串//函数返回为CString的结果sResultCStringDisplayHex2CString(CStringData){CStringsResult;CStringsTemp;intData_Length;Data_Length=Data.GetLength();if(Data_Length==0)return"";char*pchar=newchar[Data_Length];//用了new分配存空间,要记得释放strncpy(pchar,Data,Data_Length);for(inti=0;i1000后参加#include"MyButton.h"在//Construction后参加变量及函数CWinThread*pReceiveThread;voidShowStatus();intm_intTxt;intm_intRxt;BOOLm_bAutoSend;DWORDReadm();在massistDlg.cpp中参加头文件m.h#include"m.h"参加全局变量CStringstrIn;CStringstrOut;CStringm_strFile;变量初始化如///////////////////////////////////////////////////////////////////////////////CmassistDlgdialogCmassistDlg::CmassistDlg(CWnd*pParent/*=NULL*/):CDialog(CmassistDlg::IDD,pParent){//{{AFX_DATA_INIT(CmassistDlg)m_strTimer=_T("");m_strFilePath=_T("");m_strOut=_T("");m_strStatus=_T("");m_check_hexrx=FALSE;m_check_hextx=FALSE;//}}AFX_DATA_INIT//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);//下面就是自己添加的变量初始化m_strTimer="1000";m_strFilePath="请选择要发送的文件";m_intTxt=0;m_intRxt=0;m_bAutoSend=0;strIn="";strOut="";}在OnInitDialog函数中添加代码如下//TODO:Addextrainitializationherem_control.SetForeColor(RGB(255,0,0));Findm();//调用自动找串口函数m_list.SetCurSel(0);//设置串口号下拉框默认值为第一个m_baud.SetCurSel(6);//设置波特率下拉框默认值为9600m_bdata.SetCurSel(3);//设置数据位下拉框默认值为8位m_bstop.SetCurSel(0);//设置停顿位下拉框默认值为1m_cal.SetCurSel(0);//设置校验位下拉框默认值为None无GetDlgItem(IDC_BTN_HANDSEND)->EnableWindow(false);//设置手动发送按钮不可用GetDlgItem(IDC_BTN_AUTOSEND)->EnableWindow(false);//设置自动发送按钮不可用GetDlgItem(IDC_EDIT_TIMER)->EnableWindow(false);//设置发送间隔按钮不可用GetDlgItem(IDC_BTN_SELCTFILE)->EnableWindow(false);//设置选择文件按钮不可用GetDlgItem(IDC_BTN_SENDFILE)->EnableWindow(false);//设置发送文件按钮不可用ShowStatus();//下面语句用于解决程序运行后初始化EDIT框容被默认自动选中状态//返回值需更改为FALSEGetFocus();//获取焦点SetFocus();//设置焦点m_CEditStatus.SetSel(-1,-1,FALSE);//设置//PostMessage(EM_SETSEL,-1,0);returnFALSE;//returnTRUEunlessyousetthefocustoacontrol用ClassWizard添加WindowProc函数来处理自定义消息函数容如下://=====================消息处理函数===========================//功能:处理自定义消息=========================================LRESULTCmassistDlg::WindowProc(UINTmessage,WPARAMwParam,LPARAMlParam){//TODO:Addyourspecializedcodehereand/orcallthebaseclassswitch(message){caseWM_FOUNDM://已找到串口,串口号以字符串形式由wParam传递m_list.AddString((LPCTSTR)wParam);//用AddString添加一个字符串即号到m_list列表框中break;caseWM_READM://读串口消息Readm();break;}returnCDialog::WindowProc(message,wParam,lParam);}//=====================消息处理函数完毕=====================双击“翻开串口〞按钮编辑代码如下:voidCmassistDlg::Oncontrol(){//TODO:AddyourcontrolnotificationhandlercodehereintnBaud,nData,nStop,nCal,nTemp;CStringsTemp,siTemp;//波特率下拉框设置=================nTemp=m_baud.GetCurSel();switch(nTemp){case0:nBaud=CBR_110;break;case1:nBaud=CBR_300;break;case2:nBaud=CBR_600;break;case3:nBaud=CBR_1200;break;case4:nBaud=CBR_2400;break;case5:nBaud=CBR_4800;break;case6:nBaud=CBR_9600;break;case7:nBaud=CBR_14400;break;case8:nBaud=CBR_19200;break;case9:nBaud=CBR_38400;break;case10:nBaud=CBR_56000;break;case11:nBaud=CBR_57600;break;case12:nBaud=CBR_115200;break;case13:nBaud=CBR_128000;break;case14:nBaud=CBR_256000;break;}//数据位下拉框设置=================nTemp=m_bdata.GetCurSel();switch(nTemp){case0:nData=5;break;case1:nData=6;break;case2:nData=7;break;case3:nData=8;break;}//停顿位下拉框设置=================nTemp=m_bstop.GetCurSel();switch(nTemp){case0:nStop=ONESTOPBIT;break;case1:nStop=ONE5STOPBITS;break;case2:nStop=TWOSTOPBITS;break;}//校验位下拉框设置=================nTemp=m_cal.GetCurSel();switch(nTemp){case0:nCal=NOPARITY;break;case1:nCal=ODDPARITY;break;case2:nCal=EVENPARITY;break;case3:nCal=MARKPARITY;break;case4:nCal=SPACEPARITY;break;}intmnum_buf;mnum_buf=m_list.GetCurSel();if(mnum_buf<0){MessageBox("获取串口错误","错误",MB_ICONERROR);IsOK=FALSE;return;}m_list.GetLBText(mnum_buf,strname);if(!IsOK){Openm(nBaud,nData,nStop,nCal);//调用翻开串口函数Openm()if(IsOK)pReceiveThread=AfxBeginThread(ThreadFunc,this,THREAD_PRIORITY_LOWEST);//启动接收线程ShowStatus();if(!IsOK)m_control.SetWindowText("翻开串口");else{m_control.SetText("关闭串口");//按钮显示状态改变m_control.SetForeColor(RGB(0,155,0));//串口翻开后文本颜色变绿m_ctrlIcon.SetIcon((HICON)LoadImage(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON_OPEN),IMAGE_ICON,GetSystemMetrics(SM_CXICON),GetSystemMetrics(SM_CXICON),0));//显示翻开iconm_list.EnableWindow(false);//设置串口号下拉框不可用m_baud.EnableWindow(false);//设置波特率下拉框不可用m_bdata.EnableWindow(false);//设置数据位下拉框不可用m_bstop.EnableWindow(false);//设置停顿位下拉框不可用m_cal.EnableWindow(false);//设置校验位下拉框不可用GetDlgItem(IDC_BTN_HANDSEND)->EnableWindow(true);//设置手动发送按钮不可用GetDlgItem(IDC_BTN_AUTOSEND)->EnableWindow(true);//设置自动发送按钮可用GetDlgItem(IDC_EDIT_TIMER)->EnableWindow(true);//设置发送间隔按钮可用GetDlgItem(IDC_BTN_SELCTFILE)->EnableWindow(true);//设置选择文件按钮可用GetDlgItem(IDC_BTN_SENDFILE)->EnableWindow(true);//设置发送文件按钮可用}return;}else{Closem();//调用关闭串口函数Closem()//TerminateThread(pReceiveThread,0);ShowStatus();m_control.SetText("翻开串口");m_control.SetForeColor(RGB(255,0,0));m_ctrlIcon.SetIcon((HICON)LoadImage(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON_CLOSE),IMAGE_ICON,GetSystemMetrics(SM_CXICON),GetSystemMetrics(SM_CXICON),0));//显示关闭iconm_list.EnableWindow(true);//设置串口号下拉框可用m_baud.EnableWindow(true);//设置波特率下拉框可用m_bdata.EnableWindow(true);//设置数据位下拉框可用m_bstop.EnableWindow(true);//设置停顿位下拉框可用m_cal.EnableWindow(true);//设置校验位下拉框可用GetDlgItem(IDC_BTN_HANDSEND)->EnableWindow(false);//设置手动发送按钮不可用GetDlgItem(IDC_BTN_AUTOSEND)->EnableWindow(false);//设置自动发送按钮不可用GetDlgItem(IDC_EDIT_TIMER)->EnableWindow(false);//设置发送间隔按钮不可用GetDlgItem(IDC_BTN_SELCTFILE)->EnableWindow(false);//设置选择文件按钮不可用GetDlgItem(IDC_BTN_SENDFILE)->EnableWindow(false);//设置发送文件按钮不可用return;}}添加读串口函数,代码如下:DWORDCmassistDlg::Readm(){CStringstrTemp;OVERLAPPEDm_osRead;memset(&m_osRead,0,sizeof(OVERLAPPED));m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);charlpInBuffer[1024];DWORDdwBytesRead=1024;BOOLbReadStatus;bReadStatus=ReadFile(h,lpInBuffer,dwBytesRead,&dwBytesRead,&m_osRead);if(!bReadStatus)//如果ReadFile函数返回FALSE{if(GetLastError()==ERROR_IO_PENDING)//GetLastError()函数返回ERROR_IO_PENDING,说明串口正在进展读操作{WaitForSingleObject(m_osRead.hEvent,2000);//使用WaitForSingleObject函数等待,直到读操作完成或延时已到达2000ms//当串口读操作进展完毕后,m_osRead的hEvent事件会变为有信号Purgem(h,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);returndwBytesRead;}return0;}lpInBuffer[dwBytesRead]=NULL;strTemp=lpInBuffer;m_intRxt+=strTemp.GetLength();//接收到字节数统计//GetDlgItemText(IDC_EDIT_RX,strIn);strIn+=strTemp;OnCheckHexrx();ShowStatus();return1;}添加OnClose函数编辑代码如下:voidCmassistDlg::OnClose(){//TODO:Addyourmessagehandlercodehereand/orcalldefaultTerminateThread(pReceiveThread,0);//程序退出时,关闭串口监听线程WaitForSingleObject(pReceiveThread,INFINITE);CDialog::OnClose();}双击“手动发送〞按钮,编辑代码如下:UINTCmassistDlg::OnBtnHandsend(){//TODO:Addyourcontrolnotificationhandlercodehereif(IsOK==FALSE){MessageBox("请先翻开串口","提示",MB_ICONINFORMATION);return0;}BOOLbWriteStat;UpdateData(TRUE);CStringstr,sTemp;DWORDdwBytesWritten=1024;OVERLAPPEDm_osWrite;memset(&m_osWrite,0,sizeof(OVERLAPPED));m_osWrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);STATStat;DWORDdwErrorFlags;//dwBytesWritten=OnCheckHextx();GetDlgItem(IDC_EDIT_TX)->GetWindowTex
本文档为【VC编写串口调试助手含VC6工程源文件】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
ysdg83
从事建筑公司质量、技术
格式:doc
大小:956KB
软件:Word
页数:0
分类:教育学
上传时间:2021-09-21
浏览量:0