计算机串口通信服务的开发与应用.doc

上传人:wux****ua 文档编号:9035331 上传时间:2020-04-02 格式:DOC 页数:25 大小:503KB
返回 下载 相关 举报
计算机串口通信服务的开发与应用.doc_第1页
第1页 / 共25页
计算机串口通信服务的开发与应用.doc_第2页
第2页 / 共25页
计算机串口通信服务的开发与应用.doc_第3页
第3页 / 共25页
点击查看更多>>
资源描述
毕业设计说明书(论文)作 者: 高宇 学 号: 0707240515 学 院:自动化工程学院 班 级: 自动075班 专 业:自动化 测控技术与仪器所 在 系:控制科学与工程 仪器科学与技术题 目: 计算机串口通信服务的开发与应用 指导者: 辛红伟 签字: 评阅者: 2011 年 6 月 吉 林摘 要 串口调试助手是串口通信常用的软件之一,广泛的应用于教学、科研等领域。串口调试助手是专门测试串口通信用的,比如说有设备要发送数据到pc处理或保存,这时候就可以直接用串口调试助手接收查看发送来的数据,供分析用等等。本文介绍了如何使用VC+制作串口调试助手,串口调试助手的一些基本用途的和使用方法。硬件要求能运行Windows 9X/2000/XP的PC机,配有两个串行口。软件环境要求Visual C+6.0, Windows 9X/2000/XP。要求串口调试助手支持各种串口设置,如波特率,校验位、数据位和停止位等等。支持ASCII/Hex发送,发送和接收的数据可以在16进制和AscII码之间任意转换。可以自动在发送的数据尾增加校验位,支持多种校验格式。支持间隔发送,循环发送,批处理发送,输入数据可以从外部文件导入,并且能够自动将接收到的数据保存到磁盘文件。支持常用的300-115200bps波特率,能设置校验、数据位和停止位,能以ASCII码或十六进制接收或发送任何数据或字符(包括中文),可以任意设定自动发送周期,并能将接收数据保存成文本文件,能发送任意大小的文本文件。12目前较为常用的串口有9针串口(DB9)和25针串口(DB25),通信距离较近时(12m),可以用电缆线直接连接标准RS232端口(RS422,RS485较远),若距离较远,需附加调制解调(MODEM)。最为简单且常用的是三线制接法,即地、接收数据和发送数据三脚相连。3关键词:VC+;串口调试;波特率ABSTRACTSerial communication serial port debugging assistant is one of commonly used software, widely used in teaching, researching and other fields. Serial Debug Assistant is specifically used for the test serial communication, such as a device sending data to the pc deal or save, This time we can directly view receiver with a serial debugging assistant sent to the data for analysis and so on. This article describes how to use the VC + + debugging serial production assistant, assistant serial debugging some of the basic purposes and use. Hardware requirements to run Windows 9X/2000/XP PC, equipped with two serial ports. Software environment requires Visual C + +6.0, Windows 9X/2000/XP. Assistant required to support a variety of serial port debugging settings such as baud rate, parity, data bits and stop bits and so on. Supports ASCII / Hex send, send and receive data can be between 16 hex and AscII any code conversion. The data can be automatically added at the end to send parity bit, support for multiple validation format. Support for sending interval, circular sent, batch transmission, the input data can be imported from an external file, and can receive data automatically saved to disk file. Support the common 300-115200bps baud rate, setting the parity, data bits and stop bits, can hexadecimal ASCII code or data or to receive or send any characters (including Chinese), can be set automatically send cycle, and can receive data saved as text files, can send a text file of any size. Now more commonly used 9-pin serial port (DB9) and 25-pin serial port (DB25), while the short distance communication (Member Viariables选项卡,选择CSCommTestDlg类,为IDC_MSCOMM1添加控制变量:m_ctrlComm,这时你可以看一看,在对话框头文件中自动加入了/AFX_INCLUDES() i nclude mscomm.h /AFX_INCLUDES (这时运行程序,如果有错,那就再从头开始)。3.2.4.在对话框中添加控件 向主对话框中添加两个编辑框,一个用于接收显示数据ID为IDC_EDIT_RXDATA,另一个用于输入发送数据,ID为IDC_EDIT_TXDATA,再添加一个按钮,功能是按一次就把发送编辑框中的内容发送一次,将其ID设为IDC_BUTTON_MANUALSEND。别忘记了将接收编辑框的PropertiesStyles中把Miltiline和Vertical Scroll属性选上,发送编辑框若你想输入多行文字,也可选上Miltiline。再打开ClassWizardMember Viariables选项卡,选择CSCommTestDlg类, 为IDC_EDIT_RXDATA添加CString变量m_strRXData, 为IDC_EDIT_TXDATA添加CString变量m_strTXData。说明: m_strRXData和m_strTXData分别用来放入接收和发送的字符数据。3.2.5.添加串口事件消息处理函数OnComm 打开ClassWizardMessage Maps,选择类CSCommTestDlg,选择IDC_MSCOMM1,双击消息OnComm,将弹出的对话框中将函数名改为OnComm,(好记而已)OK。这个函数是用来处理串口消息事件的,如每当串口接收到数据,就会产生一个串口接收数据缓冲区中有字符的消息事件,我们刚才添加的函数就会执行,我们在OnComm()函数加入相应的处理代码就能实现自已想要的功能了。请你在函数中加入如下代码:void CSCommTestDlg:OnComm() / TODO: Add your control notification handler code here VARIANT variant_inp; COleSafeArray safearray_inp; LONG len,k; BYTE rxdata2048; /设置BYTE数组 An 8-bit integerthat is not signed. CString strtemp; if(m_ctrlComm.GetCommEvent()=2) /事件值为2表示接收缓冲区内有字符 /以下你可以根据自己的通信协议加入处理代码 variant_inp=m_ctrlComm.GetInput(); /读缓冲区 safearray_inp=variant_inp; /VARIANT型变量转换为ColeSafeArray型变量 len=safearray_inp.GetOneDimSize(); /得到有效数据长度 for(k=0;klen;k+) safearray_inp.GetElement(&k,rxdata+k);/转换为BYTE型数组 for(k=0;kMessage Maps,选择类CSCommTestDlg,选择IDC_BUTTON_MANUALSEND,双击BN_CLICKED添加OnButtonManualsend()函数,并在函数中添加如下代码:void CSCommTestDlg:OnButtonManualsend() / TODO: Add your control notification handler code hereUpdateData(TRUE); /读取编辑框内容m_ctrlComm.SetOutput(COleVariant(m_strTXData);/发送数据运行程序,在发送编辑框中随意输入点什么,单击发送按钮,啊!看看,在另一端的串口调试助手(或别的调试工具)接收框里出现了什么。如果你真是初次涉猎串口编程,又一次成功,那该说声谢谢我了,因为我第一次做串口程序时可费劲了,那时网上的资料也不好找。开开玩笑,谢谢你的支持,有什么好东西别忘了给我寄一份。最后说明一下,由于用到VC控件,在没有安装VC的计算机上运行时要从VC中把mscomm32.ocx、msvcrt.dll、mfc42.dll拷到Windows目录下的System子目录中(win2000为System32)并再进行注册设置,请参考如何手工注册MSComm控件。3.2.8.发送十六进制字符在主对话框中加入一个复选接钮,ID为IDC_CHECK_HEXSEND Caption: 十六进制发送,再利用ClassWizard为其添加控制变量:m_ctrlHexSend; 在ClassView中为SCommTestDlg类添加以下两个PUBLIC成员函数,并输入相应代码;/由于这个转换函数的格式限制,在发送框中的十六制字符应该每两个字符之间插入一个空隔/如:A1 23 45 0B 00 29/CByteArray是一个动态字节数组,可参看MSDN帮助int CSCommTestDlg:String2Hex(CString str, CByteArray &senddata)int hexdata,lowhexdata;int hexdatalen=0;int len=str.GetLength();senddata.SetSize(len/2);for(int i=0;i=len)break;lstr=stri;hexdata=ConvertHexChar(hstr);lowhexdata=ConvertHexChar(lstr);if(hexdata=16)|(lowhexdata=16)break;else hexdata=hexdata*16+lowhexdata;i+;senddatahexdatalen=(char)hexdata;hexdatalen+;senddata.SetSize(hexdatalen);return hexatalen;/这是一个将字符转换为相应的十六进制值的函数/好多C语言书上都可以找到/功能:若是在0-F之间的字符,则转换为相应的十六进制字符,否则返回-1char CSCommTestDlg:ConvertHexChar(char ch) if(ch=0)&(ch=A)&(ch=a)&(ch=f)return ch-a+10;else return (-1);再将CSCommTestDlg:OnButtonManualsend()修改成以下形式:void CSCommTestDlg:OnButtonManualsend() / TODO: Add your control notification handler code hereUpdateData(TRUE); /读取编辑框内容if(m_ctrlHexSend.GetCheck()CByteArray hexdata;int len=String2Hex(m_strTXData,hexdata); /此处返回的len可以用于计算发送了多少个十六进制数m_ctrlComm.SetOutput(COleVariant(hexdata); /发送十六进制数据else m_ctrlComm.SetOutput(COleVariant(m_strTXData);/发送ASCII字符数据现在,你先将串口线接好并打开串口调试助手V2.1,选上以十六制显示,设置好相应串口,然后运行我们这个程序,在发送框中输入00 01 02 03 A1 CC等十六进制字符,并选上以十六进制发送,单击手动发送,在串口调试助手的接收框中应该可以看到00 01 02 03 A1 CC了。183.2.9.在接收框中以十六进制显示在主对话框中加入一个复选接钮,IDC_CHECK_HEXDISPLAY Caption: 十六进制显示,再利用ClassWizard为其添加控制变量:m_ctrlHexDiaplay。 然后修改CSCommTestDlg:OnComm()函数:void CSCommTestDlg:OnComm() / TODO: Add your control notification handler code hereVARIANT variant_inp;COleSafeArray safearray_inp;LONG len,k;BYTE rxdata2048; /设置BYTE数组 An 8-bit integerthat is not signed.CString strtemp;if(m_ctrlComm.GetCommEvent()=2) /事件值为2表示接收缓冲区内有字符variant_inp=m_ctrlComm.GetInput(); /读缓冲区safearray_inp=variant_inp; /VARIANT型变量转换为ColeSafeArray型变量len=safearray_inp.GetOneDimSize(); /得到有效数据长度for(k=0;klen;k+)safearray_inp.GetElement(&k,rxdata+k);/转换为BYTE型数组for(k=0;klen;k+) /将数组转换为Cstring型变量BYTE bt=*(char*)(rxdata+k); /字符型if(m_ctrlHexDisplay.GetCheck()strtemp.Format(%02X ,bt); /将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔else strtemp.Format(%c,bt); /将字符送入临时变量strtemp存放m_strRXData+=strtemp; /加入接收编辑框对应字符串 UpdateData(FALSE); /更新编辑框内容测试:在串口调试助手发送框中输入十六进制字符,并选上以十六进制发送,单击手动发送,在本程序运行后选上以十六进制显示,在串口调试助手中单击手动发送或自动发送,则在本程序的接收框中应该可以看到了。3.2.10.如何设置自动发送 最简单的设定自动发送周期是用SetTimer()函数,这在数据采集中很有用,在控制中指令的传送也可能用到定时发送。 方法是:在ClassWizard中选上MessageMap卡,然后在Objects IDs选中CSCommTestDlg类,再在Messages框中选上WM_TIMER消息,单击ADD_FUNCTION加入void CSCommTestDlg:OnTimer(UINT nIDEvent) 函数,这个函数是放入“时间到”后要处理的代码:void CSCommTestDlg:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or call defaultOnButtonManualsend();CDialog:OnTimer(nIDEvent);再在在主对话框中加入一个复选接钮,ID为IDC_CHECK_AUTOSEND Caption: 自动发送(周期1秒),再利用ClassWizard为其添加BN_CLICK消息处理函数void CSCommTestDlg:OnCheckAutosend():void CSCommTestDlg:OnCheckAutosend() / TODO: Add your control notification handler code herem_bAutoSend=!m_bAutoSend;if(m_bAutoSend)SetTimer(1,1000,NULL);/时间为1000毫秒elseKillTimer(1); /取消定时其中:m_bAutoSend为BOOL型变量,在CLASSVIEW中为CSCommTestDlg类加入,并在构造函数中初始化: m_bAutoSen=FALSE;现在可以运行程序测试了1920。第4章 调 试打开制作好的哦调试助手,运行自己编写的程序。在串口调试著手中选择COM2并且打开,此时指示灯呈高亮状态。程序SCOMMrEST,打开COM1。此时在SCimmTest的发送输入编辑01 0b,并点击发送按钮后,此时COM1就将数据发送出去,COM2收到这些数据。已经串口调试助手中COM2打开,因此这些文本信息在串口助手的接收区中。21显示结果如下图4-1图4-1显示结果图结 论 使用控件MSComm进行串口通信软件的编写和制作是完全可行的,MSComm控件对于编写字符格式的通信程序比较方便,但是要编写字节通信程序则比较麻烦,特别是当要对所有数据分别处理的场合下。总的来说C+builder中使用MSCOmm控件有几个不变: (1)设置InpuMode 属性(接受数据类型)时经常发生不明错误,这样必须在程序中通过语句来定义;(2)不管是何种格式的通信都必须先将接受或发送变量定义为O leV ariant 类型再进行转换;(3)在字节通信时若要对各个字节分别处理,要经过多次转换,实现起来比较麻烦。但总的来说,控件MSComm使串行通信编程变得非常简单、方便,我所制作的串口调试助手就是一个很好的列证。参考文献1 龚建伟,熊光明.Visual C+/Turbo C串口通信编程实践M.电子工业出版社.2004.2 陈雪飞。C+builder实例入门。中国青年出版社.20063 李长林,高洁.Visual C+串口通信技术与典型实例.清华大学出版社.20064 张维君,王珠忠,索世文. 基于PC机串口与DS18B20的单线多点温度测量. 仪表技术与传感器,2009,4:52-54 5 Allen Denver.Serial Communication in Win32DB. Microsoft Development Network. 6 Kate Gregory.Special Edition Using Visual C+DB.Microsoft Development Network.7 张筠,刘书智.VisualC+实践与提高-串口通信与工程应用篇M. 中国铁道出版社,2006.8 赵彦锋,李钢.基于Win32 API的多线程串行通信程序设计J. 9 陈磊松,许华荣.串口通讯Linux 操作系统中的应用J.漳州师范学院学报,2005(2):37-41.10 张仿彦、赛奎春等.Delphi接口技术开发实例解析.北京:机械工业出版社,2007.1张仿彦、赛奎春等.Delphi接口技术开发实例解析.北京:机械工业出版社,2007.111 黄军、熊勇、刘燕、刘晓梅等.Delphi串口通信编程.北京:人民邮电出版社,2001.812 刘瑞新.Delphi2005程序设计教程.北京:机械工业出版社,2005.713 王险峰,刘宝宏.Windows环境下的多线程编程原理与应用M.北京:清华大学出版社,2002.14 汪翔,袁辉.Visual C+实践与提高网络编程篇M.北京:中国铁道出版社,2001.15 谭思亮,邹超群.Visual C+串口通信工程开发实例导航M.北京:人民邮电出版社,2003.16 阚能琪. VC+串口通信中多线程技术的应用研究. 西华大学学报,2005,4:84-8817 郭晓鹏,李存斌.Visual C+高级编程及其项目应用开发M.北京:中国水利水电出版社,2004.18 张锦,张俊.深入学习:Win32系统服务开发与实例M.北京:电子工业出版社,2001.19 李凌.Winsock 2网络编程实用教程M.北京:清华大学出版社,2003.20 雷斌,杨建华,黄超,何斌.Visual C+ 6.0网络编程技术M.北京:人民邮电出版社,2000.21 乔林,杨志刚.Visual C+ 6.0高级编程技术MFC与多线程篇M.北京:中国铁道出版社,2000.致 谢在论文完成之际,我要特别感谢我的指导教师辛红伟,由于我个人理论水平还有待提高,难免有许多考虑不周全的地方,但因为有了辛老师的督促指导使得我的论文得以顺利的接近尾声。杨老师渊博的专业知识、深厚的学术素养、严谨的治学态度、精益求精的工作作风、诲人不倦的高尚师德对我影响深远,也是我永远学习的榜样,并将积极影响我今后的学习和工作,使我终身受益。在此,谨向辛老师表示崇高的敬意和衷心的感谢! 并祝愿他身体健康,全家幸福! 感谢所有关心、支持、帮助过我的良师益友。 最后,向在百忙中抽出时间对本文进行评审并提出宝贵意见的各位领导表示衷心地感谢
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!