微机原理及应用课程设计报告

时间:2024.4.14

微机原理及应用

课程设计

设计题目: 基于PC机串行通信的点到点文件传输系统

专     业   计算机科学与技术  

班     级        104       

学     生        D          

指导教师                     

        

     2013     秋季学期

目录

目录............................................. 2

一、实验目的..................................... 3

二、实验内容及要求................................ 3

三、课设基本思想.................................. 3

四、 程序流程图以及程序设计........................ 5

(一)、程序流程图:............................. 5

(二)、程序设计思想:........................... 5

五.实验结果截图.................................. 6

六.程序源代码.................................... 7

七.课程设计心得体会............................. 14

八.参考文献.................................... 15

一、实验目的

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的一些属性和方法:

属性:

方法:

四、程序流程图以及程序设计

(一)流程图: 终止: 开始、程序流程图:

 

N

 

Y

 

Y                                 N

 

N

Y

 

(二)、程序设计思想:

首先需要定义一个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<byte> buffer = new List<byte>(4096);

        private byte[] B_data=new byte[10];//自定义数据格式,由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 = "\r\n";

            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 byte[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;//设置标记

                int n = sp.BytesToRead;//读取缓冲区字符数

                byte[] buff = new byte[n];

                sp.Read(buff, 0, n);//读出缓冲区数据

                TheString.Clear();

                bool data_catched = false;

                buffer.AddRange(buff);

                while (buffer.Count >= 4)//至少要包含4个字节的固定格式

                {

                    if (buffer[0] == 0xDD && buffer[1] == 0x22)//检查头文件

                    {

                        int len = buffer[2];//得到长度

                        if (buffer.Count < len + 4) break;

                        byte sum = 0;

                        for (int i = 0; i < len + 3; i++)

                        {

                            sum ^= buffer[i];//通过异或校验得到校验码

                        }

                        if (sum != buffer[len + 3])

                        {

                            buffer.RemoveRange(0, len + 4);//校验结果不对则直接丢弃

                            continue;

                        }

                        buffer.CopyTo(0, B_data, 0, len + 4);//若数据符合,便将其拷贝至数据缓冲

                        data_catched = true;//设置标记

                        buffer.RemoveRange(0, len + 4);//移出正确的数据

                    }

                    else

                    {

                        buffer.RemoveAt(0);//若数据不是开头则删除之

                    }

                }

               

                if (data_catched)

                {

                    string data = B_data[3].ToString("X2") + " " + B_data[4].ToString("X2") + " " +

                        B_data[5].ToString("X2") + " " + B_data[6].ToString("X2") + " " +

                        B_data[7].ToString("X2")+ " " +B_data[8].ToString("X2");//由于格式已经规定好,因此可以直接读取数据,通过StringFormat选择16进制2位。

                    this.Invoke((EventHandler)(delegate { txtData.Text = data; }));//更新界面

                }

                //string output

                TheString.Clear();

                this.Invoke((EventHandler)(delegate

                {

                    TheString.Append(Encoding.ASCII.GetString(buff));

                    this.txtGet.AppendText(TheString.ToString());

                }));//将读到的字符串显示到发送数据文本框中

            }

            finally

            {

                Listening = false;//设置标志,通知ui可以关闭串口

            }

        }

        private void open_Click(object sender, EventArgs e)//通过按键来初始串口

        {

            if (sp.IsOpen)

            {

                Closing = true;

                while (Listening)

                    Application.DoEvents();

                sp.Close();

                Closing = false;

            }

            else

            {

                try

                {

                    sp.PortName = Setting.get_port;

                    sp.BaudRate = int.Parse(Setting.get_baudrate);

                    sp.Open();

                }

                catch (Exception ex)

                {

                    sp = new SerialPort();

                    MessageBox.Show("请先单击\"设置\" 设置串口参数","警告",MessageBoxButtons.OK);

                }

            }

                btn_Open.Text = sp.IsOpen ? "关闭连接" : "打开连接";//通过3目运算控制按键显示

                btn_Send.Enabled = sp.IsOpen;

        }

        private void Send_Click(object sender, EventArgs e)

        {

            int n = 0;

            try

            {

                    if (checkBox_line.Checked)

                    {

                        sp.WriteLine(Setting.get_port + " : " + DateTime.Now + " > " + 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] 钱晓捷,陈涛,《16/32位微机原理、汇编语言及接口技术(第二)》,北京,机械工业出版社,2005

[2] 周艳萍,邹伟,《汇编语言程序设计教程》,北京,清华大学出版社,2007


第二篇:微机原理及应用课程设计指导书


《微机原理及应用》

课程设计指导书

班级:

学号:

姓名:

课题名称:

指导老师:张粤 黄孟波 邓秀兰 陈亚娟

时间:2007/12

淮阴工学院

计算机工程系

一、课题

1、电子闹钟

课题任务分配:

键盘部分:确定键的个数、功能、以及硬件设计;编写键盘子程序。

计时部分:硬件设计与软件设计;编写主控程序。

闹铃和显示部分:硬件设计与软件设计。

2、交通灯控制

课题任务分配:

计时部分:硬件设计与软件设计;主控程序编写。

显示部分:硬件设计与软件设计。

3、发光管延时闪烁

硬件设计

软件设计

4、的士计价器

课题任务分配:

硬件设计

软件设计

5、学生创新课题

发挥自己的想象,结合所学知识,做一个自己认为有意义的设计。

二、课程设计目的

《微机原理及应用》课程设计是一项重要的实践性教育环节,是学生在校期间必须接受的一项工程训练。在课程设计过程中,在教师指导下,运用工程的方法,通过一个简单课题的设计练习,可使学生初步体验微机应用系统的设计过程、设计要求、完成的工作内容和具体的设计方法,了解必须提交的各项工程文件,也达到巩固、充实和综合运用所学知识解决实际问题的目的。

通过课程设计,应能加强学生如下能力的培养:

(1)独立工作能力和创造力;

(2)综合运用专业及基础知识,解决实际工程技术问题的能力;

(3)查阅图书资料、产品手册和各种工具书的能力;

(4)工程绘图的能力;

(5)编写技术报告和编制技术资料的能力。

三、一般设计要求

(1) 独立完成设计任务

(2) 绘制系统硬件总框图

2

(3) 绘制系统原理电路图

(4) 绘制系统工程设计图(机箱、控制面板、线路板图、元件布局图、装配连线图等)

(5) 编制软件框图

(6) 完成详细完整的程序清单和注释

(7) 制定编写调试方案

(8) 编写用户操作使用说明书

(9) 写出设计工作小结。对在完成以上文件过程所进行的有关步骤如设计思想、指标论证、方案确定、参数计算、元器件选择、原理分析等作出说明,并对所完成的设计作出评价,对自己整个设计工作中经验教训,总结收获和今后研修方向。

四、设计步骤

1、产品背景分析

任何一种自动化的机电产品、仪器仪表等都是由控制单元、测控通道和受控设备组成,本步骤应首先确定:

1)、受控设备的机械特征(种类、结构、工作介质、工作条件、环境等)

2)、产品的运行特征(操作方式、人机界面、工艺流程等)

2、输入/输出分析

(1)输入信号:

(2)输出信号

3、硬件设计

原理图

原理说明

4、软件设计(可与硬件设计同步进行)

程序清单加注释

6、硬件、软件分别调试

五、进度安排

本次课程设计 时间1周

1、 周一、周二 分析问题、查阅资料、总体设计、方案确定

2、 周三 硬件设计、绘制原理图、熟悉实验设备

3、 周四 软件设计

4、 周五上午 上机调试(软、硬件联调)、 编写文件

5、 周五下午 演示、答辩

3

六总结:

4

更多相关推荐:
微机原理课程设计报告

微机原理课程设计设计报告姓名朱文斋班级学号30905020xx教师张荣标20xx年1月5日微机原理课程设计一目的结合微型计算机原理课程的学习进一步巩固已学的知识同时针对计算机原理知识的具体应用学会对系统中DOS...

微机原理课程设计实验报告

河北科技大学课程设计报告学生姓名学号专业班级课程名称学年学期指导教师年月课程设计成绩评定表目录一课程设计的目的1二设计题目1三设计内容要求2四设计成员及分工2五课程设计的主要步骤2六课程设计原理及方案3七实现方...

数字钟_接口课设报告_8086微机原理与接口技术课程设计

接口技术基础实验报告学院计算机科学与技术学院班级计091学号09130220xx姓名曹恒楼指导老师顾晖时间20xx616接口技术课程设计目录数字钟的设计31设计需求分析与解决方案311设计需求分析3111题目要...

微机原理课程设计报告

微机原理课程设计报告设计名称:LED七段数码管数字钟学院:电子信息学院班级:电科091提交时间:20##年6月15日一:设计内容设计的电路功能是实现时钟的24进制计时并显示在数码管上,通过按键可对时钟的时、分、…

微机原理课程设计总结

南京航空航天大学微机原理课程设计数据采集系统中断法微机原理课程设计数据采集系统中断法南京航空航天大学微机原理课程设计数据采集系统中断法一课设目的进一步掌握微机原理知识了解微机在实时采集数据的应用学习掌握编程和程...

微机原理课程设计报告

课程设计报告纸数据采集系统三中断法一实验目的进一步掌握微机原理知识了解微机在实时采集过程中的应用学习掌握编程和程序调试方法二实验内容1用中断法将ADC0809通道0外接05V电压转换成数字量后在七段LED数码管...

微机原理课程设计报告(电子时钟)

微机原理课程设计报告1设计目的培养和锻炼在学习完本门课后综合应用所学理论知识解决实际工程设计和应用问题的能力通过课程设计要求熟悉和掌握微机系统的软件硬件设计的方法设计步骤得到微机开发应用方面的初步训练掌握825...

微机原理课程设计报告

中南大学微机原理课程设计报告微机应用系统设计与综合实验课程设计报告学院信息科学与工程学院班级自动化1106学号0909113126姓名张甜甜指导老师李志民瞿年清20xx1230中南大学微机原理课程设计报告目录目...

微机原理课程设计报告

微机课程设计班级姓名学号报告任务一1目的字符串匹配的设计要求为掌握提示信息的设置方法及读取键入信息的方法编写程序实现两个字符串比较如相同则显示MATCH否则显示NOMATCH2流程图3源程序DATASSEGME...

微机原理课程设计报告

微机应用系统课程设计报告题目电子音乐播放器专业班级电子信息科学与技术1001班设计学生高扬宇完成时间20xx年6月27日湖南文理学院物理与电子科学学院源程序CODESEGMENTASSUMECSCODEORG1...

微机课程设设论文-基于微机原理交通灯的设计

华夏学院微机原理与接口技术课程设计题目交通灯系统设计学院系信息工程系年级专业自动化1073学号10212407309学生姓名李华坤指导教师周立群武汉理工大学华夏学院微机原理与接口技术课程设计课程设计任务书学生姓...

微机原理课程设计报告li

江苏大学微机原理课程设计报告学院电气学院班级姓名学号指导老师时间20xx年1月15日一课程设计目的1结合微型计算机原理课程的学习进一步巩固已学的知识同时针对计算机原理知识的具体应用学会对系统中DOS和BIOS的...

微机原理课程设计报告(35篇)