搜档网
当前位置:搜档网 › 1.C#中串口组件的使用方法总结及上位机制作方法

1.C#中串口组件的使用方法总结及上位机制作方法

1.C#中串口组件的使用方法总结及上位机制作方法
1.C#中串口组件的使用方法总结及上位机制作方法

一、创建Windows窗体项目

二、添加SerialPort组件

三、默认产生serialPort1对象

四、设置串口属性

三种方法(本实例用第三种) 1.设置下面的属性

2.代码实现

3.用我封装的一个类来实现

C# 封装了用于对 Serialport类属性的配置类及其保存窗

五、串口操作(打开关闭)

按上述步骤初始化串口之后进行串口的打开和关闭操作

打开关闭串口的函数包含在SerialPort类中,利用SerialPort对象来引用serialPort1.Open();

serialPort1.Close();

例如:在程序中添加一个打开串口按钮btn_open,btn_open.Text初始化为"打开串口"

在btn_open响应函数中加入以下代码

private void btn_open_Click(object sender, EventArgs e)

{

if (btn_open.Text == "打开串口")

{

btn_open.Text = "关闭串口";

serialPort1.Open();

}

else

{

btn_open.Text = "打开串口";

serialPort1.Close();

}

}

此时形成的界面截图如下:

此时程序的代码如下:

using System;

using System.Collections.Generic; using https://www.sodocs.net/doc/e612594830.html,ponentModel; using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms; using AHRSmanager;

namespace testOfserialPort

{

public partial class Form1 : Form {

public Form1()

{

InitializeComponent();

}

private void serialPort1_DataReceived(object sender,

System.IO.Ports.SerialDataReceivedEventArgs e)

{

}

private void btn_SerialportSet_Click(object sender, EventArgs e) {

using (串口设置窗口frmConfig = new 串口设置窗口())

{

frmConfig.ShowDialog();

}

}

private void btn_open_Click(object sender, EventArgs e)

{

if (btn_open.Text == "打开串口")

{

串口设置窗口.ReadSerialPortSet(serialPort1); //串口初始化

btn_open.Text = "关闭串口";

serialPort1.Open();

}

else

{

btn_open.Text = "打开串口";

serialPort1.Close();

}

}

private void Form1_Load(object sender, EventArgs e)

{

btn_open.Text = "打开串口";

}

}

}

这时该程序已经具有开关串口的作用,可以用单PC机虚拟串口互连方法介绍的方法进行串口测试(串口互联模式)

运行程序,点击串口配置按钮,进行参数配置,点击打开串口,VSPM就将显示串口的打开和关闭.

六、数据的发送

(一) 十六进制数据发送

使用方法见C#中用SerialPort类中的Write()方法发送十六进制数

1.为程序添加发送按钮,命名为btn_send,为程序添加文本输入框tb_send

2.在btn_send的回调函数中添加以下代码

private void btn_send_Click(object sender, EventArgs e)

{

Byte[] BSendTemp = new Byte[1]; //建立临时字节数组对象

BSendTemp[0] = Byte.Parse(this.tb_send.Text);//由文本框读入想要发送的数据

this.serialPort1.Write(BSendTemp, 0, 1);//发送数据

}

3.测试

将串口配置为COM3,打开VSPM和串口调试助手,调试助手为COM4

打开串口COM3,将要发送的数写入输入文本框(0-255),点击发送在串口调试助手中就会出现相应的十六进制数据显示

(二) 字符串数据发送

1 为程序添加CheckBox cB_Hex,如若选中则发送Hex数据,如若未选则发送String数据。

2 将btn_send的响应函数btn_send_Click修改为:

private void btn_send_Click(object sender, EventArgs e)

{

if (this.cB_Hex.Checked == true)

{

Byte[] BSendTemp = new Byte[1]; //建立临时字节数组对象

BSendTemp[0] = Byte.Parse(this.tb_send.Text);//由文本框读入想要发

送的数据

this.serialPort1.Write(BSendTemp, 0, 1);//发送数据

}

else

{

string serialStringTemp = this.tb_send.Text;

this.serialPort1.WriteLine(serialStringTemp);

}

}

3 运行程序,取消Checkbox的选择

4 发送字符串,下面为测试图

5 这里主要利用了WriteLine函数,这个函数在Console中也有定义,用发基本一样。

七、数据的接收

(A)结构介绍

数据的接收大体有两种方案:1 主动定时读取;2 事件响应驱动

1 主动定时读取

这种方式的适应能力较弱,当数据来源为定时并且不是很快的情况时可以考虑采用这种方法,这种方法主要适用于数据采集系统而不适用于随机事件发生时的通信或控制系统。当然,这种方法的缺点是如果接收的数据不是定时的,则读取定时器的触发频率就要很小,这样才能保证及时的读取串口缓冲区。这也将大大的浪费系统资源。

2 事件响应驱动

这种方式是串口通信上位机制作的主要方式,其采用中断思想而成,当串口输入缓冲区中的字节数据大于某个设定的个数时,触发串口输入中断,这时在中断程序中读取串口输入缓冲区中的数据,具有实时性和灵活性,是个常用的较好的方法。本文也是采用这种方法来进行串口输入缓冲区的实时数据读取。

(B)事件响应驱动下的串口输入缓冲区数据读取

.NET中封装了SerialPort 类表示串行端口资源。

命名空间: System.IO.Ports

程序集: System(在 System.dll 中)

除了前面用到的串口常规属性设置(BuadRate,PortName),这里用到了一个新的串口属性:

ReceivedBytesThreshold 获取或设置DataReceived事件发生前内部输入缓冲区中的字节数。

这个ReceiveBytesThreshold属性即是设置串口输入缓冲区中的数据字节大于ReceiveBytesThreshold时触发DataReceived事件。

用法:

<1>在设计器双击串口serialport1的DataReceived事件,在代码中就会自动加入serialPort1_DataReceived函数作为DateReceived的事件触发函数。

<2>作为测试,先将serialport1.ReceiveBytesThreshold设为1,即串口输入缓冲区有数就触发DataReceived事件。

<3>加入RichTextBox rTB_receive作为串口接收数据的显示组件

<4>在DataReceived事件响应函数中读取串口输入缓冲区中的数据

string serialReadString;

private void serialPort1_DataReceived(object sender,

System.IO.Ports.SerialDataReceivedEventArgs e)

{

serialReadString += serialPort1.ReadExisting();

}

这里serialReadString即为读取到串口输入缓冲区的数据。

要想将其显示到RichTextBox rTB_receive中,这里出现了一个跨线程的问题,因为DataReceived事件是在辅助线程中被激发的,所以要将数据显示到rTB_receive的主线程中就要进行一定的处理,处理方法如下:

C#中SerialPort类中DataReceived事件GUI实时处理方法

将DataReceived事件响应函数修改为如下:

string serialReadString;

private void serialPort1_DataReceived(object sender,

System.IO.Ports.SerialDataReceivedEventArgs e)

{

serialReadString = serialPort1.ReadExisting();

this.rTB_receive.Invoke

(

new MethodInvoker

(

delegate

{

this.rTB_receive.AppendText(serialReadString);

}

)

);

}

这时就可以按字符串收发了!

<5> 测试图,打开上位机和调试助手,点击调试助手的发送按钮,上位机就会相应的显示接收到的数据.

<6> 这时候就完成了基本上位机功能的编写

至此工程文件:

下载

串口数据的读取还涉及到其他的读取函数,

Read已重载。从SerialPort输入缓冲区中读取。

ReadByte从SerialPort输入缓冲区中同步读取一个字节。

ReadChar从SerialPort输入缓冲区中同步读取一个字符。

ReadExisting 在编码的基础上,读取SerialPort对象的流和输入缓冲区中所有立即可用的字节。

ReadLine一直读取到输入缓冲区中的NewLine值。

ReadTo一直读取到输入缓冲区中的指定 value 的字符串。根据需要自己选择就行了,很简单,就不再啰嗦了。

上位机和下位机通信

目录 摘要 1 引言 (1) 2 结构设计与方案选择 (2) 2.1设计任务 (2) 2.1.1单片机的选择 (2) 2.1.2电平转换 (2) 2.1.1单片机的选择 (2) 2.1.3单片机与pc机通信原理 (2) 2.2软件方案选择 (2) 2.2.1 上位机编程方案选择 (3) 2.2.2 单片机编程方案选择 (3) 2.3 总体方案选择 (2) 3 硬件设计 (8) 3.1单片机主要特性 (5) 3.2 MAX232电平芯片介绍10 (10) 3.3 硬件电路设计图 (11) 3.3.1 PC机与单片机通信接口电路设计框图 (11) 3.3.2整体设计原理图 (11) 4软件设计 (12) 4.1上位机程序设计 (12) 4.2下位机程序设计 (13) 5 软硬件调试部分 (21) 5.1 PROTEUS软件仿真 (21) 5.1.1 Protues简介 (21) 5.1.2 Protues仿真电路图 (22) 5.2 VC软件仿真 (21) 结束语 (27) 致谢 (28) 参考文献 (29)

摘要 本文主要描述了利用PC机与AT89C51单片机之间的通信程序设计实现温度显示。并详述了在VC6.0环境下,上位机利用MSCOMM通信控件与单片机之间串口通信实现温度显示。由单片机采集一个温度信号,将采集到的温度信号传送给PC机显示,PC机用VC6.0编写程序,单片机程序用C语言编写,最后用PROTUES软件进行仿真实现温度显示。 关键词:单片机MSCOMM控件VC6.0 AT89C51 温度显示

1引言 随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从单片机技术入手,一切向着数字化控制,智能化控制方向发展。 现代化集中管理需要对现场数据进行统计、分析、制表、打印、绘图、报警等,同时,又要求对现场装置进行实时控制,完成各种规定操作,达到集中管理的目的。加之单片机的计算能力有限,难以进行复杂的数据处理。因此在功能比较复杂的控制系统中,通常以PC机为上位机,单片机为下位机,由单片机完成数据的采集及对装置的控制,而由上位机完成各种复杂的数据处理及对单片机的控制。

F2812外部接口XINTF资料

F2812外部接口XINTF 什么是外部接口,外部接口有什么作用,怎么去配置和使用这一块。今天了解了这部分的知识,现将其详细的记录下来。先看一下什么是外部接口。外部接口是F2812与外部设备进行通信的重要接口,这些外部接口对应着CPU内部的某个存储空间,CPU通过对存储空间进行的读写操作间接控制外部接口。书本上抄下来的定义,很是官方啊,不好懂。再来看一下接的是一些什么,估计是不是会好理解一些呢?一般用于RAM,FLASH等。哦...估计是内部数据或者是程序存不下了,找一个外面的片子来做存储区扩展用的接口。 外部接口有哪一些线呢?有片选信号线、数据总线、地址总线、读写使能信号线、以及其他信号线。 F2812中外部接口被映射到5个固定的存储空间区域,每个区域都有一个片选信号。当系统使能片选信号后,数据自动存储到对应的存储空间内。嘻嘻!就喜欢这一句自动存储。 所有的数字芯片不能少的一条主线就是时钟,这个模块的时钟怎样呢?答:XINTF模块的时序都是参照F2812的内部时钟XTIMCLK。大小可以人为设定为系统时钟或系统时钟的一半。 F2812中XINTF的使用

想使用XINTF先要弄清楚里面有些什么,外面有些什么引 脚需要接线。 XINTF一共有5个空间,分别是Zone0、Zone1、Zone2、Zone6、Zone7,每个空间有相应的片选信号线连接到外面。其中1、2共用一根片选线,6、7共用一根片选线;2、6共用相同的外 部地址,外部首地址0x0 0000、尾地址0x7 ffff;1、2占用的 外部总线地址不同,0的为0x2000~0x3fff、1的为0x4000~0x5fff;空间7可以作为外部启动的存储空间,由于这个空间的特殊性,所以暂时不打算用,也就不放在这里讨论了。 观察了一下开发板,CPLD的接线为8根数据线,五根地址线,空间0、1共用的片选线,还有R/W读写信号线,WE写使能信号线,RD读使能信号线。 对XINTF空间的操作分为以下三个部分,引导、激活、跟踪。 引导:访问区域的片选信号为低,相应地址放在外设总线上,引导部分的周期通过XTIMCLK来配置时序。 激活:访问外部设备,由于我只进行读操作,所以将读使能信号线拉低,外部接口的数据被锁存到DSP中。暂不打算使 用XREADY信号采样。 跟踪:跟踪周期是指读写信号置成高电平之后片选信号仍然保持低电平一段时间。

关于STM32串口空闲中断IDEL的问题

关于STM32串口空闲中断IDEL的问题 1.空闲中断是接受数据后出现一个byte 的高电平(空闲)状态,就会触发空闲 中断.并不是空闲就会一直中断,准确的说应该是上升沿(停止位)后一个 byte,如果一直是低电平是不会触发空闲中断的(会触发break 中断)。 2.关于第二点有要铺垫的三个情况,datasheet 中”当一空闲帧被检测到时,其处 理步骤和接收到普通数据帧一样,但如果IDLEIE 位被设置将产生一个中断”“空 闲符号被视为完全由'1'组成的一个完整的数据帧,后面跟着包含了数 据的下一帧的开始位'1'的位数也包括了停止位的位数”空闲符号的 配图后面跟这一个低电平.有人理解为只有收到下一个数据的起始位才会触发中 断,这样理解是不对的,应该是数据后有空闲了一帧就会触发. 3.清中断的方式感觉奇怪,使用函数USART_ClearITPendingBit( USART1, USART_IT_IDLE )清除不了中断的.我用的是3.5 的库,查看函数说明,里面的 @param 参数并没有IDLE,后面的@note 中,这样说:”PE(Parity error),FE(Framing error),NE(Noise error),ORE(OverRun error) and IDLE(Idle line detected) pending bits are cleared by software sequence: a read operation to USART_SR register (USART_GetITStatus()) followed by a read operation to USART_DR register (USART_ReceiveData()).”我是通过语句”USART1->DR;”来清除IDLE 中断的. 现在有很多数据处理都要用到不定长数据,而单片机串口的RXNE 中断一次 只能接收一个字节的数据,没有缓冲区,无法接收一帧多个数据,现提供两种 利用串口IDLE 空闲中断的方式接收一帧数据,方法如下: 方法1:实现思路:采用STM32F103 的串口1,并配置成空闲中断IDLE 模 式且使能DMA 接收,并同时设置接收缓冲区和初始化DMA。那么初始化完成 之后,当外部给单片机发送数据的时候,假设这帧数据长度是200 个字节,那

上位机与下位机之间通信协议格式

一、通信协议 1、命令帧格式 帧头标志参数校验帧尾 命令字 01累加和 2030 1Byte1Byte2Byte1Byte1Byte 说明:1、累加和校验:各字节累加和与100的模。 2、 10进制输入;16进制传输。

2、信息帧格式 帧头标志参数校验帧尾 命令字 2030 02累加和 1Byte1Byte2Byte1Byte1Byte 说明:1、累加和校验:各字节累加和与100的模。 2、 10进制输入;16进制传输。

3、数据帧格式 (文件mokuaideng.txt (模块指示灯地址) 20 Byte ) 帧头标志校验帧尾203003累加和数据数据1Byte 16Byte 1Byte 1Byte 1Byte 标志:03 数据帧 文件mokuaideng.txt (模块指示灯地址) 20 Byte 04 数据帧 文件daotongbiao.txt (导通表) 40 Byte 05 数据帧 文件canshu.txt (控制参数) 6 Byte 06 数据帧 校验文件mokuaideng.txt (模块指示灯地址) 20 Byte 07 数据帧 校验文件daotongbiao.txt (导通表) 40 Byte 08 数据帧 校验文件canshu.txt (控制参数) 6 Byte 4、信息帧格式 定位物理针位 下位机-》上位机 上位机-》下位机 点亮指示灯 帧头标志参数校验帧尾203011累加和物理针位1Byte 1Byte 2Byte 1Byte 1Byte 说明:1、累加和校验:各字节累加和与100的模。 2、 10进制输入;16进制传输。 标志位 13 ,单点检测 判断单点导通关系是否真确 5、信息帧格式 下位机-》上位机 自检、线检测 帧头标志参数1校验帧尾203012累加和起始针位1Byte 1Byte 2Byte 1Byte 1Byte 参数2终点针位2Byte 参数3状态1Byte 状态:00 导通 01 断路 02 短路/错路

显微镜的构造与使用

第一单元第二章 第一节《显微镜的构造与使用》教案 【教学目标】 1. 通过学习显微镜各部件的名称、作用,认识显微镜的结构。(重点) 2. 学习显微镜的使用方法,掌握使用显微镜的基本步骤。(重点) 3. 学会正确规范操作显微镜,提高学生动手能力。(难点) 4. 通过对本节内容的学习,在科学态度、科学方法的熏陶中,使学生形成初步的科学意识。 【教材分析】 本节课是学生步入中学后的第一节实验课,通过对显微镜的介绍,使学生着手了解显微镜在生物实验中的作用和使用方法,为今后的实验教学打下基础。老师要充分利用本节课培养学生对生物学的学习兴趣,培养学生严谨的科学态度和良好的实验纪律,加强基础知识的学习,有效地培养学生的观察能力、实验能力和思维能力。 【教学方法】 采用由实验得出结论的探究式学习法,动眼观察、动手操作、动脑思考,由感性认识逐步上升到理性认识。学习中要注意培养学生严谨的科学态度,勇于探究的科学精神,做到大胆动手、规范操作。积极参与小组讨论、分析、归纳观察到的规律,积极回答老师提出的问题。在学习过程中,不必对显微镜的原理进行深入的了解,而应让学生通过不断的练习,达到熟练使用显微镜的目的。 【教学过程】 一、学生自主学习,学习显微镜的各部分的结构及用途,并找出困惑 1、学生对照课本上的图片和相关文字,利用显微镜实物观察并记忆显微镜的结构名称及用途。 2、以小组为单位相互考查记忆结果。 3、请几位同学上讲台利用显微镜讲解各部分的结构和作用。 教师总结(重点介绍反光镜、物镜、目镜、粗准焦螺旋、细准焦螺旋)

二、学习显微镜的使用方法 1、学生对照课本上的图片和相关文字,按要求用显微镜观察“b”字装片。 2、由于对显微镜使用还不够熟练,要求学生练习时动作要轻,以免损坏显微镜。 教师对学生活动进行巡视,并急时纠正学生的错误。 教师总结:显微镜的操作过程提问:1、观察的物像与实际图像有什么不同?2、放大倍数的计算。 组织学生进行观察,得出结论:1、物像与实像相反。2、放大倍数=物镜倍数X目镜倍数 组织学生用显微镜观察一片树叶,感受在显微镜中的视野状况。 提问:为什么视野中看不到图像?如何才能在显微镜下到树叶的微观结构? 组织学生讨论、设计方案、汇报 三、拓展延伸,合作探究。 (1)总结出使用显微镜的五个基本步骤。 (2)显微镜成像特点是什么? (3)观察时为什么不能将载物台倾斜?(课本P15最后一图) (4)如何将低倍物镜转换成高倍物镜? (5)低倍镜换成高倍镜后视野明暗有何变化? 让学生自己找出通过小组探究尚未解决的问题提出来,利用大家的智慧来解决。

TMS320F28335外部中断总结

TMS320F28335外部中断总结 作者:Free 文章来源:Free 点击数:93 更新时间:2010-8-26 在这里我们要十分清楚DSP的中断系统。C28XX一共有16个中断源,其中有2个不可屏蔽的中断RESET和NMI、定时器1和定时器2分别使用中断13 和14。这样还有12个中断都直接连接到外设中断扩展模块PIE上。说的简单一点就是PIE 通过12根线与28335核的12个中断线相连。而PIE的另外 一侧有12*8根线分别连接到外设,如AD、SPI、EXINT等等。这样PIE共管理12*8=96个外部中断。这12组大中断由28335核的中断寄存器IER来控 制,即IER确定每个中断到底属于哪一组大中断(如IER |= M_INT12;说明我们要用第12组的中断,但是第12组里面的什么中断CPU并不知道需 要再由PIEIER确定)。接下来再由PIE模块中的寄存器PIEIER中的低8确定该中断是这一组的第几个中断,这些配置都要告诉CPU(我们不难想 象到PIEIER共有12总即从PIEIER1-PIEIER12)。另外,PIE模块还有中断标志寄存器PIEIFR,同样它的低8位是来自外部中断的8个标志位,同 样CPU的IFR寄存器是中断组的标志寄存器。由此看来,CPU的所有中断寄存器控制12组的中断,PIE的所有中断寄存器控制每组内8个的中断。 除此之外,我们用到哪一个外部中断,相应的还有外部中断的寄存器,需要注意的就是外部中断的标志要自己通过软件来清零。而PIE和CPU的 中断标志寄存器由硬件来清零。 EALLOW; // This is needed to write to EALLOW protected registers PieVectTable.XINT2 = &ISRExint; //告诉中断入口地址 EDIS; // This is needed to disable write to EALLOW protected registers PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block使能PIE PieCtrlRegs.PIEIER1.bit.INTx5= 1; //使能第一组中的中断5 IER |= M_INT1; // Enable CPU 第一组中断

基于C#的串口通信上位机和下位机源程序文件

基于单片机串口通信的上位机和下位机实践 串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线Universal Serial Bus或者USB混淆)。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于获取远程采集设备的数据。 串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。 首先亮出C#的源程序吧。 主要界面: 只是作为简单的运用,可以扩展的。 源代码: using System; using System.Collections.Generic; using https://www.sodocs.net/doc/e612594830.html,ponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO.Ports; using System.Timers; namespace 单片机功能控制 { public partial class Form1 : Form

{ public Form1() { InitializeComponent(); } SerialPort sp = new SerialPort(); private void button1_Click(object sender, EventArgs e) { String str1 = comboBox1.Text;//串口号 String str2 = comboBox2.Text;//波特率 String str3 = comboBox3.Text;//校验位 String str4 = comboBox5.Text;//停止位 String str5 = comboBox4.Text;//数据位 Int32 int2 = Convert.ToInt32(str2);//将字符串转为整型 Int32 int5 = Convert.ToInt32(str5);//将字符串转为整型 groupBox3.Enabled = true;//LED控制界面变可选 try { if (button1.Text == "打开串口") { if (str1 == null) { MessageBox.Show("请先选择串口!", "Error"); return; } sp.Close(); sp = new SerialPort(); sp.PortName = comboBox1.Text;//串口编号 sp.BaudRate = int2;//波特率 switch (str4)//停止位 { case "1": sp.StopBits = StopBits.One; break; case "1.5": sp.StopBits = StopBits.OnePointFive; break; case "2": sp.StopBits = StopBits.Two; break;

显微镜的结构及使用方法教案

电子显微镜结构及基本使用方法 电子显微镜的结构及操作方法;使用高倍镜观察几种细胞;比较不同细胞的异同点; 运用制作临时装片的方法 【本节聚焦】 使用高倍镜观察洋葱表皮细胞 【学法建议】 观察,动手操作,认识使用显微镜 【新课导学】 知识回顾: 生命活动的基本层次包括哪些? 探究新知: 导:上节课我们学习到了细胞是生命活动结构和功能的最基本单位,那么同学们是否知道我们如果想观察细胞的话,应该用什么工具呢? 答:初中的时候我们用低倍光学显微镜观察细胞的,现在,让我们尝试用电子来观察多种类的细胞。 基本内容: 一.展示显微镜,学生回顾基本的结构(学生课堂讨论,教师总结) 对照图片,认清基本结构,并总结。 目镜----长放大倍数小 镜头

物镜----长放大倍数大(学生观察镜头,并总结) 光学结构 平面镜----调暗视野 反光镜 凹面镜----调亮视野(学生亲自操作,总结)准焦螺旋----使镜筒上升或下降 (有粗细之分) 机械结构转换器----更换物镜 光圈----调节视野亮度 (有大小之分) 注:本校显微镜采用非自然光源,所以没有反光镜,而是供电光源,压片夹有螺旋调节,同学们象不像感受一下 答:想。那下面我们就来看看细胞吧。 二.用显微镜观察物象 给出永久性装片,让学生利用显微镜观察,并分成小组讨论,总结基本的操作方法。 基本操作步骤: 1.用低倍物镜观察 放置装片(标本正对通光孔的中心)→侧面观察降镜筒(转动粗准焦螺旋)→左眼观察找 物像(转动粗准焦螺旋升高镜筒)→转动细准焦螺旋将物像调清晰。 2.用高倍物镜观察 移动装片至视野中央(物像偏向哪个方向,装片向哪个方向移动)→转动转换器(换上高倍物镜)→调节反光镜或光圈(使视野变得明亮)→转动细准焦螺旋(将物像调清晰,进行观察)。 问:初中可曾学习过临时装片,如果让你们大家来做一些临时装片,要用到哪些仪器? 答:材料:洋葱,刀片,载玻片,盖玻片,镊子,滴管,清水。 下面请大家回顾一下制作装片的基本步骤,分小组讨论一下。 基本步骤如下: 在载玻片上滴一滴清水→撕取洋葱外表皮→将材料放于清水中并展平→盖上盖玻片→观察本节课中我们用显微镜观察了装片,下面让我们来总结一下有关显微镜的知识。 三.显微镜使用过程中涉及的问题 1.注意事项 (1)调节粗准焦螺旋使镜筒下降时,两眼要注视物镜与盖玻片之间的距离,到快接近时(距 离约为0.5 cm)停止下降。 (2)首先用低倍镜观察,找到要放大观察的物像,移到视野中央,然后换上高倍物镜。 (3)换上高倍物镜后,不能再转动粗准焦螺旋,而只能用细准焦螺旋来调节。 2.高倍镜与低倍镜的比较

基于C#的串口通信上位机和下位机源代码

基于单片机串口通信的上位机和下位机实践串口 Universal Serial Bus或者USB RS232 GPIB兼容的设备也带有RS-232 获取远程采集设备的数据。 bit byte 发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488 202 1200米。 首先亮出C#的源程序吧。

using System; using System.Collections.Generic; using https://www.sodocs.net/doc/e612594830.html,ponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO.Ports; using System.Timers; namespace 单片机功能控制 { public partial class Form1 : Form { public Form1() {

InitializeComponent(); } SerialPort sp = new SerialPort(); private void button1_Click(object sender, EventArgs e) { String str1 = comboBox1.Text;//串口号 String str2 = comboBox2.Text;//波特率 String str3 = comboBox3.Text;//校验位 String str4 = comboBox5.Text;//停止位 String str5 = comboBox4.Text;//数据位 Int32 int2 = Convert.ToInt32(str2);//将字符串转为整型Int32 int5 = Convert.ToInt32(str5);//将字符串转为整型groupBox3.Enabled = true;//LED控制界面变可选 try { if (button1.Text == "打开串口") { if (str1 == null)

C语言extern使用方法总结

extern使用方法总结! 作者:VIP用户提交日期:2007-5-16 20:53:00 Extern的问题在于不知道这个关键词出现的时候到底是声明还是定义。 谨记:声明可以多次,定义只能一次。 函数的声明extern关键词是可有可无的,因为函数本身不加修饰的话就是extern的。但是引用的时候一样是需要声明的。 而全局变量在外部使用声明时,extern关键词是必须的,如果变量无extern修饰且没有显式的初始化,同样成为变量的定义,因此此时必须加extern,而编译器在此标记存储空间在执行时加载如内存并初始化为0。而局部变量的声明不能有extern的修饰,且局部变量在运行时才在堆栈部分分配内存。 引用性声明、定义性声明 强符号、弱符号 出现在linux的gcc链接分析中,可以加深链接的理解。 全局变量或函数本质上讲没有区别,函数名是指向函数二进制块开头处的指针。而全局变量是在函数外部声明的变量。函数名也在函数外,因此函数也是全局的。 在使用中,要形成一种风格。 头文件 首先说下头文件,其实头文件对计算机而言没什么作用,她只是在预编译时在#include的地方展开一下,没别的意义了,其实头文件主要是给别人看的。 我做过一个实验,将头文件的后缀改成xxx.txt,然后在引用该头文件的地方用 #include"xxx.txt" 编译,链接都很顺利的过去了,由此可知,头文件仅仅为阅读代码作用,没其他的作用了!

不管是C还是C++,你把你的函数,变量或者结构体,类啥的放在你的.c或者.cpp文件里。然后编译成lib,dll,obj,.o等等,然后别人用的时候最基本的gcc hisfile.cpp yourfile.o|obj|dll|lib 等等。 但对于我们程序员而言,他们怎么知道你的lib,dll...里面到底有什么东西?要看你的头文件。你的头文件就是对用户的说明。函数,参数,各种各样的接口的说明。 那既然是说明,那么头文件里面放的自然就是关于函数,变量,类的“声明”了。记着,是“声明”,不是“定义”。 那么,我假设大家知道声明和定义的区别。所以,最好不要傻嘻嘻的在头文件里定义什么东西。比如全局变量: #ifndef _XX_头文件.H #define _XX_头文件.H int A; #endif 那么,很糟糕的是,这里的int A是个全局变量的定义,所以如果这个头文件被多次引用的话,你的A会被重复定义 显然语法上错了。只不过有了这个#ifndef的条件编译,所以能保证你的头文件只被引用一次,不过也许还是会岔子,但若多个c文件包含这个头文件时还是会出错的,因为宏名有效范围仅限于本c源文件,所以在这多个c文件编译时是不会出错的,但在链接时就会报错,说你多处定义了同一个变量, Linking... incl2.obj : error LNK2005: "int glb" (?glb@@3HA) already defined in incl1.obj Debug/incl.exe : fatal error LNK1169: one or more multiply defined symbols found 注意!!! extern

最新stm32学习之串口usart复习进程

STM32学习之串口USART STM32 的串口是相当丰富的。最多可提供5路串口,有分数波特率发生器、支持单线光通信和半双工单线通讯、支持LIN、智能卡协议和IrDA SIR ENDEC 规范(仅串口3 支持)、具有DMA 等。串口最基本的设置,就是波特率的设置。STM32 的串口使用起来还是蛮简单的,只要你开启了串口时钟,并设置相应IO口的模式,然后配置一下波特率,数据位长度,奇偶校验位等信息,就可以使用了。 1、串口时钟使能。串口作为STM32 的一个外设,其时钟由外设始终使能寄存器控制,这里我们使用的串口1是在APB2ENR 寄存器的第14 位。除了串口1 的时钟使能在APB2ENR寄存器,其他串口的时钟使能位都在APB1ENR。 1、串口的作用:用在STM32板子和PC机通信的。我们调试的时候,无法知道是否正确,就可以用STM32的cpu,给串口输出一些信息给PC,我们通过屏幕(实际上是终端串口软件),可以看到这些信息,从而知道当前程序的错误可能出现的位置。当然,也可以在PC的键盘敲打命令,让串口帮传递给STM32板子,来执行这些命令。 2、串口的工作模式一般有两种方式:查询和中断 (1)查询:串口程序不断地循环查询,看看当前有没有数据要它传,如果有,就帮助传送(可以从PC到STM32板子,也可以从STM32 板子到PC)。 (2)中断:平时串口只要打开中断即可。如果发现有一个中断来,则意味着要它帮助传输数据——它就马上进行数据的传送。同样,可以从PC到STM32板子,也可以从STM32板子到PC 。 步骤一从硬件开始学习。大家先打开芯达STM32开发板附带的原理图。找到串口部分。笔者把它截图如下。我们发现,串口模块的电路是这样的:STM32的CPU引脚,通过两个PA端口的引脚PA10和PA9(此两个引脚复用USART),连接到一个SP3232芯片,或者MAX232芯片。然后再连接到DB9串口座上。由于232芯片可以允许走两路信号,因此,我们扩展了一个串口COM2,请注意,如无特别说明,我们都将使用COM1。

上位机与下位机之间的连接

第一章上位机与下位机 1.1 上位机与下位机的概念 上位机和下位机,一般是指集中控制系统中的PC机和现场的工控机。上位机(PC 机)主要用来发出操作指令和显示结果数据,下位机(工控机)则主要用来监测和执行上位机的操作指令。举个例子,蓄电池生产中,需要按工艺要求进行充电和放电。现场有许多工位,各自配有智能的充放电设备,它们就是“下位机”。整个车间有一台PC机来集中管理,这就是“上位机”。 上位机软件一般用高级语言编程,如BASIC、C,有比较丰富的图形界面。下位机的编程,依所用的MCU而异,以汇编为主。 上位机和下位机之间的通讯,常见是RS-232,RS-485,当然还有很多,但都是串行方式。特别是“一对多”的RS-485用得最普遍。 上位机是指:人可以直接发出操控命令的计算机,一般是PC,屏幕上显示各种信号变化(液压,水位,温度等)。下位机是直接控制设备获取设备状况的的计算机,一般是PLC/单片机之类的。上位机发出的命令首先给下位机,下位机再根据此命令解释成相应时序信号直接控制相应设备。下位机不时读取设备状态数据(一般模拟量),转化成数字信号反馈给上位机。简言之如此,真实情况千差万别不离其宗。上下位机都需要编程,都有专门的开发系统。 另外,上位机和下位机是通过通讯连接的“物理”层次不同的计算机,是相对而言的。一般下位机负责前端的“测量、控制”等处理;上位机负责“管理”处理。下位机是接收到主设备命令才执行的执行单元,即从设备,但是,下位机也能直接智能化处理测控执行;而上位机不参与具体的控制,仅仅进行管理(数据的储存、显示、打印......人机界面等方面)。常见的DCS系统,“集中-分散(集散)系统”是上位机集中、下位机分散的系统。 在概念上,控制者和提供服务者是上位机.被控制者和被服务者是下位机.也可以理解为主机和从机的关系.但上位机和下位机是可以转换的. 两机如何通讯,一般取决于下位机。TCP/IP一般是支持的。但是下位机一般具有更可靠的独有通讯协议,购买下位机时,会带一大堆手册光盘,告诉你如何使用特有协议通讯。里面会举大量例子。一般对编程人员而言一看也就那么回事,使用一些新的API罢了。多语言支持功能模块,一般同时支持数种高级语言为上位机编程。 上位机是指:人可以直接发出操控命令的计算机,一般是PC,屏幕上显示各种信

显微镜的知识总结及常考知识点

生物科学:显微镜的知识总结 有关显微镜的知识在生物学中非常重要,也多次考过,现将有关知识总结如下: 1、若要把视野中上方的物像移到视野的正中心,则要将装片继续向上移动。若要把视野中左方的物像移到视野的正中心,则要将装片继续向左方移动,因为显微镜视野中看到的是倒像。 2、换高倍物镜后,应调节细准焦螺旋使物像变得清晰;视野会变暗,可调大光圈或改用反光镜的凹面镜来使视野变亮。 3、目镜越长,放大倍数越小;物镜越长,放大倍数越大。 4、物镜与载玻片之间的距离越小,放大倍数越大。 5、总放大倍数等于目镜放大倍数与物镜放大倍数的乘积;放大倍数是指细小物体长度或宽度的放大倍数。 6、放大倍数越大,视野中细胞越大、数目越少、视野越暗。 7、更换目镜,若异物消失,则异物在目镜上;更换物镜,若异物消失,则异物在物镜上、移动载玻片,若异物移动,则异物在载玻片上。 8、如何区别显微镜视野中的细胞核和液泡?一般来说,细胞核透光性不好,是深色的,液泡是浅色的。 此外仔细观察,液泡中液体是流动的,细胞核里面的结构是固定的,看起来有杂质的样子。1.显微镜的放大倍数等于目镜的放大倍数与物镜的放大倍数的乘积。放大倍数指的物体的宽度和长度的放大倍数,而不是面积和体积的放大倍数。 例1.一个细小物体若被放大50倍,这里“被放大50倍”是指该细小物体的() A.体积B.表面积C.像的面积D.长度或宽度 例2.如果使用10倍的目镜和10倍的物镜在视野中央观察到一个细胞,在只换40倍物镜的情况下,该细胞的物象比原先观察到的细胞直径放大了() A.4倍B.16倍C.100倍D.400倍 2.掌握目镜和物镜的结构特点以及镜头长短与放大倍数之间的关系。 目镜是无螺纹的,物镜是有螺纹的;镜头长度与放大倍数的关系:目镜的长度与放大倍数成反比,物镜的长度与放大倍数成正比;物镜越长与装片之间的距离就越短,物镜越短与装片之间的距离就越长。 例1.有一架光学显微镜的镜盒内有2个镜头,甲的一端有螺纹,乙无螺纹,甲乙分别为()A.目镜、物镜B.物镜、目镜C.均为物镜D.均为目镜答案:B 例2.显微镜头盒中的4个镜头。甲、乙镜头一端有螺纹,丙、丁皆无螺纹。甲镜头长3厘米,乙镜头长5厘米,丙镜头长3厘米,丁镜头长6厘米。请问:使用上述镜头观察某装片,观察清楚时物镜与装片之间距离最近的是;在同样的光源条件下,视野中光线最暗的一组镜头是。 解析:根据显微镜的结构可知,甲、乙镜头一端有螺纹为物镜,丙、丁无螺纹为目镜。物镜

const,static,extern用法总结

--------------------------CONST--------------------------------------- const应用: 一、对于基本声明 const int r=100;//标准const变量声明加初始化,编译器经过类型检查后直接用100在编译时替换。 二、对于指针 1. int x=10; const int *r=&x; //指针指向的内容是常量,r指向的内容不能够通过r改变,但如果是非const,内容可以通过自己改变,而且r指针可以改变,可以指向其它的整形. //*r=*r+1;NO //x++;YES //r=&y;YES 2. int const *r=&x; 与1完全相同 3. int * const r=&x; //指针指向是常量,不能修改去指向其它内容,但指向的内容可以修改 //r=&y;NO //*r=*r+1;YES //x++;YES 4.const int * const r=&x; //综合1、3用法,r是一个指向常量的常量型指针,指针指向不能改变,指针内容不能改变,内容可以自身改变 //r=&y;NO //*r=*r+1;NO //x++;YES 三、对于类型检查 可以把非const对象赋予const指针,这样就不能改变.但是不能把const赋给非const,除非先强制转换 const int x=100; int *p=(int*)&x; *p++; 四、对于函数 1.void Fuction1(const int r); //此处为参数传递const值,意义是变量初值不能被函数改变 2.const int Fuction1 (int); //此处返回const值,意思指返回的原函数里的变量的初值不能被修改,但是函数按值返回的这个变量被制成副本,能不能被修改就没有了意义,它可以被赋给任何的const或非const类型变量,完全不需要加上这个const关键字。 3.Class CX; //内部有构造函数,声明如CX(int r =0) CX Fuction1 () { return CX(); } const CX Fuction2 () { return CX(); } Fuction1() = CX(1); //没有问题,可以作为左值调用 Fuction2() = CX(1); //编译错误,const返回值禁止作为左值调用。 4.函数中指针的const传递和返回: int F1 (const char *pstr); //作为传递的时候使用const修饰可以保证不会通过这个指针来修改传递参数的初值 const char *F2();//意义是函数返回的指针指向的对象是一个const对象,它必须赋给一个同样是指向const对象的指针 const char * const F3(); //比上面多了一个const,这个const的意义只是在他被用作左值时有效,它表明了这个指针除了指向const对象外,它本身也不能被修改,所以就不能当作左值来处理。 五、对于类 1.首先,对于const的成员变量,只能在构造函数里使用初始化成员列表来初始化,试图在构造函数体内进行初始化const成员变量会引起编译错误。初始化成员列表形如:X:: X ( int ir ): r(ir) {} //假设r是类X的const成员变量 注意:类的构造和析构函数都不能是const函数。 2.建立了一个const成员函数,但仍然想用这个函数改变对象内部的数据。(函数不能修改类的数据成员)

STM32串口中断接收方式详细比较

本例程通过PC机的串口调试助手将数据发送至STM32,接收数据后将所接收的数据又发送至PC机,具体下面详谈。。。 实例一: void USART1_IRQHandler(u8 GetData) { u8 BackData; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //中断产生 { USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中断标志. GetData = UART1_GetByte(BackData); //也行GetData=USART1->DR; USART1_SendByte(GetData); //发送数据 GPIO_SetBits(GPIOE, GPIO_Pin_8 ); //LED闪烁,接收成功发送完成 delay(1000); GPIO_ResetBits(GPIOE, GPIO_Pin_8 ); } } 这是最基本的,将数据接收完成后又发送出去,接收和发送在中断函数里执行,main函数里无其他要处理的。 优点:简单,适合很少量数据传输。 缺点:无缓存区,并且对数据的正确性没有判断,数据量稍大可能导致数据丢失。 实例二: void USART2_IRQHandler() { if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) //中断产生 { USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除中断标志 Uart2_Buffer[Uart2_Rx_Num] = USART_ReceiveData(USART2); Uart2_Rx_Num++; } if((Uart2_Buffer[0] == 0x5A)&&(Uart2_Buffer[Uart2_Rx_Num-1] == 0xA5)) //判断最后接收的数据是否为设定值,确定数据正确性 Uart2_Sta=1; if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) //溢出 { USART_ClearFlag(USART2,USART_FLAG_ORE); //读SR USART_ReceiveData(USART2); //读DR } } if( Uart2_Sta ) { for(Uart2_Tx_Num=0;Uart2_Tx_Num < Uart2_Rx_Num;Uart2_Tx_Num++)

上位机下位机串口通信

大连海事大学 课程设计报告 课程名称:计算机微机原理课程设计 成员: 成员1:2220133293 范凯锋 成员2:2220132642 唐绍波 成员3:2220130079 曹晓露 设计时间:2016年3月7日至3月18日

考核记录及成绩评定

目录 1.设计任务与要求 (1) 1.1课程设计题目 (1) 1.2课程设计的背景 (1) 1.3课程设计的目的 (1) 1.4课程设计的意义 (1) 1.5设计任务 (1) 2.设计方案 (2) 2.1参数采集和传输设计 (2) 2.2参数显示设计 (2) 2.3模拟信号采样设计 (2)

2.4硬件研制过程 (2) 3.详细设计 (3) 3.1硬件系统框图与说明 (3) 3.2硬件设计 (4) 3.3软件主要模块流程图与说明 (7) 4.设计结果及分析 (8) 5.成员分工及工作情况 (9) 5.1成员分 工 (9) 5.2工作情 况 (9) 5.3实验总结 (9) 6.参考文献 (9) 7. 附录 (10)

一、设计任务与要求 1.1课程设计题目 双机数据采集系统设计 1.2 课程设计的背景 二十一世纪是信息化高速发展的世纪,产业的信息化离不开微型计算机的支持。微型计算机的进步是推动全球信息化的动力。因此在二十一世纪掌握微型计算机接口技术是十分有必要的。本次课题是双机参数采集系统设计,这次课题旨在通过自己对所需功能芯片的设计与实现来巩固以前所学的微机原理课程知识,同时也提高动手实践的能力,还有为将来进行更大规模更复杂的开发积累经验。 随着软件规模的增长,以及随之而来的对软件开发进度和效率的要求,高级语言逐渐取代了汇编语言。但即便如此,高级语言也不可能完全替代汇编语言的作用。 1.3课程设计的目的 《微机原理与汇编语言》是一门实践性和实用性都很强的课程,本次课程设计是在课程学习结束后,为使学生进一步巩固课堂和书本上所学知识,加强综合能力,充分理解和运用所学到的知识,通过简单的应用系统的设计,提高系统设计水平,启发创新思想。通过本课程设计希望达到以下目地: ?培养资料搜集和汇总的能力; ?培养总体设计和方案论证的意识; ?提高硬件,软件设计与开发的综合能力; ?提高软件和硬件联合调试的能力; ?熟练掌握相关测量仪器的使用方法;

练习使用显微镜知识点总结

第一节练习使用显微镜知识点 一、取镜和安放: 1.为何要右手握镜臂,左手托镜座? 答:防止目镜和反光镜脱落 2.为何要把显微镜放在距实验台边缘7cm处,还得偏左? 答:防止显微镜掉落,为了方便观察 二、对光: 1.选一个较小倍数的物镜,一般都是10倍的 2.用大拇指和食指转动转换器,而不能直接掰物镜 否则,镜头容易松动,使得放大倍数不准确了,另外也容易污染镜头。 3.对光后的效果是什么? 答:调出白亮的圆形视野(A转动转换器,使得目镜、物镜、 通光孔和反光镜在一条直线上B选择一个较大的光圈C 转 动反光镜) 4.光线太强为何不好?该怎么办? 答:强光刺眼,对眼睛不好;可换用较小光圈和使用反光镜的平面镜一面。反之,光暗时用较大光圈和凹面镜一面。 三、观察: 1.把玻片标本放在载物台上,用压片夹压住。 注意:是玻片上的标本正对通光孔的中心。 2.转动粗准焦螺旋,下降镜筒,直到接近玻片标本。

下降镜筒时,眼睛一定要注视物镜,以免压碎玻片,损毁物镜 3.上升镜筒(逆时针转动粗准焦螺旋,“入怀”),直到看清物像为 止。再略微转动细准焦螺旋,使看到的物象更加清晰。 4.你知道为什么用左眼看目镜,而同时右眼也要睁开吗? 答:一般人都是用右手写字,以便写字、记录或绘图 四、显微镜实验完毕后,应把显微镜外表擦拭干净,如需擦拭物镜 和目镜,请问擦镜纸。然后,转动转换器,把两个物镜偏到两旁,并将镜筒或什么缓缓下降到最低处。 小结 一.逆时针(入怀)转动“粗准焦螺旋”,镜筒是上升(逆升,顺降)二1. 目镜没有螺纹,越长,其放大倍数越小。 2. 物镜有螺纹,越长,其放大倍数越大。 三、物象的放大倍数=目镜的放大倍数×物镜的放大倍数 四、显微镜成的是倒像,上下左右都倒。 若玻片上有一“b”字,你所看到的物像是“q” 五、在观察生物标本时,发现视野中出现了个污点,想判断污点是 在物镜上、还是玻片标本上或是在目镜上,你有何办法? 答:先转动目镜,若污点跟着动,则污点在目镜上。若污点不动,再移动玻片,若污点跟着动,则污点在标本上。若污点不动,则污点在物镜上。 六.显微镜的放大倍数越高,视野越暗,所看到的实物范围越小; 放大倍数越低,视野越亮,所看到的实物范围越大。

相关主题