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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

微机原理及应用
课程设计
设计题目: 基于PC机串行通信的点到点文件传输系统专业讣算机科学与技术
班级计104
学生 D
指导教师
2013 年秋季学期
LI

U录 2
实验LI
3


实验内容及要求 3


课设基本思想 3

程序流程图以及程序设讣 5


五. 实验结果截图6
六. 程序源代码7
七. 课程设计心得体会14
A.参考文献15
1、实验目的
1.学习虚拟串口的使用方法。

2.学会在windows平台上进行串口通信的方法。

二、实验内容及要求
1•基本要求:采用VB,VC,C#或其他开发工具设计一个简易的聊天系统。

用户可以设置波特率或釆用自动协商机制。

界面如下图:
接收信息
|Text1
发送信息
Text2
2.设汁提示:在Windows平台上通过API或MSComn控件实现串行通信。

3.进一步设计要求:采用多线程完成通信任务。

三、课设基本思想
1.在.\ET平台下使用C#创建串口通信程序,.NET
2.0提供了串口通信的功能,其命名空间是System. 10. PortSo这个新的框架不但可以访问计算机上的串口,还可以和串口设备进行通信。

我们将使用标准的RS 232 C在PC间通信。

它丄作在全双工模式下,而且我们不打算使用任何的握手或流控制器,而是使用无modem连接。

2.串口的硬件知识:
在数据传输的时候,每个字节的数据通过单个的电缆线传输。

包包括开始位,数据,结束为。

一旦开始位传出,后面就会传数据,可能是5, 6, 7或8位, 就看你的设定了。

发送和接收必须设定同样的波特率和数据位数。

3.关于本程序使用SerialPort的一些属性和方法:
4、程序流程图以及程序设计
开始、程序流程图:
使用函数获取系统、“|前的可用串口
初始化串JI
初始化波特率
建立串11连接并通信
是否发送…进制文件
发送二进制文件
(二)、程序设计思想:
首先需要定义一个SerialPort对象,添加DataReceived事件响应收到数
据。

然后利用系统提供函数获取当前端口号,以及用户选择的波特率,对对象进行初始化。

通过两边建立起来的串口连接的缓冲区,进行数据的交互。

这样便实现里串口点对点的字符串聊天。

对于实现二进制文件的传输,主要通过的是利用
list◊来进行缓冲区数据的读取,同时自己约定好所用的文件协议。

通过对数组文件的分析来判断是否是合法的数据,通过对校验位的检查确定是否是正确的数据,对于不正确的数据,我采用的是直接丢弃不予处理的政策。

至此,便是整个程序的基本思想。

五.实验结果截图
程序主界面:
设置界面:
运行结果:
六.程序源代码
1.」[界iM部分:
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・10. 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 Forml_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_DatdReceived(object sender,SerialDatdReceivedEventArgs e)
//////////////////Version. 1 无法避免死锁/////////////////
//int n=sp. BytesToRead;第一次书9的代码无法避免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・ ToStringO);
//}));
//////////////////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);
wh订e (buffer. Count >= 4)//至少要包含4个字节的固定格式if (buffer[0]二二OxDD && buffer[1]二二0x22)//检查头文件。

相关文档
最新文档