windows ce RS232C串行口驱动程序设计
WinCE.NET下串口驱动程序设计

下串口驱动程序设计李振兴,邓中亮北京邮电大学电子电子工程学院计算机应用技术专业,北京(100876)E-mail:lizhenxing.bupt@摘要:本文介绍下设备驱动程序模型,并以S3C2410下串口驱动程序设计为例,分析了串行设备的命名规则,并在此基础上深入分析、探讨了ARM体系下 串口注册表的设置方式以及串口地址的分配方式,最后给出了一种向平台添加一个额外串口的方法,实验结果证明了方法的有效性。
关键词:,驱动程序,串口,注册表1.引言是微软公司向嵌入式领域推出的一款紧凑、高效的32位嵌入式操作系统,具有多任务、实时性、模块化及可伸缩性、强大的通信和多媒体能力等特点[1],在移动计算、工业控制和信息家电等诸多领域都有广泛的应用。
通讯能力是基于设备的一个关键性特征。
在嵌入式系统开发过程中,常常需要面临与外围设备通信的问题,对此提供了广泛的硬件支持和通讯方式,对于用电缆、调制解调器或者红外传输介质连接的设备提供了串行通信支持。
尽管在计算机外围通讯中已经有了比串口更快、更稳定的接口,但是在基于的嵌入式设备中,串行通讯仍然是最基本、最常用的通讯方式,被绝大部分设备所支持。
例如,目前流行的基于的手持设备一般都具有导航和电话功能,而GPS和GSM /GPRS 模块都是外置串口的终端设备。
因此,在很多基于的嵌入式系统开发中,串行通信的实现是一个重要环节。
本文利用工具Platform Builder、以串口驱动程序为例,探讨下的驱动程序开发,分析串口注册表的设置方式以及串口地址的分配方式,以及向平台添加串口驱动的方法。
下的驱动程序目前基于的两种模型是本机设备驱动程序和流接口驱动程序[2]。
本机设备驱动程序用于低级、内置设备,提供一组定制的接口,可通过移植、定制微软提供的驱动样例来实现。
流接口驱动程序实现一组固定的流接口函数,所有的CE设备皆可使用此模型实现。
开发工具Platform Builder中包含的样本设备驱动程序分为两种:单片驱动程序和分层的驱动程序,如图1所示。
用C编写的RS232串口通信程序

void main(){delayms(100);init(); //初始化系统delayms(100);init_wdt(); //初始化看门狗while(1){while(!RI_0) //是否收到数据{clr_wdt();}RI_0=0; //清除接收中断标志buffer=S0BUF;if(buffer==0x5a) //检测祯头0start0=1;if(buffer==0x54) //检测祯头1start1=1;if(buffer==0x5a) //检测祯尾0end0=1;if(buffer==0xfe) //检测祯尾1end1=1;if((start0==1)&(start1==1)){buff[i]=buffer; //从祯头1开始存储数据i++;}if((end0==1)&(end1==1)) //是否已经接收祯尾{count=i; //数据长度为count个i=1;if((buff[2]==0x03)&(count==107)) //是否422指令 {buff[0]=0x5a; //重填祯头0buff[count-4]=0; //校验和清零for(k=2;k<(count-4);k++) //计算校验和{buff[count-4]+=buff[k];}for(k=0;k<count;k++) //从祯头1开始循环发送{S0BUF=buff[k];while(!TI_0); //等待发送完成TI_0=0; //清除发送中断标志}reset();}else if((buff[2]==0x05)&(count==7)) //是否AD测试指令{sendad();reset();}else if((buff[2]==0x18)&(count==7)) //是否发送时序信号指令{sendpaulse();reset();}else //如果接收错误,则恢复各标志位为初始状态以便下次接收 {reset();}}}}void reset(){start0=0; //祯头祯尾标志位清零start1=0;end0=0;end1=0;for(k=0;k<count;k++){buff[k]=0x00; //缓冲区清零}count=0; //计数清零}。
计算机网络实验 RS232串口通信程序的编写

实验二RS232串口通信程序的编写一.实验目的1.掌握串口通讯编程的编写2.实现两台计算机通过RS232通信二.编程环境Visual studio 2008三、实验原理1 概述在现代的各种实时监控系统和通信系统中,在Windows 9X/NT下利用VC++对RS-232串口编程是常用的手段。
Windows 9X/NT是抢先式的多任务操作系统,程序对CPU的占用时间由系统决定。
多任务指的是系统可以同时运行多个进程,每个进程又可以同时执行多个线程。
进程是应用程序的运行实例,拥有自己的地址空间。
每个进程拥有一个主线程,同时还可以建立其他的线程。
线程是操作系统分配CPU时间的基本实体,每个线程占用的CPU时间由系统分配,系统不停的在线程之间切换。
进程中的线程共享进程的虚拟地址空间,可以访问进程的资源,处于并行执行状态,这就是多线程的基本概念。
2 VC++对多线程的支持使用MFC开发是较普遍的VC++编程方法。
VC++把线程分为两种:用户界面线程和工作者线程。
用户界面线程能够提供界面和用户交互,通常用于处理用户输入并相应各种事件和消息;而工作者线程主要用来处理程序的后台任务。
程序一般不需要直接创建CWinThread对象,通过调用AfxBeginThread()函数就会自动创建一个CWinThread对象,从而开始一个进程。
创建上述的两种线程都利用这个函数。
线程的终止取决于下列事件之一:线程函数返回;线程调用ExitThread()退出;异常情况下用线程的句柄调用TerminateThread()退出;线程所属的进程被终止。
3 多线程在串口通信中的应用3.1 串口通信对线程同步的要求因为同一进程的所有线程共享进程的虚拟地址空间,而在Windows 9X/NT系统下线程是汇编级中断,所以有可能多个线程同时访问同一个对象。
这些对象可能是全局变量,MFC的对象,MFC的API等。
串口通信的几个特点决定了必须采用措施来同步线程的执行。
基于单片机的RS-232C串行通信接口设计

课程设计任务书课程名称专业综合课程设计院(系)专业课程设计题目基于单片机的RS-232C串行通信接口设计课程设计时间: 2011 年1 月3 日至2011 年 1 月14 日课程设计的内容及要求:利用W A VE仿真器、8051单片机开发基于单片机的RS-232C串行通信系统,实现单片机与PC机的通讯,要求实现数据收发功能.具体要求如下:(1)按以上要求制定设计方案,并绘制出系统工作框图;(2)按要求设计单片机系统,给出电路原理图;(3)用仿真器及单片机系统和PC机进行程序设计与调试;(4)接受PC机发送数据,并将其会发给PC机;指导教师年月日负责教师年月日学生签字年月日目录0. 前言 (1)1. 总体方案设计 (2)2. 硬件电路的设计 (2)2.1 单片机介绍 (2)2.2 串口基本结构介绍 (3)2.3 电平转换电路设计 (4)2.4 整体电路设计 (5)3 软件设计 (6)3.1 串行通信的实现 (6)3.2 流程框图 (6)4.联合调试 (7)5. 课设小结及进一步设想 (7)参考文献 (9)附录I 元件清单 (10)附录II 整体电路图 (11)附录III 源程序清单 (12)基于单片机的RS-232C串行通信接口设计杨毅沈阳航空航天大学自动化学院摘要:随着计算机技术特别是单片机技术的发展,单片机的应用领域越来越广泛,单片机在工业控制、数据采集以及仪器仪表自动化等许多领域都起着十分重要的作用。
但在实际应用中,在要求响应速度快、实时性强、控制量多的应用场合,单个单片机往往难以胜任,这时使用多个单片机接合PC机组成分布式系统是一个比较好的解决方案。
这样,单片机的数据通信技术就变得十分重要,在某种程度上说,掌握了单片机的数据通信技术也就是掌握了单片机的核心应用技术。
现在单片机及PC机在结构、性能和经济上为实现远程串行通信提供了很好的条件,串行通信是指按照逐位顺序传递数据的通信方式,由于仅需三根传输线传送信息且通信距离相对较远,所以在控制领域的现场监测、分布控制等场合有着重要的应用价值。
Windows CE下的串口驱动设计

ly rdd ie t te m rv ra dito u e h p cf e eo me rc s fsra rv ra dtepo e s fitru t rc sig a ee rv rwi sra d e, n r d c stes e i cd v lp nt o eso e l i e n rc s er p o e sn . h i n i p i d h o n p
及 Wi o s E的中断处理 过程 ,提出流接 口和分层相结合的驱动程序 设计方案 ,给出 Wi o s E 下串口驱动的具体开发过程及串 口 n w d C n w d C 驱
动 的 中断 处 理过 程 。
关健词 :嵌入式系统;中断处理 ;串 口驱动
De i n o e i l i e i d wsCE sg fS ra v ri W n o Dr n
中圈 分类号 E 下 的 串 口驱 动 设 计 no C
司浩乐 ,万 波 ,田玉敏 ‘
( 西安电子科技大学外部设备研究所 ,西安 7 0 7 ) 10 1
摘
要 :驱动程序 及串口驱动的开发和设计是构建嵌入式系统 的重要组成部分。该文介 绍了 Wi o s E下 的驱动程序 的结构、开发过程 n w d C
软为每种类型的本地驱动提供 了定制的接 I ,本地设备 驱动 S l 为所有特定类型的设备提供 了一组标准的功能 。常见的内建 驱动有键盘 、触摸屏 、音频设备等 。 可 安 装 的驱 动 程 序 又 称 作 流设 备 接 口程 序 (t a Sr ms e It fc r e) ne ae D i r,是 由设备 管理器 动态加载 的用 户模 式的 r v D L。这类驱动具有一组相 同的导出函数——流接 口函数, L
串口通信Windows程序设计

串口通信Windows程序设计一.工作环境硬件连接好的串口设备(虚拟串口软件VSPM),Visual Studio 2008二.基本知识1.串口通信串行口通信,IDE,USB,RS232,主要讲RS232接口,理论传输距离可以达到50m,实际应用只有15m左右,传输速度较慢,波特率115200bps时,速度才有14KB/S2.串口通信传输方式a)异步传输:异步传输将比特分成小组进行传送,小组可以是8位的1个字符或更长。
发送方可以在任何时刻发送这些比特组,而接收方从不知道它们会在什么时候到达。
双机通讯需要设定开始位,数据位,校验位,停止位,双机不需要同步时钟,速率慢。
b)同步传输:数据以帧的形式发送,双机时钟必须同步,否则会出现传输错误,速度比异步传输快。
三.Windows串口程序设计基础在Win32下,可以使用两种编程方式实现串口通信,其一是使用ActiveX控件,这种方法程序简单,但欠灵活。
其二是调用Windows的API函数,这种方法可以清楚地掌握串口通信的机制,并且自由灵活。
我们只介绍API串口通信部分。
同步操作时,API函数会阻塞直到操作完成以后才能返回(在多线程方式中,虽然不会阻塞主线程,但是仍然会阻塞监听线程);而异步操作方式,API函数会立即返回,操作在后台进行,避免线程的阻塞。
无论那种操作方式,一般都通过四个步骤来完成:1.打开串口2.配置串口3.读写串口4.关闭串口(1)打开串口HANDLE CreateFile( LPCTSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDistribution,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile);lpFileName:将要打开的串口逻辑名,如“COM1”;dwDesiredAccess:指定串口访问的类型,可以是读取、写入或二者并列;dwShareMode:指定共享属性,由于串口不能共享,该参数必须置为0;lpSecurityAttributes:引用安全性属性结构,缺省值为NULL;dwCreationDistribution:创建标志,对串口操作该参数必须置为OPEN_EXISTING;dwFlagsAndAttributes:属性描述,用于指定该串口是否进行异步操作,该值为FILE_FLAG_OVERLAPPED,表示使用异步的I/O;该值为0,表示同步I/O 操作;hTemplateFile:对串口而言该参数必须置为NULL;同步I/O方式打开串口的示例代码:HANDLE hCom; //全局变量,串口句柄hCom=CreateFile("COM1",//COM1口GENERIC_READ|GENERIC_WRITE, //允许读和写0, //独占方式NULL,OPEN_EXISTING, //打开而不是创建0, //同步方式NULL);if(hCom==(HANDLE)-1){AfxMessageBox("打开COM失败!");return FALSE;}return TRUE;重叠I/O打开串口的示例代码:HANDLE hCom; //全局变量,串口句柄hCom =CreateFile("COM1", //COM1口GENERIC_READ|GENERIC_WRITE, //允许读和写0, //独占方式NULL,OPEN_EXISTING, //打开而不是创建FILE_A TTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, //重叠方式NULL);if(hCom ==INV ALID_HANDLE_V ALUE){AfxMessageBox("打开COM失败!");return FALSE;}return TRUE;(2)配置串口在打开通讯设备句柄后,常常需要对串口进行一些初始化配置工作。
基于C语言的RS232串口通信的设计

基于C语言的RS232串口通信的设计RS232是一种常见的串行通信接口,广泛用于计算机与外部设备之间的数据传输。
RS232串口通信涉及到多个方面的设计,包括串口参数设置、数据的发送与接收等。
本文将以C语言为基础,介绍如何设计一个基于RS232串口通信的程序。
接下来,我们需要编写数据发送和接收的函数。
数据的发送包括两个步骤:打开串口和发送数据。
首先,我们需要打开串口,并设置好相应的参数。
在C语言中,可以通过打开文件的方式来打开串口设备文件。
例如,可以使用`fopen(`函数打开串口设备文件:```FILE* serial_port = fopen("/dev/ttyS0", "w");if(serial_port == NULL)printf("Failed to open the serial port.\n");return -1;```然后,我们可以使用`fprintf(`函数将数据写入串口设备文件,实现数据的发送:```fprintf(serial_port, "Hello, RS232!\n");```数据的接收与数据的发送类似,也包括两个步骤:打开串口和接收数据。
我们仍然可以使用`fopen(`函数打开串口设备文件,并设置好相应的参数。
然后,可以使用`fgets(`函数从串口设备文件中读取数据:```char buffer[1024];fgets(buffer, sizeof(buffer), serial_port);printf("Received Data: %s", buffer);```需要注意的是,当数据到达串口时,我们需要设置好超时时间,以免数据接收阻塞程序执行。
在C语言中,可以通过设置串口设备文件的文件描述符来设置超时时间。
最后,我们需要在程序中循环调用数据发送和接收的函数,实现数据的循环传输。
RS-232串口通信程序设计

RS-232串口通信程序设计实验要求:用TC对计算机的串口进行编程,并作一个简单的串口查询通讯程序。
实验方案:用RS-232串口通讯线将两台计算机A、B的串口相连。
实验步骤:1、首先对计算机串口通讯控制芯片8250的控制寄存器进行初始化和设置;2、对计算机B的串口发送一个数据前,查询计算机A的串口的发送移位寄存器是否为空,如果是则发送数据,如果为否则继续查询,直到条件成立;执行完发送指令后,再次查询计算机A的口的发送移位寄存器是否为空,如果是则结束发送;如果为否,则继续查询,直到条件成立。
3、从计算机A的串口接受刚才从计算机B的串口发送的数据前,先查询计算机A的口的接收数据标志位是否为1,如果是则表示计算机A的口接收数据准备就绪,执行接收指令,即从计算机A的口读入数据,若否则表示没有准备好接收,继续查询计算机A的口的接收数据标志位,直到为1;接收完数据后,再次查询计算机A的串口的接受寄存器是否为空的标志位的状态,如果为1则程序转入计算机B的串口的数据发送程序;如果否,则继续查询等待,直到接收。
实验内容:1.在COMDEBUG中针对串口通信各寄存器进行设置,掌握各寄存器在串口通信中的作用及各参数的含义。
地址寄存器名称备注3F8H 发送保持寄存器(THR)DLAB=03F8H 接收缓冲寄存器(RBR)DLAB=03F8H 波特率因子寄存器[低](DLL)DLAB=13F9H 波特率因子寄存器[高](DLM)DLAB=13F9H 中断允许寄存器(IER)DLAB=03FAH 中断识别寄存器(IIR)3FBH 线路控制寄存器(LCR)3FCH Modem控制寄存器(MCR)3FDH 线路状态寄存器(LSR)3FEH Modem状态寄存器(MSR)注:com1口的基地址为:3F8; com2口的基地址为:2F8。
在上表中,10个可编程寄存器,使用了7个地址,其中部分寄存器共用一个地址,由DLAB=0/1来区分,在DLAB=1,用于设定通讯所需的波特率;8250的控制寄存器控制/状态字:1)接收缓冲寄存器(RBR)和发送保持寄存器(THR)RBR暂存从线路上接收到的有效字符,等待本地读取。
RS232C端口实时监控软件的设计实现

RS232C端⼝实时监控软件的设计实现RS-232-C端⼝实时监控软件的设计实现有偿征集原创⽂章,为您创收投递⽂章减⼩字体增⼤字体摘要:本⽂介绍了在Microsoft V isual C++ 6.0环境下对RS-232-C串⾏端⼝进⾏编程,以及对后台监控程序所普遍涉及到的⽆阻塞后台运⾏、数据的实时接收和处理等问题的解决⽅法。
⼀、引⾔在实验室和⼯业应⽤中,受信道成本限制,串⼝常常作为计算机与外部串⾏设备之间的⾸选数据传输通道,⽽且由于串⾏通信⽅便易⾏,许多设备和计算机都可以通过串⼝摘要:本⽂介绍了在Microsoft V isual C++ 6.0环境下对RS-232-C串⾏端⼝进⾏编程,以及对后台监控程序所普遍涉及到的⽆阻塞后台运⾏、数据的实时接收和处理等问题的解决⽅法。
⼀、引⾔在实验室和⼯业应⽤中,受信道成本限制,串⼝常常作为计算机与外部串⾏设备之间的⾸选数据传输通道,⽽且由于串⾏通信⽅便易⾏,许多设备和计算机都可以通过串⼝对外设进⾏控制、检测,串⼝通讯⽇益成为计算机和外设进⾏通讯、获取由外设采集到的监测数据的⼀个⾮常重要的⼿段。
本⽂所描述的程序实例运⾏于Windows 9x操作系统下,可后台运⾏、实时接收、处理从端⼝传来的数据,并能通过向串⼝发送命令来控制外设的动作。
为了避免在实时监控数据时引发程序阻塞,在本程序中引⼊了线程和端⼝中断响应等技术。
⼆、程序设计思路由于本程序要对串⾏端⼝进⾏实时监控,这就要求它是⼀个后台程序,在监控的同时可以在前台进⾏其他⼀些于之⽆关的操作。
因⽽在实现时即要避免⽆时⽆刻都在反复读端⼝的效率低下的轮询⽅式,⼜不能因为来不及处理⽽将突然到达的监测数据丢失。
只有采取端⼝中断的异步⽅式才能实现⾼效、安全的监控过程,只要⼀有数据到达端⼝,马上抛出中断请求,中断处理函数便会及时启动以处理到来的数据,从⽽避免了轮询间隙丢时数据的可能。
⽽在⼤部分⽆数据到达的时间内不会有中断抛出,中断处理函数也不会执⾏,即仅仅在有数据到达的⼀瞬间进⾏⼯作,此效率不可谓不⾼。
RS232通信程序设计

RS232通信程序设计标签:it【实验目的】1、理解串口通信的原理。
2、设计在Windows环境下通过串口相互进行计算机会话的基本通信程序。
【实验性质】综合与设计性实验【实验条件】需要带有RS232接口的计算机,一条RS232连接线(双机互联或一台计算机的两个串口互联)。
【实验指导】在Windows环境下设计串口通信程序,一种途径是利用Microsoft公司提供的ActiveX控件MSComm.ocx。
它为开发RS232通信程序提供了简便方法。
1、MSComm控件的属性和事件一个MSComm控件仅对应一个串行端口。
如果应用程序需要访问多个串口,必须使用多个控件。
MSComm控件有很多重要的属性,下面是几个最常用的属性:1)CommPort:用于设置并返回连接的串口号,Windouws将使用该串口和外界通信。
2)Settings:用于设置并返回数据传输的通信参数。
例如设置值为:“4800,n,8,1”时,表示数据传输速率为4800bit/s,没有奇偶校验,数据位是8位,停止位是1位。
3)PortOpen:取值为true或flase,用于打开或者关闭端口。
4)InputMode:取值及其含义如表2-1所示,用于设置或返回Input属性取回的数据的类型。
5)Inputlen:设置或返回依次从接收缓冲区读取的字节数。
6)InPut:用于从接收缓冲区读取Inputlen长度的数据,并将接收数据赋予变量。
7)OutPut:用于向发送缓冲区写数据,OutPut属性可以发送文本或二进制数据。
8)Rthreshold:该属性为一阀值,当接收缓冲区中字符数达到该值时,MSComm 控件设置Commevent属性为ComEvReceive,并产OnComm事件,用户可在OnComm 事件处理程序中进行相应处理,若Rthreshold属性设置为0,则不产生OnComm 事件。
9)Sthreshold:该属性为一阀值,当发送缓冲区中字符数小于该值时,MSComm 控件设置Commevent属性为ComEvSend,并产OnComm事件,若Sthreshold属性设置为0,则不产生OnComm事件。
C语言设计实现RS-232标准接口串行通信的应用(半双工串行通信的发送方)

学 号:课 程 设 计题 目采用C 语言设计实现RS-232标准接口串行通信的应用 (半双工串行通信的发送方) 学 院 计算机科学与技术 专 业计算机科学与技术 班 级计算机 班 姓 名指导教师201 年 月 日目录接口课程设计任务书 (2)1.课程设计目的与要求 (3)1.1目的描述 (3)1.2要求描述 (3)2.设计分析 (4)2.1背景知识 (4)2.1.1串行通信 (4)2.1.2串行接口标准EIA RS-232C (6)2.2接口芯片介绍 (8)2.2.1可编程串行接口芯片8251A (8)2.2.2可编程定时/计数器8253A (10)2.2.3可编程并行接口8255A (11)2.3硬件平台设计 (13)2.3.1 MFID实验平台 (13)2.3.2硬件连接和跳线设置 (13)3.详细设计 (14)3.1初始化程序 (14)3.1.1 8251A初始化 (14)3.1.2 8253A初始化 (14)3.1.3 8255A初始化 (15)3.2模块说明 (15)3.2.1主要函数模块及功能 (15)3.2.2模块框图 (15)3.2.3 程序流程图 (16)4. 开发平台及源程序 (17)4.1开发平台 (17)4.2源程序的主要部分 (17)5. 程序测试 (19)5.1测试用例 (19)5.2程运行结果及分析 (19)6. 自我评价与总结 (20)6.1自我评价 (20)6.2经验与收获 (20)本科生课程设计成绩评定表 (22)接口课程设计任务书学生姓名专业班级计算机0 班指导老师工作单位计算机科学与技术学院题目:采用C语言设计实现RS-232标准接口串行通信的应用(半双工串行通信的发送方)一、内容:通过MIFID微机实验台上的RS-232标准接口与另一台上的RS-232标准接口采用半双工方式进行串行通信。
接口硬件电路图见附录所示。
二、要求:1、使用定时/计数器8253给可编程串行通信接口8251A提供发送和接收时钟。
课设:基于单片机的RS-232C串行通讯接口设计

沈阳航空航天大学课程设计(论文)题目基于单片机的RS-232C串行通讯接口设计班级 9407102学号 2009040701067学生姓名徐茂哲指导教师张晓东沈阳航空航天大学课程设计任务书课程名称专业综合课程设计院(系)自动化学院专业测控技术与仪器班级9407102 学号2009040701067 姓名徐茂哲课程设计题目基于单片机的RS-232C串行通讯接口设计课程设计时间: 2012 年12月29 日至2013 年1月11 日课程设计的内容及要求:利用8051单片机开发RS-232C串行通信系统,利用Modbus通信协议,实现单片机与PC机的通信,要求实现数据收发功能。
具体要求如下:(1)按以上要求制定设计方案,并绘制出系统工作框图;(2)按要求设计单片机系统,给出电路原理图;(3)用单片机系统和PC机进行程序设计与调试;(4)接收PC机发送数据,并将其回发给单片机;指导教师年月日负责教师年月日学生签字年月日目录0. 前言 01. 总体方案设计 (1)2. 硬件电路的设计 (1)2.1 单片机系统 (1)2.2 MAX232芯片 (4)2.3 整体电路设计 (5)3 软件设计 (7)4.联合调试 (6)5. 课设小结及进一步设想 (8)参考文献 (9)附录I 元件清单 (10)附录II 整体电路图 (10)附录III 源程序清单 (12)基于单片机的RS-232C串行通讯接口设计徐茂哲沈阳航空航天大学自动化学院摘要:本文主要设计了一个基于RS-232C的单片机串行通讯接口系统,利用Modbus通信协议,实现单片机与PC机的通信,要求实现数据收发功能。
关键字:RS-232C;数据发送;数据接收;LED显示;单片机与PC机串行通信。
0.前言计算机的发展对通信起了巨大的推动作用,计算机和通信紧密结合构成了灵活多样的通信控制系统,也可以构成强有力的信息处理系统,这样对社会的发展产生了深远的影响。
随着电子技术和计算机技术的发展,特别是单片机的发展,使传统的测量仪器在原理、功能、精度及自动化水平等方面发生了巨大的变化,形成了一种完全突破传统概念的新一代测试仪器——智能仪器。
windows ce RS232C串行口驱动程序设计

实验5 RS232C串行口驱动程序设计实验目的掌握RS232串行口设备驱动程序的编写方法,实现串行口的初始化、中断管理、发送与接收处理的程序设计技巧。
实验环境⏹操作系统:windows 2000以上版本,要求安装.NET Framework 1.1⏹软件工具列表:⏹Microsoft ActiveSyn 4.5;⏹Platform Builder 5.0;实验学时2学时,必做实验。
实验内容理解驱动程序的原理与功能,掌握流式接口驱动程序的结构、编写、加载及调试过程预备知识驱动程序是对底层硬件的抽象。
应用程序开发者不需要真正理解底层驱动的工作原理,他们只需要通过Windows CE提供的API函数,就可以直接与硬件进行交互。
例如,如果应用程序要对串口进行操作,只需要:1.在COMx上调用CreateFile( )2.调用WriteFile( ) 往串口写数据3.调用CloseHandle( ) 关闭串口对于其他类型的API也是一样的。
如果我们需要向显示器输出,我们只需要调用PolyLine( ), 或者MoveToEx( ), LineTo( )等函数,而不需要理解显示器的真正工作原理。
在Windows CE中,驱动就是一个简单的用户态动态链接库(DLL),DLL 会导出一些公共的接口,DLL被父进程(通常是device.exe或者gwes.exe)加载,然后,父进程通过DLL导出的接口调用DLL。
流式接口的驱动程序导出一系列大家熟知的接口。
还拿串口驱动当例子。
我们希望可以往串口读写数据,因此,我们希望驱动程序可以导出Open, Close, Read, 和Write接口。
此外,流式接口的驱动程序还导出如下函数:PowerUp, PowerDown, IO Control, Init, 和DeInit.实验步骤一.、编写流式接口的驱动程序1.打开Platform Builder。
2.利用Platform Wizard创建新的平台3.在Platform Builder中选择“File”->“New Project or File”,创建一个“Windows CE Dynamic link library”项目,项目的名称填写“My Driver”。
Windows CE下串口驱动关键技术

icu ig r g s rc n g r i n it r p r c s i g i lme tt n o n t n i DD n DD y r T e itn in n ld n i e o f u a o , ne r t o e sn . mp e n ai f u ci M e t i t u p o f o n a dP l e. h e t a n o o t i p p r s oo e e in meh dt i e r g a o e e d d e up n i d ws . f s a e f r s t o d v r o m f mb d e ime tn W n o h it d g or p r q i CE
指示 发送 器 是否 为空 ,发送 缓 冲区 是否 为空 , 接 收缓 冲 区是否 准备 好
指示 U R A T的一 些错误 状 态 。
UT H X
UF T T SA lI 『Ⅻ l
写 入要发 送 的数据
.
指 示 FF IO是 否为 空和 使用 的空 间等 读 出要 读 的数据
பைடு நூலகம்
是驱动设计 的关键环节 。驱动程序 需要实现 特定设备 的中断响应 , 对数据进行处理 。 n o s E将 中断过 Wid w C
程 分为 IR ( S 中断服 务例程 )和 I T ( S 中断服务线程 )
指针,这样 MD D层就可 以调用 P D层 的函数来操作 D 串口。原理图如图 1 所示 。
两 部分【, n o s E操作系统不能直接处理物理 中 4 Wid w J C
断 ,只能处理系统 中断 。IR 运行在 内核模 式下 ,向 S 系统返回 中断标识号给 中断处理器 ,并且屏 蔽板级的
8.1 RS-232 通信程序设计

OutBufferCounter属性
该属性用于返回发送缓冲区内等待发送的字节 数,可用来清空缓冲区。
⑵MSComm32控件的属性
OutPut属性
该属性用于通过发送缓冲区发送数据。
SThreshold属性
该属性为一阀值,当输出缓冲区字节数小于
该值后就产生OnComm事件,并且CommEvent
非常有效的方法,依据产生的事件和错误,
MSComm控件为CommEvent属性赋不同的代码,
同时产生OnComm事件。用户程序就可在
OnComm事件处理程序中针对不同的CommEvent
属性值执行不同的操作。
⑶ OnComm事件与CommEvent属性
CommEvent属性设计时无效,运行时只读。常见的 CommEvent属性值如下(详见教程): ComEvReceive :当Rthreshold属性值非零,则每当接收 到Rthreshold个字节数据。该事件将持续产生,直到用 Input属性从接收缓冲区中读取并删除数据。 ComEvCTS :CTS信号线状态发生变化。
ComEvntFrame :帧错误。
…………
ComEvntRxOver :接收缓冲区溢出,缓冲区中已没有空间。
⑷利用MSComm控件的通信步骤
通常按照下面的步骤来使用MSComm控件进行 通信控制: 加入MSComm对象; 选定通信端口号,即设定Commport属性; 设定通信参数,即Settings属性; 确定采用中断或是轮询方式处理到达数据; 开启通信端口,即将portOpen属性设为true ; 使用Input或Output属性,送出字符串或读入字 符串; 结束通信活动后,将通信端口关闭。
⑴RS232C 接口9个引脚信号列表与时序
Windows CE下串行通信的实现

Windows CE 下串行通信的实现 摘要是微软公司推出的一种嵌入式的操作系统、用于系统资源有限的 小型设备。
它采用模块化的结构,支持多种外部接口,包括最常用的 232 串行接 口。
本文就系统串行接口的编程进行讨论,并给出与设备的接口程序。
关键词串行通信 1 简介是一种小型的、基于的、具有 32 子集的操作 系统。
它的优势在于小尺寸、32 子集和对多平台的支持能力。
在下编程需要注意的是,设备的资源很少,存储器、显示器都很小, 接口也比较少,而且根据实际情况变化很大。
另外,只支持,这在编程中要格外注意。
在中,除了一些基本的通用控件以外,还有一些专门设计的控件,比 如。
体积虽小,但是它的功能并不少,内存管理、文件操作、多线程、网 络功能等等它都支持,可以说是麻雀虽小,五脏俱全。
2 下的串行通信串行端口在下属于流接口设备,它是串行设备接口的 常规驱动程序调用和与通信相关的具体函数的结合。
串行设备被视为用于打开、关闭、读写串行端口的常规、可安装的流设备。
的通信函数和其它大多数的通信函数相同。
特别要注意的是,不支持直接对串行端口的寄存器进行编程。
常用的串行端口函数介绍如下 1 打开和关闭串行端口函数用于打开串 行口。
=1,_|_,0,,_,0,。
注意 1 后要有一个冒号。
最后一个参数必须为 0,因为只支持非重叠。
第 3 个参数也必须为 0,通信端口不能像文件一样被共享。
这个函数的返回值是已打开的串行端口的句柄或者是__。
关闭串行口可以调用。
2 配置串行端口配置串行口主要是用结构配置端口设置, 包括波特率、 停止位、数据位长度、校验位、流量控制等等,还有配置超时值。
首先打开串行端口,用函数获得当前打开串口配置,然后根据需要修 改成员,最后用函数设置新的串口配置。
;创建变量=; ,&; 获取当前串口配置修改成员=9600;波特率=;校验位=; 停止位=8;,&;设置新的串口配置对串行端口来说,必须配置超时值,否 则程序可能陷入到一个循环来等待来自串口的字符。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验5 RS232C串行口驱动程序设计实验目的掌握RS232串行口设备驱动程序的编写方法,实现串行口的初始化、中断管理、发送与接收处理的程序设计技巧。
实验环境⏹操作系统:windows 2000以上版本,要求安装.NET Framework 1.1⏹软件工具列表:⏹Microsoft ActiveSyn 4.5;⏹Platform Builder 5.0;实验学时2学时,必做实验。
实验内容理解驱动程序的原理与功能,掌握流式接口驱动程序的结构、编写、加载及调试过程预备知识驱动程序是对底层硬件的抽象。
应用程序开发者不需要真正理解底层驱动的工作原理,他们只需要通过Windows CE提供的API函数,就可以直接与硬件进行交互。
例如,如果应用程序要对串口进行操作,只需要:1.在COMx上调用CreateFile( )2.调用WriteFile( ) 往串口写数据3.调用CloseHandle( ) 关闭串口对于其他类型的API也是一样的。
如果我们需要向显示器输出,我们只需要调用PolyLine( ), 或者MoveToEx( ), LineTo( )等函数,而不需要理解显示器的真正工作原理。
在Windows CE中,驱动就是一个简单的用户态动态链接库(DLL),DLL 会导出一些公共的接口,DLL被父进程(通常是device.exe或者gwes.exe)加载,然后,父进程通过DLL导出的接口调用DLL。
流式接口的驱动程序导出一系列大家熟知的接口。
还拿串口驱动当例子。
我们希望可以往串口读写数据,因此,我们希望驱动程序可以导出Open, Close, Read, 和Write接口。
此外,流式接口的驱动程序还导出如下函数:PowerUp, PowerDown, IO Control, Init, 和DeInit.实验步骤一.、编写流式接口的驱动程序1.打开Platform Builder。
2.利用Platform Wizard创建新的平台3.在Platform Builder中选择“File”->“New Project or File”,创建一个“Windows CE Dynamic link library”项目,项目的名称填写“My Driver”。
4.向导的第一步选择“A Simple Windows CE DLL”。
Platform Builder会为我们生成DLL框架代码。
5.修改Platform Builder生成的DllMain函数,如下:BOOL APIENTRY DllMain( HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved){switch ( ul_reason_for_call ){case DLL_PROCESS_ATTACH:OutputDebugString(L"MyDriver - DLL_PROCESS_ATTACH\n");break;case DLL_PROCESS_DETACH:OutputDebugString(L"MyDriver - DLL_PROCESS_DETACH\n");break;case DLL_THREAD_ATTACH:OutputDebugString(L"MyDriver - DLL_THREAD_ATTACH\n");break;case DLL_THREAD_DETACH:OutputDebugString(L"MyDriver - DLL_THREAD_DETACH\n");break; }return TRUE;}6.添加流式接口驱动的导出函数前置声明,如下:DWORD DEM_Init(LPCTSTR pContext, LPCVOID lpvBusContext);BOOL DEM_Deinit( DWORD hDeviceContext );DWORD DEM_Open( DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode );BOOL DEM_Close( DWORD hOpenContext );BOOL DEM_IOControl( DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut ); void DEM_PowerUp( DWORD hDeviceContext );void DEM_PowerDown( DWORD hDeviceContext );DWORD DEM_Read( DWORD hOpenContext, LPVOID pBuffer, DWORD Count ); DWORD DEM_Write( DWORD hOpenContext, LPCVOID pBuffer, DWORD Count ); DWORD DEM_Seek( DWORD hOpenContext, long Amount, WORD Type );#define IOCTL_DRIVER_DEMO 42// Not exposed by the Device Drivervoid DBGOut(DWORD dwValue);HANDLE hMem=NULL;DWORD dwCount;7.添加导出函数的具体实现,代码如下:DWORD DEM_Init( LPCTSTR pContext, LPCVOID lpvBusContext){OutputDebugString(L"MyDriver - DEM_Init - Context: ");OutputDebugString(pContext);OutputDebugString(L"\n");OutputDebugString(L"MyDriver - ~ DEM_Init\n");return 0x1234;}BOOL DEM_Deinit( DWORD hDeviceContext ){OutputDebugString(L"MyDriver - DEM_Deinit\n");OutputDebugString(L"MyDriver - ~ DEM_Deinit\n");return TRUE;}DWORD DEM_Open( DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode ){OutputDebugString(L"MyDriver - DEM_Open\n");OutputDebugString(L"hDeviceContext - ");DBGOut(hDeviceContext);OutputDebugString(L"\n");OutputDebugString(L"MyDriver - ~ DEM_Open\n");return 0x5678;}BOOL DEM_Close( DWORD hOpenContext ){OutputDebugString(L"MyDriver - DEM_Close\n");OutputDebugString(L"hOpenContext - ");DBGOut(hOpenContext);OutputDebugString(L"\n");OutputDebugString(L"MyDriver - ~ DEM_Close\n");return TRUE;}BOOL DEM_IOControl( DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut ) {OutputDebugString(L"MyDriver - DEM_IOControl\n");OutputDebugString(L"hOpenContext - ");DBGOut(hOpenContext);OutputDebugString(L"\n");switch (dwCode) {case IOCTL_DRIVER_DEMO:{OutputDebugString(L"DRIVER DEMO IOCTL...\n");// reverse the string...HANDLE hTemp=LocalAlloc(LPTR,dwLenIn+1);memset(hTemp,0x00,dwLenIn+1);TCHAR *tcOut=(TCHAR*)hTemp;TCHAR *tcIn=(TCHAR*)pBufIn;DWORD dwChars=dwLenIn/2;for (DWORD x=0;x < dwChars;x++) {tcOut[x]=tcIn[dwChars-x-1];}memcpy(pBufOut,hTemp,dwLenIn);LocalFree(hTemp);*pdwActualOut=dwLenIn;}break;default:OutputDebugString(L"Unknown IOCTL\n");break;}OutputDebugString(L"MyDriver - ~ DEM_IOControl\n");return TRUE;}void DEM_PowerUp( DWORD hDeviceContext ){OutputDebugString(L"MyDriver - DEM_PowerUp\n");OutputDebugString(L"hDeviceContext - ");DBGOut(hDeviceContext);OutputDebugString(L"\n");OutputDebugString(L"MyDriver - ~ DEM_PowerUp\n");}void DEM_PowerDown( DWORD hDeviceContext ){OutputDebugString(L"MyDriver - DEM_PowerDown\n");OutputDebugString(L"hDeviceContext - ");DBGOut(hDeviceContext);OutputDebugString(L"\n");OutputDebugString(L"MyDriver - ~ DEM_PowerDown\n");DWORD DEM_Read( DWORD hOpenContext, LPVOID pBuffer, DWORD Count ) {DWORD dwRetCount=0xffff; // default to errorOutputDebugString(L"MyDriver - DEM_Read\n");OutputDebugString(L"hOpenContext - ");DBGOut(hOpenContext);OutputDebugString(L"\n");if (NULL != hMem) {dwRetCount=dwCount;memcpy(pBuffer,hMem,dwCount);}OutputDebugString(L"MyDriver - ~ DEM_Read\n");return dwRetCount;}DWORD DEM_Write( DWORD hOpenContext, LPCVOID pBuffer, DWORD Count ) {OutputDebugString(L"MyDriver - DEM_Write\n");OutputDebugString(L"hOpenContext - ");DBGOut(hOpenContext);OutputDebugString(L"\n");if (NULL != hMem) {LocalFree(hMem);}hMem=LocalAlloc(LPTR,Count);memcpy(hMem,pBuffer,Count);dwCount=Count;OutputDebugString(L"MyDriver - ~ DEM_Write\n");return Count;}DWORD DEM_Seek( DWORD hOpenContext, long Amount, WORD Type ){OutputDebugString(L"MyDriver - DEM_Seek\n");OutputDebugString(L"hOpenContext - ");DBGOut(hOpenContext);OutputDebugString(L"\n");OutputDebugString(L"MyDriver - ~ DEM_Seek\n");return 0;}void DBGOut(DWORD dwValue){TCHAR tcTemp[10];wsprintf(tcTemp,L"%ld",dwValue);OutputDebugString(tcTemp);}8.添加导出函数的定义。