微机原理及应用课程设计报告.doc_第1页
微机原理及应用课程设计报告.doc_第2页
微机原理及应用课程设计报告.doc_第3页
微机原理及应用课程设计报告.doc_第4页
微机原理及应用课程设计报告.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

微机原理及应用课程设计设计题目: 基于PC机串行通信的点到点文件传输系统专 业 计算机科学与技术 班 级 计104 学 生 D 指导教师 2013 年 秋季 学期目录目录2一、实验目的3二、实验内容及要求3三、课设基本思想3四、 程序流程图以及程序设计5(一)、程序流程图:5(二)、程序设计思想:5五实验结果截图6六程序源代码7七课程设计心得体会14八参考文献151、 实验目的1.学习虚拟串口的使用方法。2.学会在windows平台上进行串口通信的方法。二、实验内容及要求1.基本要求:采用VB,VC,C#或其他开发工具设计一个简易的聊天系统。用户可以设置波特率或采用自动协商机制。界面如下图:2.设计提示:在Windows平台上通过API或MSComn控件实现串行通信。3.进一步设计要求:采用多线程完成通信任务。三、课设基本思想1.在.NET平台下使用C#创建串口通信程序,.NET 2.0提供了串口通信的功能,其命名空间是System.IO.Ports。这个新的框架不但可以访问计算机上的串口,还可以和串口设备进行通信。我们将使用标准的RS 232 C 在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) 、程序流程图:使用函数获取系统当前的可用串口选择正确串口NY初始化串口初始化波特率建立串口连接并通信是否单行显示Y N单行显示多行显示是否发送二进制文件NY发送二进制文件结束(二)、程序设计思想:首先需要定义一个SerialPort对象,添加DataReceived事件响应收到数据。然后利用系统提供函数获取当前端口号,以及用户选择的波特率,对对象进行初始化。通过两边建立起来的串口连接的缓冲区,进行数据的交互。这样便实现里串口点对点的字符串聊天。对于实现二进制文件的传输,主要通过的是利用list来进行缓冲区数据的读取,同时自己约定好所用的文件协议。通过对数组文件的分析来判断是否是合法的数据,通过对校验位的检查确定是否是正确的数据,对于不正确的数据,我采用的是直接丢弃不予处理的政策。至此,便是整个程序的基本思想。五实验结果截图程序主界面:设置界面:运行结果:六程序源代码1.主界面部分:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.IO.Ports;using System.Text.RegularExpressions;namespace windows_test public partial class Main : Form private SerialPort sp = new SerialPort(); private StringBuilder TheString = new StringBuilder(); private bool Listening = false;/是否没有执行完invoke相关操作 private bool Closing = false;/是否正在关闭串口,执行Application.DoEvents,并阻止再次invoke public static string ports; private List buffer = new List(4096); private byte B_data=new byte10;/自定义数据格式,由2个字节的头文件+一个字节的长度+最后一位的校验位而来DD 22 06 11 22 33 44 55 66 8E public Main() InitializeComponent(); private void Form1_Load(object sender, EventArgs e) ports = SerialPort.GetPortNames();/得到可用端口名字 Array.Sort(ports);/将它们排序 sp.DataReceived += sp_DataReceived;/调用DataReceived事件 sp.NewLine = rn; btn_Send.Enabled = sp.IsOpen;/通过串口的打开与否控制控件显示 checkbox_data.enabled = false; / sp.encoding = system.text.encoding.getencoding(gb2312);转换字符编码 void sp_DataReceived(object sender,SerialDataReceivedEventArgs e) /Version.1无法避免死锁/ /int n=sp.BytesToRead;第一次书写的代码无法避免2个线程的死锁 /byte buff= new byten; /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;/设置标记 int n = sp.BytesToRead;/读取缓冲区字符数 byte buff = new byten; sp.Read(buff, 0, n);/读出缓冲区数据 TheString.Clear(); bool data_catched = false; buffer.AddRange(buff); while (buffer.Count = 4)/至少要包含4个字节的固定格式 if (buffer0 = 0xDD & buffer1 = 0x22)/检查头文件 int len = buffer2;/得到长度 if (buffer.Count len + 4) break; byte sum = 0; for (int i = 0; i + txtSend.Text);/若勾选单行发送,则显示数据来源端口和时间 n = txtSend.Text.Length + 2; else sp.Write(txtSend.Text);/写入到缓冲区 n = txtSend.Text.Length; catch (Exception ex) MessageBox.Show(ex.Message); private void btn_Setting_Click(object sender, EventArgs e) Setting s = new Setting(); s.Show(); this.Visible=false; private void btn_Reset_Click(object sender, EventArgs e) txtGet.Text = ; txtSend.Text = ; private void btn_Exit_Click(object sender, EventArgs e) Application.Exit(); private void checkBox_line_CheckedChanged(object sender, EventArgs e) txtGet.WordWrap = checkBox_line.Checked; 七课程设计心得体会在这一周的课设中,让我对微机原理的课程有了更加深入的了解,使我对串口实现字符串的传送和数据的收发有了进一步的掌握。在初次拿到题目的时候,由于以前的编程主要面向的是软件,而这次是面向硬件。因此开始课设的时候,脑子里面是一团雾水,不知道从何出去下手,也不知道要到达怎样的目标。经过一天的上网查找资料,渐渐的让我明白了串口通信的基本实现方法。在之后的几天中,我通过这学期学习的c#的知识和微机知识,将两者结合起来,实现了界面的搭建和逻辑的选择。对于遇到的不会使用的方法和属性就在MSDN中查询了解。而且我也学习到了SerialPort类的使用,以及其各种参数(串口名、波特率、停止位、校验位、停止位等)的设置方式。经过熟能生巧的过程使我对于C#串口通信有了一定程度的了解。当然在开发过程中也不是一帆风顺的,遇到了很多麻烦,例如缓冲区的读取异常,程序逻辑异常等等。通过不断的去查资料,翻阅书籍,让我收获了很多很多,也提高了我关于分析问题,解决问

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论