VC串口通信课设报告.docx
- 文档编号:9115694
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:19
- 大小:195.87KB
VC串口通信课设报告.docx
《VC串口通信课设报告.docx》由会员分享,可在线阅读,更多相关《VC串口通信课设报告.docx(19页珍藏版)》请在冰豆网上搜索。
VC串口通信课设报告
《数据通信网》课程报告
地点 通信实验室
时间 15周至 16周
学院信息工程学院
专业班级 通信082
姓 名 颜晶
同组成员钟文
学 号 40850209
指导教师 杨裕亮
2010年12月
串口通信课程设计报告
(
)课程设计的主要任务:
1.学习VC++中MSComm控件在串口编程中的使用;
2.使用MSComm控件完成双机串口字符通信,界面可以参考
QQ等即时通信软件的聊天窗口;
3.通过串口完成双机间文件数据的传输,提示:
构造简单的协
议控制文件传输。
界面形式根据自己喜好设计。
4.选做内容:
A)文件数据传输中的错误检测与重传。
提示:
使用CRC校
验。
B)文件传输中使用前向纠错技术,纠正传输中的错误。
提示:
使用汉明码。
(二)小组成员:
通信082班钟文4085
(三)串口通信原理:
所谓"串行通信"是指外设和计算机间使用一根数据信号线,数据在一根数据信号线上按位进行传输,每一位数据都占据一个固定的时间长度。
这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,当然,其传输速度比并行传输慢。
相比之下,由于高速率的要求,处于计算机内部的CPU与串口之间的通讯仍然采用并行的通讯方式,所以串行口的本质就是实现CPU与外围数据设备的数据格式转换(或者称为串并转换器),即当数据从外围设备输入计算机时,数据格式由位(bit)转化为字节数据;反之,当计算机发送下行数据到外围设备时,串口又将字节数据转化为位数据。
串行端口的本质功能是作为CPU和串行设备间的编码转换器。
当数据从CPU经过串行端口发送出去时,字节数据转换为串行的位。
在接收数据时,串行的位被转换为字节数据。
在Windows环境(WindowsNT、Win98、Windows2000)下,串口是系统资源的一部分。
应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。
串口信号线:
串口信号线的一个完整的RS-232C接口有22根线,采用标准的25芯插头座(或者9芯插头座)。
25芯和9芯的主要信号线相同。
以下的介绍是以25芯的RS-232C为例。
①主要信号线定义:
2脚:
发送数据TXD;3脚:
接收数据RXD;4脚:
请求发送RTS;5脚:
清除发送CTS;
6脚:
数据设备就绪DSR;20脚:
数据终端就绪DTR;8脚:
数据载波检测DCD;
1脚:
保护地;7脚:
信号地。
②电气特性:
数据传输速率最大可到20Kbps,最大距离仅15m.
注:
看了微软的MSDN6.0,其WindowsAPI中关于串行通讯设备(不一定都是串口RS-232C或RS-422或RS-449)速率的设置,最大可支持到RS_256000,即256Kbps!
也不知道到底是什么串行通讯设备?
但不管怎样,一般主机和单片机的串口通讯大多都在9600bps,可以满足通讯需求。
③接口的典型应用:
大多数计算机应用系统与智能单元之间只需使用3到5根信号线即可工作。
这时,除了TXD、RXD以外,还需使用RTS、CTS、DCD、DTR、DSR等信号线。
(当然,在程序中也需要对相应的信号线进行设置。
)
以上接法,在设计程序时,直接进行数据的接收和发送就可以了,不需要对信号线的状态进行判断或设置。
(如果应用的场合需要使用握手信号等,需要对相应的信号线的状态进行监测或设置。
“并行通信”是把一个字符的各数位用几条线同时进行传输,传输速度快,信息率高。
但它比串行通信所用的电缆多,故常用在传输距离较短(几米至几十米)、数据传输率较高的场合。
实现并行通信的接口就是并行接口。
并行接口可设计为只作为输入/输出接口,也可设计为既作为输入又作为输出的接口。
它可以用两种方法实现,一种是利用同一个接口中的两个通路,一个作输入通路,一个作输出通路;另一种使用同一个双向通路,既作为输入又作为输出。
连接设备接口有PS/2,PATA,LPT等串行通信是指数据一位一位地依次传输,每一位数据占据一个固定的时间长度。
其只要少数几条线就可以在系统间交换信息,特别适用于计算机与计算机、计算机与外设之间的远距离通信,连接设备接口有SATA,USB等。
串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线UniversalSerialBus或者USB混淆)。
大多数计算机包含两个基于RS232的串口。
串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。
同时,串口通信协议也可以用于获取远程采集设备的数据。
串口通信的概念非常简单,串口按位(bit)发送和接收字节。
尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。
它很简单并且能够实现远距离通信。
比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。
典型的串口用于ASCII码字符的传输。
通信使用3根线完成:
(1)地线,
(2)发送,(3)接收。
由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。
其他线用于握手,但是不是必须的。
串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。
对于两个进行通行的端口,这些参数必须匹配:
a,波特率:
这是一个衡量通信速度的参数。
它表示每秒钟传送的bit的个数。
例如300波特表示每秒钟发送300个bit。
当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz。
这意味着串口通信在数据线上的采样率为4800Hz。
通常电话线的波特率为14400,28800和36600。
波特率可以远远大于这些值,但是波特率和距离成反比。
高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。
b,数据位:
这是衡量通信中实际数据位的参数。
当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。
如何设置取决于你想传送的信息。
比如,标准的ASCII码是0~127(7位)。
扩展的ASCII码是0~255(8位)。
如果数据使用简单的文本(标准ASCII码),那么每个数据包使用7位数据。
每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。
由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。
c,停止位:
用于表示单个包的最后一位。
典型的值为1,1.5和2位。
由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。
因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。
适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
d,奇偶校验位:
在串口通信中一种简单的检错方式。
有四种检错方式:
偶、奇、高和低。
当然没有校验位也是可以的。
对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。
例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。
如果是奇校验,校验位位1,这样就有3个逻辑高位。
高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。
这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。
(四)程序开发过程:
建立应用程序工程yanjing
打开VC6.0,建立一个基于对话框的MFC的应用程序:
yanjing。
按照弹出的应用向导对话框依次填写,第一步选择基于对话框,其他均采用默认。
这样MFC向导便自动生成了一个名称为yanjing的工程。
②资源创建
(1)按图1-1添加控件设置好程序的主界面
图1-1
(2)照表1-1设置对话框的控件类型、ID及相关属性
表1-1对话框控件
控件
ID号
标题
功能
对应控件类
静态正文(StaticText)
默认
接受区
显示正文,一般不能接受输入信息。
CStatic
默认
发送区
编辑框(EditBox)
IDC_EDIT1
-
输入并编辑正文,支持单行和多行编辑.
CEdit
IDC_EDIT2
-
IDC_EDIT4
-
MSComm
IDC_MSCOMM
在程序中设置
串口参数设置
命令按钮(Pushbutton)
IDC_CLEAR
清除发送区
各按钮功能如标题所示
CButton
IDC_CLOSECOM
关闭串口
IDC_FILESEND
发送文件
IDC_OPENCOM
打开串口
IDC_SEND
发送字符
IDC_EXIT
退出程序
IDC_CLEARR
清除接受区
IDC_SAVE
保存文件
IDC_CHANGE
选择路径
IDC_ABOUT
版权所有
图1-2程序界面图
(3)添加成员变量,ctrl+w弹出ClassWizard对话框,在“MemberVariables”标签中,选中所需控件的ID号,依次按表1-2添加成员变量
图1-3添加成员变量图
表1-2
ControlIDs
Type
Member
IDC_CLEAR
CButton
m_Clear
IDC_CLOSECOM
CButton
m_Closecom
IDC_EDIT1
CString
m_strEdit1
IDC_EDIT2
CString
m_strEdit2
IDC_EDIT4
CString
m_strEdit4
IDC_FILESEND
CButton
m_Filesend
IDC_MSCOMM1
CMSComm
m_ctrlComm
IDC_OPENCOM
CButton
m_Opencom
IDC_SEND
CButton
m_Send
IDC_EXIT
CButton
m_Exit
(4)切换到MessageMaps标签页,为各个按钮按表1-3添加函数
图1-4添加函数图
表1-3
ControlIDs
MenberFunction
IDC_CLEAR
BN_CLICKED
IDC_CLOSECOM
BN_CLICKED
IDC_SAVE
BN_CLICKED
IDC_CHANGE
BN_CLICKED
IDC_ABOUT
BN_CLICKED
IDC_CLEARR
BN_CLICKED
IDC_FILESEND
BN_CLICKED
IDC_MSCOMM1
BN_CLICKED
IDC_OPENCOM
BN_CLICKED
IDC_SEND
BN_CLICKED
IDC_EXIT
BN_CLICKED
(5)美化界面添加图片
为使程序界面更加美观,可利用图片添加控件,自己绘制简单的图形添加在对话框界面的适当位置。
效果如图:
③函数代码实现
源代码主要可以分为如下几类:
(1)打开与设置串口接口函数以及关闭串口函数
(2)设置发送数据方式、缓冲区接口及发送数据接口函数
(3)设置串口接收数据方式、缓冲区接口及接收数据接口函数
(4)清除发送区接收区及退出程序
本次程序设计的重点难点部分主要是串口设置,发送与接收数据部分,下面具体介绍发送与接收部分的程序:
发送数据:
字符发送(此部分程序可实现数字,英文字符,汉字的发送)
oidCYanjingDlg:
:
OnSend()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(true);//读取编辑框内容
CByteArraysendArr;//创建存放字符串数据CByteArray类的实例
WORDwLength;
wLength=m_strEdit2.GetLength();
sendArr.SetSize(wLength);
for(inti=0;i { sendArr.SetAt(i,m_strEdit2.GetAt(i)); } m_ctrlComm.SetOutput(COleVariant(sendArr));//发送数据 if(wLength==i) AfxMessageBox("发送完毕! "); } 文件发送: voidCYanjingDlg: : OnFilesend() { //TODO: Addyourcontrolnotificationhandlercodehere FILE*pf; //externbooltg; //booltg; //tg=true; CByteArraysendData; intline=0; inti=0; longintFilelth; sendData.SetSize(17); BYTE*sendArr=newBYTE[17]; CFileDialogDlg(true); Dlg.m_ofn.lpstrFilter="文本文件(*.dat;*.txt)\0*.dat;*.txt\0AllFile(*.*)\0*.*\0\0"; CStringfnamee; if(IDOK==Dlg.DoModal()) { fnamee=Dlg.GetPathName(); fnamee.Replace("\\","\\\\"); CFileFileDlg(Dlg.GetFileName(),CFile: : modeRead); Filelth=FileDlg.GetLength(); FileDlg.Close(); } else { return; } pf=fopen(fnamee,"r+b"); CStringcs; cs.Format("%d",Filelth); //AfxMessageBox(cs); while(line*16 { if(line*16+16<=Filelth) { fseek(pf,line*16,0); for(intii=0;ii<16;ii++) fread(&sendArr[ii],1,1,pf); for(intj=0;j<16;j++) { sendData.SetAt(j,sendArr[j]); } m_ctrlComm.SetOutput(COleVariant(sendData)); CStringbb; } else { i=Filelth%16; fseek(pf,line*16,0); for(intii=0;ii fread(&sendArr[ii],1,1,pf); for(intj=0;j { sendData.SetAt(j,sendArr[j]); } m_ctrlComm.SetOutput(COleVariant(sendData)); } line++; } deletesendArr; if(Filelth==(line-1)*16+i) AfxMessageBox("发送完毕! "); fclose(pf); } (5)程序测试: 程序设计、调试完毕,用数据线将要进行串口通信的两台计算机连接起来,执行按钮“运行”,运行程序。 1.点击"打开串口"按钮,显示"端口已打开",此时可传送数据. 2.在我的程序的发送显示区写入字符"yan123",并点击"发送字符"按钮,此时,在对方的 消息接收显示区随即出现字符"yan123",此功能可以实现. 3.在我的程序中点击清除显示区按钮,刚才的写入的字符随即消失,此功能可以实现. 4.在我的程序中点击发送文件按钮,选择要发送的"Rec00"文本文档,对方接收区显示文 本中的内容,此功能可实现 5.对方发送字符"zhong111",我的接收区内即可显示"zhong111",接收字符功能可实现 6.对方发送文档后,我的接收区内即可显示文本内的内容,点击"选择路径"后选择要保 存的路径,即可在显示"F: \yanjing1",点击"保存文件"即可实现保存功能 7.点击"关闭串口"按钮,此时发送数据时显示"只有当串口打开时,操作有效",此功能可 实现. 8.点击作者简介按钮,随即弹出窗口,显示出本人信息,此功能可以实现. 9.点击退出程序按钮,程序自动关闭,此功能可以实现. 图1-5运行结果显示 1-5-1接收文件 1-5-2发送成功后显示1-5-3保存文件选择路径 注: 调试流程图 打开串口 发送数据接收数据 字符发送文件发送接收字符接收文件 选择路径保存文件 清除发送区清除接收区 关闭串口 退出程序 (5)调试心得: 我在本次课程设计中,主要应用的是MSComm控件在VC的MFC程序中控制串口实现数据传输的功能。 通过参考往届学长做好的实例以及老师同学的帮助,我在两周的时间内完成了本次课程设计的内容,程序运行结果满足了串口通信的基本要求。 在本次课程设计中,遇到了很多问题,但通过各种帮助都一一解决了,现在总结经验如下: 首先,最开始不知如何下手时,应该参照书上或资料介绍的实例一步步照着设计一遍,了解程序设计的总体过程,以后在自己设计的时候可以少走很多弯路。 其次,在参考别人程序实现一些功能的时候,要注意代码段中变量名是否一致,以及其中调用的函数在自己的程序中是否已经定义好。 如我在定义发送文件功能模块时,编译过程中提示说,程序段中的“access”函数没有定义,通过老师的帮助讲解后知道,在程序开头应该先做好如下定义“includeIo.h”。 最后,在调试过程中,我的接收数据部分一直不能正常显示,在老师帮忙修改后也不成功,最后在与他人程序仔细对比后发现,代码段中串口初始化部分缺少一部分程序,添加后完成后,就能正常接收数据了。 因此,在添加程序实现功能的过程中,一定要保证程序的完整性一致性。 (七)同组成员程序设计特点: 钟文同学的设计主要功能包括: 发送字符,文件;接收并保存文件;清空发送区和接收区: 退出程序。 不同之处是他为程序主界面设置了颜色,并添加了图片,使界面更加美观。 (八)帮助 在程序的编写过程中,我主要是借助教材,了解程序设计的主题流程,在正式设计的过程中,综合参考了往届同学的实例。 在编译运行的过程中遇到了很多问题,主要是借助老师以及研究生学长的帮助。 在添加图片的过程中,主要受钟文同学的指导,非常感谢。 学生签字: 颜晶 2010年12月30日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 串口 通信 报告