微机原理及应用课程设计报告.docx
- 文档编号:11030225
- 上传时间:2023-02-24
- 格式:DOCX
- 页数:11
- 大小:303.15KB
微机原理及应用课程设计报告.docx
《微机原理及应用课程设计报告.docx》由会员分享,可在线阅读,更多相关《微机原理及应用课程设计报告.docx(11页珍藏版)》请在冰豆网上搜索。
微机原理及应用课程设计报告
微机原理及应用
课程设计
设计题目:
基于PC机串行通信的点到点文件传输系统
专 业 计算机科学与技术
班 级 计104
学 生 D
指导教师
2013 年 秋季学期
目录 2
一、实验目的 3
二、实验内容及要求 3
三、课设基本思想 3
四、程序流程图以及程序设计 5
(一)、程序流程图:
5
(二)、程序设计思想:
5
五.实验结果截图 6
六.程序源代码 7
七.课程设计心得体会 14
八.参考文献 15
1、实验目的
1.学习虚拟串口的使用方法。
2.学会在windows平台上进行串口通信的方法。
二、实验内容及要求
1.基本要求:
采用VB,VC,C#或其他开发工具设计一个简易的聊天系统。
用户可以设置波特率或采用自动协商机制。
界面如下图:
2.设计提示:
在Windows平台上通过API或MSComn控件实现串行通信。
3.进一步设计要求:
采用多线程完成通信任务。
三、课设基本思想
1.在.NET平台下使用C#创建串口通信程序,.NET2.0提供了串口通信的功能,其命名空间是System.IO.Ports。
这个新的框架不但可以访问计算机上的串口,还可以和串口设备进行通信。
我们将使用标准的RS232C在PC间通信。
它工作在全双工模式下,而且我们不打算使用任何的握手或流控制器,而是使用无modem连接。
2.串口的硬件知识:
在数据传输的时候,每个字节的数据通过单个的电缆线传输。
包包括开始位,数据,结束为。
一旦开始位传出,后面就会传数据,可能是5,6,7或8位,就看你的设定了。
发送和接收必须设定同样的波特率和数据位数。
3.关于本程序使用SerialPort的一些属性和方法:
属性:
BytesToRead
获取接收缓冲区中数据的字节数。
Encoding
获取或设置传输前后文本转换的字节编码。
NewLine
获取或设置用于解释ReadLine和WriteLine方法调用结束的值。
PortName
获取或设置通信端口,包括但不限于所有可用的COM端口。
方法:
Close
关闭端口连接,将IsOpen属性设置为false,并释放内部Stream对象。
GetPortNames
获取当前计算机的串行端口名称数组。
Open
打开一个新的串行端口连接。
ReadByte
从SerialPort输入缓冲区中同步读取一个字节。
Write(Byte[],Int32,Int32)
使用缓冲区的数据将指定数量的字节写入串行端口。
Read(Byte[],Int32,Int32)
从SerialPort输入缓冲区读取一些字节并将那些字节写入字节数组中指定的偏移量处。
4、程序流程图以及程序设计
(1)
、程序流程图:
N
Y
Y N
N
Y
(二)、程序设计思想:
首先需要定义一个SerialPort对象,添加DataReceived事件响应收到数据。
然后利用系统提供函数获取当前端口号,以及用户选择的波特率,对对象进行初始化。
通过两边建立起来的串口连接的缓冲区,进行数据的交互。
这样便实现里串口点对点的字符串聊天。
对于实现二进制文件的传输,主要通过的是利用list<>来进行缓冲区数据的读取,同时自己约定好所用的文件协议。
通过对数组文件的分析来判断是否是合法的数据,通过对校验位的检查确定是否是正确的数据,对于不正确的数据,我采用的是直接丢弃不予处理的政策。
至此,便是整个程序的基本思想。
五.实验结果截图
程序主界面:
设置界面:
运行结果:
六.程序源代码
1.主界面部分:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.IO.Ports;
usingSystem.Text.RegularExpressions;
namespacewindows_test
{
publicpartialclassMain:
Form
{
privateSerialPortsp=newSerialPort();
privateStringBuilderTheString=newStringBuilder();
privateboolListening=false;//是否没有执行完invoke相关操作
privateboolClosing=false;//是否正在关闭串口,执行Application.DoEvents,并阻止再次invoke
publicstaticstring[]ports;
privateList
privatebyte[]B_data=newbyte[10];//自定义数据格式,由2个字节的头文件+一个字节的长度+最后一位的校验位而来DD22061122334455668E
publicMain()
{
InitializeComponent();
}
privatevoidForm1_Load(objectsender,EventArgse)
{
ports=SerialPort.GetPortNames();//得到可用端口名字
Array.Sort(ports);//将它们排序
sp.DataReceived+=sp_DataReceived;//调用DataReceived事件
sp.NewLine="\r\n";
btn_Send.Enabled=sp.IsOpen;//通过串口的打开与否控制控件显示
checkbox_data.enabled=false;
// sp.encoding=system.text.encoding.getencoding("gb2312");转换字符编码
}
voidsp_DataReceived(objectsender,SerialDataReceivedEventArgse)
{
//////////////////Version.1无法避免死锁/////////////////
//intn=sp.BytesToRead;第一次书写的代码无法避免2个线程的死锁
//byte[]buff=newbyte[n];
//sp.Read(buff,0,n);
//TheString.Clear();
//this.Invoke((EventHandler)(delegate{
// TheString.Append(Encoding.ASCII.GetString(buff));
// this.txtGet.AppendText(TheString.ToString());
//}));
//////////////////Version.2解决问题/////////////////////
if(Closing)
return;//如果正在关闭,忽略操作,直接返回,尽快的完成串口监听线程的一次循环
try
{
Listening=true;//设置标记
intn=sp.BytesToRead;//读取缓冲区字符数
byte[]buff=newbyte[n];
sp.Read(buff,0,n);//读出缓冲区数据
TheString.Clear();
booldata_catched=false;
buffer.AddRange(buff);
while(buffer.Count>=4)//至少要包含4个字节的固定格式
{
if(buffer[0]==0xDD&&buffer[1]==0x22)//检查头文件
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 原理 应用 课程设计 报告