ImageVerifierCode 换一换
格式:DOCX , 页数:49 ,大小:775.33KB ,
资源ID:7536566      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7536566.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(VC编写串口调试助手含VC6工程源文件.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

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

2、ws方面的。大学唯一学的编程语言是C语言,可根本不能理解用C做什么,还都还给老师10多年了,这怎么办?从BASIC,C/C+,JAVA,PASCAL搜索了一圈,还是选C+吧,毕竟是C语言发展而来,用VC环境,身边有可以请教的人。在网上转悠了很久,发现windows程序设计是必看,MFC Windows程序设计是学MFC最经典的书籍。OMG,这些书啊,都是上千页的,白天都在上班,哪有时间看哦,只有先下载下来作为参考资料了。扯远了啊。这也不行那也不行,怎么办呢?干脆硬着头皮上吧,找几个实例照搬,再修修改改加深理解吧。第一个目标,自己编写个串口调试助手,掌握串口通信编程,这样上位机的编写就有希望了。

3、好了,目标定下来了。网上下载了个串口调试助手,确定基本功能:1.自动寻找串口,并自动添加到下拉框中共选择;2.有波特率、数据位、停止位、校验位的选择设置;3.串口打开控制按钮;4.发送、清除按钮;5.接收是自动实现的;6.有定时自动发送功能;7.有传送文件功能;8.有状态栏显示,指示串口状态,设置参数和发送接收显示。下面就一步步实现,本人纯业余,只是记录下来这个学习过程,请勿拍砖。开发平台Visual C+6.0英文版,电脑是i7-2670Q四核8G内存1G独显的笔记本,装的win7 64位旗舰版,因此VC6兼容不是太好,有些小毛病,不过不影响编写。2. 创建MFC项目File - New -

4、 Projects选择MFC AppWizard(exe),项目名称commassist选择OK选中Dialog based,点击Next 。默认选项,点击Next ,继续默认选项,点击Next ,如果选中As a statically linked library,生产的EXE可直接在没装VC的机器上运行。可以在项目中进行更改。选择第二个CCommassistDlg,点击Finish点击OK。项目创建完毕,进入项目。删除界面上确定和取消按钮以及静态文字。3. 创建界面保存后便可以开始创建界面了。参考界面仿照设计的界面,具体添加按钮或编辑框等的布局步骤就不用细说了。4. 图标修改在资源视图中选

5、择Icon右键InsertIcon加入打开和关闭的Icon图标或自行绘制,如下图IDR_MAINFRAME原为MFC提供的图标,这里我直接改成自己的,生成EXE后将会显示这个图标。下面将帮助页面图标也改为自绘图标。在打开按钮旁边加入自绘的打开和关闭图标:先加入工具条中的Picture,然后选中右键看属性,并如图将Image选为默认的IDI_ICON_CLOSE。如下图5. 基本设置下面对各个按钮及编辑框设置进行描述右键串口对应的Combo Box,ID设置为IDC_COMLIST,Type设置为Drop List,Sort不选择(我系统是WIN7 64位,不选中反而自动排序,至于XP得试试看了

6、,以下的选择相同)。右键波特率对应的Combo Box,ID设置为IDC_BAUD,Type及Sort同上。右键数据位对应的Combo Box,ID设置为IDC_BDATA,Type及Sort同上。右键停止位对应的Combo Box,ID设置为IDC_BSTOP,Type及Sort同上。右键校验位对应的Combo Box,ID设置为IDC_CAL,Type及Sort同上。每个下拉框要点击右边的小箭头,然后将其拉长,不然显示不出内容。接收EDIT框ID设置为IDC_EDIT_RX。发送EDIT框ID设置为IDC_EDIT_TX。自动发送时间间隔的EDIT框ID设置为IDC_EDIT_TIMER。

7、选择文件后面的EDIT框ID设置为IDC_EDIT_FILEPATH。接收区的十六进制显示的Check Box复选框ID设置为IDC_CHECK_HEXRX。发送区的十六进制发送的Check Box复选框ID设置为IDC_CHECK_HEXTX。按钮“打开串口”ID设置为IDC_COMCONTROL。按钮“清空显示区”ID设置为IDC_BTN_CLRRX。按钮“手动发送”ID设置为IDC_BTN_HANDSEND。按钮“清空发送区”ID设置为IDC_BTN_CLRTX。按钮“自动发送”ID设置为IDC_BTN_AUTOSEND。按钮“选择文件”ID设置为IDC_BTN_SELCTFILE。按钮

8、“发送文件”ID设置为IDC_BTN_SENDFILE。6. 开始写代码6.1. 基本思路:因为串口通信部分代码我可能用在以后的单片机上位机上,因此考虑单独形成CPP和H文件,定义为comm.cpp和comm.h。在comm.cpp中编写串口创建、打开、关闭以及串口监听线程(用于自动接收)的代码,同时加入进制转换或显示的函数,这些在comm.h文件中申明,在主对话框中包含comm.h即可。想修改按钮样式,在网上搜了一圈,结果不轻松,最后确定创建新类来实现。6.2. 创建自定义按钮类:View - Class Wizard选择Add Class - New,名字MyButton,基类选择CBut

9、ton。在头文件 MyButton.h 中加入以下变量和函数定义:private: int m_Style; /按钮形状(0-正常,1-当前,2-按下,3-锁定) bool b_InRect; /鼠标进入标志 CString m_strText; /按钮文字 COLORREF m_ForeColor;/文本颜色 COLORREF m_MouseInColor;/鼠标进入时文本颜色 COLORREF m_BackColor;/背景颜色 COLORREF m_LockForeColor; /锁定按钮的文字颜色 CRect m_ButRect; /按钮尺寸 CFont* p_Font; /字体 vo

10、id DrawButton(CDC *pDC); /画正常按钮/ 接口函数public: MyButton(); void SetText(CString str); /设置文字 void SetForeColor(COLORREF color); /设置文本颜色 void SetBkColor(COLORREF color); /设置背景颜色 void SetTextFont(int FontHight,LPCTSTR FontName); /设置字体在 MyButton.cpp 的构造函数中初始化变量: m_Style = 1; /m_Style = 0; /按钮形状风格 b_InRect

11、 = 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添加下

12、列消息函数:PreSubclassWindow();DrawItem();onMouseMove();OnLButtonDown();OnLButtonUp();在各函数内加入代码:void MyButton:PreSubclassWindow() / TODO: Add your specialized code here and/or call the base class ModifyStyle( 0, BS_OWNERDRAW ); /设置按钮属性为自画式 /PreSubclassWindow()在按钮创建前自动执行,所以我们可以在其中做一些初始工作。 /这里只做了一项工作,就是为按钮

13、设置属性为“自绘”式,这样,用户在添加按钮后,就不需设置“Owner draw”属性了。 CButton:PreSubclassWindow();void MyButton:DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) / TODO: Add your code to draw the specified item CDC *pDC = CDC:FromHandle( lpDrawItemStruct-hDC ); m_ButRect = lpDrawItemStruct-rcItem; /获取按钮尺寸 if( m_strText.IsEmpty()

14、) GetWindowText( m_strText ); /获取按钮文本 int nSavedDC = pDC-SaveDC(); VERIFY( pDC ); DrawButton( pDC ); /绘制按钮 pDC-RestoreDC( nSavedDC ); /DrawItem()函数是一个关键函数,按钮的绘制工作就在这里进行,它的作用相当于对话框中的OnPaint()函数和视图中的OnDraw()函数。/这里我做了三项工作:获取按钮尺寸、获取按钮文本、绘制按钮。其中绘制工作在自定义函数DrawButton()中完成。以下就是绘制过程:void MyButton:DrawButton(

15、CDC *pDC) /调整状态 if( m_Style=3 ) m_Style = 0; if( GetStyle() & WS_DISABLED ) m_Style = 3; /禁止状态 /根据状态调整边框颜色和文字颜色 COLORREF bColor, fColor; /bColor为边框颜色,fColor为文字颜色 switch( m_Style ) case 0: bColor = RGB(192,192,192); fColor = m_ForeColor; break; /正常按钮 case 1: bColor = RGB(255,255,255); fColor = m_Fore

16、Color; break; /鼠标进入时按钮 case 2: bColor = RGB(192,192,192); fColor = m_MouseInColor; break; /按下的按钮 case 3: bColor = m_BackColor; fColor = m_LockForeColor; break; /锁定的按钮 /绘制按钮背景 CBrush Brush; Brush.CreateSolidBrush( m_BackColor ); /背景刷 pDC-SelectObject( &Brush ); CPen Pen; Pen.CreatePen(PS_SOLID, 3, bC

17、olor ); pDC-SelectObject( &Pen ); pDC-RoundRect(&m_ButRect,CPoint(10,10); /画圆角矩形 /绘制按钮按下时的边框 if( m_Style!=2 ) CRect Rect; 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 ); /画

18、文字 pDC-SetBkMode( TRANSPARENT ); pDC-DrawText( m_strText, &m_ButRect, DT_SINGLELINE | DT_CENTER | DT_VCENTER | DT_END_ELLIPSIS); /绘制拥有焦点按钮的虚线框 if( GetFocus()=this ) CRect Rect; Rect.SetRect( m_ButRect.left+3, m_ButRect.top+2, m_ButRect.right-3, m_ButRect.bottom-2 ); pDC-DrawFocusRect( &Rect ); /画拥有焦

19、点的虚线框 /变量 m_Style 表征当前按钮状态,它的取值为:0-正常,1-当前,2-按下,3-锁定。不同状态下按钮的边框颜色和文字颜色有所不同。/m_Style 的值在鼠标响应函数中进行修改。/绘制工作主要利用CDC类的绘图函数完成,主要注意在 m_Style 不同取值下表现出来的差别。void MyButton:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default m_Style = 2; Invalidate(); /重绘按钮 CB

20、utton:OnLButtonDown(nFlags, point);/OnLButtonDown()函数是单击鼠标左键时的消息函数。这里只是重新绘制按钮,具体的单击响应应该在拥有按钮的对话框或视图中进行。void MyButton:OnMouseMove(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default if( !b_InRect | GetCapture()!=this ) /鼠标进入按钮 b_InRect = true; /设置进入标志 SetCapture(

21、); /捕获鼠标 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_I

22、nRect是个标志,为true表示鼠标指针进入了按钮区域,/此时要捕获鼠标,让鼠标命令传送给按钮。当鼠标指针离开按钮时,要清除b_InRect标志,并且释放捕获的鼠标,让其它窗口可以接收鼠标命令。/Invalidate()函数用于更新按钮,它会自动调用DrawItem()函数重新绘制按钮。/设置条件的目的是仅在鼠标指针进入按钮和离开按钮时更新按钮,这样可以防止鼠标在按钮上移动时发生闪烁。void MyButton:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or ca

23、ll default m_Style = 1; Invalidate(); /重绘按钮 CButton:OnLButtonUp(nFlags, point);/OnLButtonUp()函数是单击鼠标左键后弹起时的消息函数。这里也只是重绘按钮,这样能使按钮在按下和弹起时有所不同,使按钮看上去有动态效果。/接口函数是用 CMyButton类 定义的按钮修改颜色、字体和按钮文字的接口,由以下函数组成:/设置按钮文本void MyButton:SetText(CString str) m_strText = _T(); SetWindowText(str); /设置文本颜色void MyButton

24、:SetForeColor(COLORREF color) m_ForeColor = color; Invalidate(); /设置背景颜色void MyButton:SetBkColor(COLORREF color) m_BackColor = color; Invalidate(); /设置字体(字体高度、字体名)void MyButton:SetTextFont(int FontHight,LPCTSTR FontName) if ( p_Font ) delete p_Font; /删除旧字体 p_Font = new CFont; p_Font-CreatePointFont(

25、 FontHight, FontName ); /创建新字体 SetFont( p_Font ); /设置字体 /由于新字体由 new 生成,必须显式回收,这项工作可以在 CMyButton类 的析构函数中进行:/*CMyButton:CMyButton() if ( p_Font ) delete p_Font; /删除字体 */这样一个可设置颜色、字体的按钮类就做好了。使用时,先在对话框中放置好按钮,再用 ClassWizard 为按钮添加控制变量,/并且将变量的类型设置为 CMyButton。之后,可以用该变量调用接口函数设置按钮颜色和字体。OK,自定义按钮完成。6.3. 实现过程及代码

26、:现在可以对按钮,EDIT框等控件添加变量,文字描述麻烦,上图。comm.cpp编写内容如下#include stdafx.h#include commassist.h#include commassistDlg.h#include comm.hchar ConvertHexChar(char ch);HANDLE hCom; /串口句柄CString strcomname; /串口名,如COM1bool ComIsOK; /串口打开状态标识,为真表示已打开,否则未打开/=自动寻找串口函数=/函数功能:通过扫描注册表来找出当前所有物理串口/输入参数:无/返回类型:无/说 明:若搜索成功,则每搜

27、到一个串口便发送消息通知主对话框,并将串口号以WPARAM传递void FindComm() /枚举当前系统中的串口 LONG result = 0; HKEY key = NULL; result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, /需要打开的主键的名称 HARDWAREDEVICEMAPSERIALCOMM, /需要打开的子键的名称,设备串口 0, /保留,必须设置为0 KEY_READ, /安全访问标记,也就是权限 &key); /得到的将要打开键的句柄,当不再需要句柄, /必须调用 RegCloseKey 关闭它 if( result ) AfxMe

28、ssageBox(无法获取串口,请确认是否安装并连接串口!); return; TCHAR portname250; /串口名 TCHAR data250; DWORD portnamelen = 0; /串口名长度 DWORD datalen = 0; int index = 0; while(1) /找完COM后跳出 portnamelen = 255; datalen = 255; result = RegEnumValue(key, /Long,一个已打开项的句柄,或者指定一个标准项名 index+, /Long,欲获取值的索引。注意第一个值的索引编号为零 portname, /Str

29、ing,用于装载位于指定索引处值名的一个缓冲区 &portnamelen, /Long,用于装载lpValueName缓冲区长度的一个变量。 /一旦返回,它会设为实际载入缓冲区的字符数量 NULL, /Long,未用;设为零 NULL, /Long,用于装载值的类型代码的变量 (LPBYTE)data, /Byte,用于装载值数据的一个缓冲区 &datalen); /Long,用于装载lpData缓冲区长度的一个变量。 /一旦返回,它会设为实际载入缓冲区的字符数量 if( result ) break; /发送消息,WM_USER+1为自定义消息,即找到串口的,并将串口号COMx通过WPARAM参数传送给主对话框窗口 /:AfxGetMainWnd()-m_hWnd,获得主对话框句柄 /(WPARAM)(LPCTSTR)data,类型转换 :SendMessage(:AfxGetMainWnd()-m_hWnd,WM_FOUNDCOMM,(WPARAM)(LPCTSTR)data,0); RegCloseKey(key); /调用 RegCloseKey 关闭打开键的句柄/=自动寻找

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1