今天给各位分享windows串口是什么的知识,其中也会对windows如何打开串口进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
1、串口、端口,什么的都是什么意思,有什么作用。说一下
计算机“端口”是英文port的义译,可以认为是计算机与外界通讯交流的出口。其中硬件领域的端口又称接口,如:USB端口、串行端口等。软件领域的端口一般指网络中面向连接服务和无连接服务的通信协议端口,是一种抽象的软件结构,包括一些数据结构和I/O(基本输入输出)缓冲区。
按端口号可分为3大类:
(1)公认端口(Well Known Ports):从0到1023,它们紧密绑定(binding)于一些服务。通常这些端口的通讯明确表明了某种服务的协议。例如:80端口实际上总是HTTP通讯。
(2)注册端口(Registered Ports):从1024到49151。它们松散地绑定于一些服务。也就是说有许多服务绑定于这些端口,这些端口同样用于许多其它目的。例如:许多系统处理动态端口从1024左右开始。
(3)动态和/或私有端口(Dynamic and/or Private Ports):从49152到65535。理论上,不应为服务分配这些端口。实际上,机器通常从1024起分配动态端口。但也有例外:SUN的RPC端口从32768开始。
一些端口常常会被黑客利用,还会被一些木马病毒利用,对计算机系统进行攻击,以下是计算机端口的介绍以及防止被黑客攻击的简要办法。
8080端口
端口说明:8080端口同80端口,是被用于WWW代理服务的,可以实现网页浏览,经常在访问某个网站或使用代理服务器的时候,会加上“:8080”端口号,比如。
端口漏洞:8080端口可以被各种病毒程序所利用,比如Brown Orifice(BrO)特洛伊木马病毒可以利用8080端口完全遥控被感染的计算机。另外,RemoConChubo,RingZero木马也可以利用该端口进行攻击。
操作建议:一般我们是使用80端口进行网页浏览的,为了避免病毒的攻击,我们可以关闭该端口。
端口:21
服务:FTP
说明:FTP服务器所开放的端口,用于上传、下载。最常见的攻击者用于寻找打开anonymous的FTP服务器的方法。这些服务器带有可读写的目录。木马Doly Trojan、Fore、Invisible FTP、WebEx、WinCrash和Blade Runner所开放的端口。
端口:22
服务:Ssh
说明:PcAnywhere建立的TCP和这一端口的连接可能是为了寻找ssh。这一服务有许多弱点,如果配置成特定的模式,许多使用RSAREF库的版本就会有不少的漏洞存在。
端口:23
服务:Telnet
说明:远程登录,入侵者在搜索远程登录UNIX的服务。大多数情况下扫描这一端口是为了找到机器运行的操作系统。还有使用其他技术,入侵者也会找到密码。木马Tiny Telnet Server就开放这个端口。
端口:25
服务:SMTP
说明:SMTP服务器所开放的端口,用于发送邮件。入侵者寻找SMTP服务器是为了传递他们的SPAM。入侵者的帐户被关闭,他们需要连接到高带宽的E- MAIL服务器上,将简单的信息传递到不同的地址。木马Antigen、Email Password Sender、Haebu Coceda、Shtrilitz Stealth、WinPC、WinSpy都开放这个端口。
端口:80
服务:HTTP
说明:用于网页浏览。木马Executor开放此端口。
端口:102
服务:Message transfer agent(MTA)-X.400 over TCP/IP
说明:消息传输代理。
端口:109
服务:Post Office Protocol -Version3
说明:POP3服务器开放此端口,用于接收邮件,客户端访问服务器端的邮件服务。POP3服务有许多公认的弱点。关于用户名和密码交 换缓冲区溢出的弱点至少有20个,这意味着入侵者可以在真正登陆前进入系统。成功登陆后还有其他缓冲区溢出错误。
端口:110
服务:SUN公司的RPC服务所有端口
说明:常见RPC服务有rpc.mountd、NFS、rpc.statd、rpc.csmd、rpc.ttybd、amd等
端口:119
服务:Network News Transfer Protocol
说明:NEWS新闻组传输协议,承载USENET通信。这个端口的连接通常是人们在寻找USENET服务器。多数ISP限制,只有他们的客户才能访问他们的新闻组服务器。打开新闻组服务器将允许发/读任何人的帖子,访问被限制的新闻组服务器,匿名发帖或发送SPAM。
端口:135
服务:Location Service
说明:Microsoft在这个端口运行DCE RPC end-point mapper为它的DCOM服务。这与UNIX 111端口的功能很相似。使用DCOM和RPC的服务利用计算机上的end-point mapper注册它们的位置。远端客户连接到计算机时,它们查找end-point mapper找到服务的位置。HACKER扫描计算机的这个端口是为了找到这个计算机上运行Exchange Server吗?什么版本?还有些DOS攻击直接针对这个端口。
端口:137、138、139
服务:NETBIOS Name Service
说明:其中137、138是UDP端口,当通过网上邻居传输文件时用这个端口。而139端口:通过这个端口进入的连接试图获得NetBIOS/SMB服务。这个协议被用于windows文件和打印机共享和SAMBA。还有WINS Regisrtation也用它。
端口:161
服务:SNMP
说明:SNMP允许远程管理设备。所有配置和运行信息的储存在数据库中,通过SNMP可获得这些信息。许多管理员的错误配置将被暴露在Internet。 Cackers将试图使用默认的密码public、private访问系统。他们可能会试验所有可能的组合。SNMP包可能会被错误的指向用户的网络
串口一般用于接一些特殊的外接设备。比如通讯方面的设备。并口通常用于连接打印设备。串口比较小,有突出的针露在外面。并口一般比串口要大,通常是红色的,有两排小孔
串口形容一下就是 一条车道,而并口就是有8个车道
同一时刻能传送8位(一个字节)数据。
但是并不是并口快,由于8位通道之间的互相干扰。传输受速度就受到了限制。而且当传输出错时,要同时重新传8个位的数据。串口没有干扰,传输出错后重发一位就可以了。所以快比并口快。串口硬盘就是这样被人们重视的。
2、电脑的串行口是干什么的
串口叫做串行接口,现在的电脑一般有两个串行口:COM1和
COM2。你到计算机后面能看到9针D形接口就是了,有时我们也称它为RS-232接口。现在有很多手机数据线或者物流接收器都采用COM口与计算机相连。
Universal Serial Bus(通用串行总线)简称USB,是目前电脑上应用较广泛的接口规范,USB接口是电脑主板上的一种四针接口,其中中间两个针传输数据,两边两个针给外设供电。USB接口速度快、连接简单、不需要外接电源,同时对外设有良好的兼容性,最多可连接127台外设。USB有两个规范,即USB1.1和USB2.0。
USB接口可以连接音箱、调制解调器(Modem)、数码相机、显示器、游戏杆、扫描仪、鼠标、键盘等外围设备,使得这些外设可以进行热插拔,即不关机插拔USB设备。
串口一般用于接一些特殊的外接设备。比如通讯方面的设备。并口通常用于连接打印设备。串口比较小,有突出的针露在外面。并口一般比串口要大,通常是红色的,有两排小孔
串口形容一下就是 一条车道,而并口就是有8个车道
同一时刻能传送8位(一个字节)数据。
但是并不是并口快,由于8位通道之间的互相干扰。传输受速度就受到了限制。而且当传输出错时,要同时重新传8个位的数据。串口没有干扰,传输出错后重发一位就可以了。所以快比并口快。串口硬盘就是这样被人们重视的。
我可以解释一下,首先说速度跟什么有关呢?1.位数,也就是在同一时间有多少位数据在传输,位数越多,则速度越快(你可以理解为汽车的车道数,肯定是车道数越多,同一时间可以通过的车辆数也越多).串口只有一位,而并口呢则有许多位
2.传输频率,也就是一秒钟可以传输多少数据.频率越高,则速度越快(可以把它理解为车速,是不是车速越快,通过的车辆数越多呢对吧).
速度=位数*传输频率
毫无疑问,位数肯定是串口少,而并口要多得多.但是传输频率呢,从计算机的发展角度来说吧,以前的时候计算机串口和并口的传输频率并无多少差异,所以并口的速度要远高于串口的速度,而后来串口和并口的传输频率分开了,串口的频率提高了特别多,以至于并口位数多的优势已经被串口频率高的优势完全压倒了.所以串口的速度就比并口快了.
从主机背面的接口中可以看出一二,早期的计算机遗留下来的串口(9针两排的接口)就要比并口(25针两排的接口,主要用于接打印机)慢很多,因为它们频率相差无几.而串口硬盘就要比并口硬盘快很多,因为它们的频率相差太多了.
新手必看
新手必读……电脑基础知识(希望大家帮忙来贴一些最简单的基础知识吧)
形形色色的主板接口(转)
一篇不错的介绍基础知识的文章,虽然成文时间较早,但做为基础知识来看还是不错的……
由于成文时间早,介绍的可能不全面,欢迎坛友们补充和完善
随着PC扩展功能的不断增强以及可连接外设的增多,如果采用非标准化的连接规范必然造成信息在速度、时序、数据格式以及类型等方面的不匹配,因此出现了形形色色的外部接口标准,标准PC的外部接口通常包括串口、并口、PS/2接口、USB接口、网络接口、音频接口和VGA接口等,在本文和后续文章中将分别对其进行介绍,在本文中将向大家介绍主板集成的外部接口。
一、并行接口(Parallel Port/Interface)
并口采用25针的双排插口,除最普遍的应用于打印机以外,还可用于连接扫描仪、ZIP驱动器甚至外置网卡、磁带机以及某些扩展硬盘等设备, 下面我们简单看看并口的发展历史:
最初的并口设计是单向传输数据的,也就是说数据在某一时刻只能实现输入或者输出。后来IBM又开发出了一种被称为SPP(Standard Parallel Port)的双向并口技术,它可以实现数据的同时输入和输出,这样就将原来的半互动并口变成了真正的双方互动并口; Intel、 Xircom 及Zenith于1991年共同推出了EPP(Enhanced Parallel Port,增强型并口),允许更大容量数据的传输(500~1000byte/s),其主要是针对要求较高数据传输速度的非打印机设备,例如存储设备等;紧接着EPP的推出,1992年微软和惠普联合推出了被称为ECP(Extended Capabilities Port,)的新并口标准,和EPP不同,ECP是专门针对打印机而制订的标准;发布于1994年的IEEE 1284涵盖了EPP和ECP两个标准,但需要操作系统和硬件都支持该标准,这对现在的硬件而言已不是什么问题了。目前我们所使用的并口都支持EPP和ECP这两个标准,而且我们可以在CMOS当中自己设置并口的工作模式。
二、串行接口(Serial Port)
在早期的PC系统中串口的物理连接方式有9针和25针两种方式,通过额外的子卡挡板与电脑连接,如下图所示
随着PC技术的发展,25针的串口逐渐被淘汰,目前串口都采用9针的连接方式直接集成在主板上。一般的PC主板都提供两个串口。
标准的串口能够达到最高115Kbps的数据传输速度,而一些增强型串口如ESP(Enhanced Serial Port,增强型串口) 、Super ESP(Super Enhanced Serial Port,超级增强型串口)等则能达到460Kbps的数据传输速率。
虽然主板一般都集成两个串口,可Windows却最多可提供8个串口资源供硬件设置使用(编号COM1到COM8),虽然其I/O地址不相同,但是总共只占据两个IRQ(1、3、5、7共享IRQ4,2、4、6、8共享IRQ3),平常我们常用的是COM1~COM4这四个端口。我们经常在使用中遇到这个问题——如果在COM1上安装了串口鼠标或其他外设,就不能在COM3上安装如Modem之类的其它硬件,这就是因为IRQ设置冲突而无法工作。这时玩家们可以将另外的外设安装在COM2或4。
三、USB(Universal Serial Bus,通用串行总线)接口
1. 简介
USB(Universal Serial Bus,通用串行总线)接口是由Compaq、IBM、Microsoft等多家公司于1994年底联合提出的接口标准,其目的是用于取代逐渐不适应外设需求的传统串、并口。1996年业界正式通过了USB1.0标准,但由于未获当时主流的Win95支持(直到Win95 OSR2才通过外挂模块提供对USB1.0的支持)而未得到普及,直到1998年USB1.1标准确立和Win98内核正式提供对USB接口的直接支持之后,USB才真正开始普及,到今天已经发展到USB2.0标准。
电脑上的USB接口是一个包含四条金手指引脚的扁平接口(如上图所示),如果我们剖开USB外设的数据线,可以发现其内部共有四条线,其中两条负责供电而另外两条负责数据的传输,如下图所示。
USB接口的连接线有两种形式,通常我们将其与电脑接口连接的一端称为“A”连接头,而将连接外设的接头称为“B”连接头(通常的外设都是内建USB数据线而仅仅包含与电脑相连的“A”连接头)。 “A”连接头表示“上流”至电脑;“B”连接头表示“下游”到外设。这样采用了不同的结构和定义就避免了连接上的混淆和困扰。
2. USB接口的性能特点
●热插拔,使用方便
USB接口真正实现了热插拔,在安装硬件时再也不需要象串口或并口这样经过关机-连接-开机-装驱动程序-重启这样的繁琐过程,真正实现在开机状态下的PnP(即插即用)。而且USB接口都有自己的单独保留中断号(由USB驱动程序自动分配,并在USB设备拔出后自动收回),不会和其他设备竞争有限的资源,可免去许多配置的麻烦。
●带宽大,速度快
USB1.1协议允许1.5Mbps和12Mbps两种数据传送速度规格,这大概是标准串口的100倍(115Kbps)以及标准并口的10倍,而新的USB2.0协议已经可以提供速率为480Mbps的高速传输。
注:1Mbps=0.125MB/s
●可连接设备多
USB接口理论上可以通过USB Hub采用菊花链的形式扩展连接127个设备,节点间的有效距离为5 米,通过USB Hub可以将有效距离延长至30米。但注意采用USB Hub扩展接口时最多只允许5个Hub的级联而且有30米的有效距离限制。
●简单的网络互连功能
可以利用USB接口来实现双机互连以交换简单的数据资料,组建最简单的对等网。
必须指出的是,USB2.0功能的实现要求硬件和软件同时支持,它包括主板的USB主控芯片和操作系统都要对USB2.0提供支持。就目前主流的Windows操作系统而言,目前只有Win2000和WinXP能够提供对USB2.0的完整支持,在其它Windows操作系统下虽然系统可以识别USB2.0设备,但无法以高速模式运行,而包括Linux、MAC OS和BEOS在内的非主流操作系统目前也开始提供对USB2.0的支持。
3. USB接口相关问题集
●我的硬件是否支持USB接口?
开机时进入CMOS设置界面,打开BIOS设置中的USB接口选项(Enable)。如果没有相关选项则需要升级BIOS或说明主板不支持USB接口。现今的主流主板都提供对USB接口的支持。
●我的操作系统是否支持USB接口?
以主流的Windows为例,在“我的电脑”-属性-硬件-设备管理器-通用串行总线控制器中查看是否有“USB Host Controller”和“USB Root Hub”的相关项目,如果有则说明你的操作系统已经支持USB接口,如果没有则说明需要升级添加USB接口驱动程序或你的操作系统不支持USB接口。如下图所示
●我的主板没有集成USB接口怎么办?
在这种情况下可以手动添加一块PCI接口的USB控制卡(一般自带2~4个USB接口),就像安装声卡或者显卡一样插上再安装相应的驱动程序就可以了。
●怎样使我的USB键盘在DOS下能正常使用?
要使USB接口的键盘(或鼠标)在DOS下正常使用,必须在CMOS设置界面中选择USB Legacy——Enable,以支持USB键盘或鼠标在DOS下面的正常使用。
正是基于USB接口具有一些传统接口无法比拟的优点,我们完全可以期待USB将会取代并口、串口以及键盘、鼠标所使用的PS/2接口,而成为新一代统一的接口标准。
四、IEEE1394接口
1. 简介
说到如日中天的USB接口,就不能不提到它的一个有力竞争者——IEEE1394接口。
假如你曾经玩过DV,那么你一定听说过“FireWire”这个术语——或者被称为索尼“i.Link”以及“IEEE1394”。
IEEE1394接口最初由Apple公司提出(称为“火线”技术)并在1995年由IEEE(电气与电子工程师协会)正式制定为总线标准,它与USB接口在外形以及大部分功能上都具有惊人的相似点。IEEE1394目前有两个版本,即通常所使用的IEEE1394a和发展中的更高速的IEEE1394b。
IEEE1394通常有两种接口方式,一种是六角型的六针接口,另一种是四角的四针接口,其区别就在于六针接口除了两条一对共两对的数据线外还多了一对电源线,可直接向外设供电,多使用于苹果机和台式电脑,而四针接口多用于DV或笔记本电脑等设备。如果剥开IEEE1394接口的数据线,我们就能看到如下图所示的内部结构:
2.性能特点
●使用方便,支持热插拔,即插即用,无需设置设备ID号,从Win98 SE以上版本的操作系统开始内置IEEE1394支持核心,无需驱动程序。
●数据传输速度快,IEEE1394a高达400Mbps,后续的IEEE1394b标准可将速度提升到800Mbps、1.6Gbps甚至3.2Gbps。
●自带供电线路,能提供8—40V可变电压,允许通过最大电流也达到1.5A左右,因此它能为耗电量要求小的设备进行供电。
●真正点对点连接(peer-to-peer),设备间不分主从,可直接实现两台DV间的数据传输或是多台电脑共享一台DV机,而且从理论上讲我们可以直接将IEEE1394接口DV机中的图像数据保存到IEEE1394接口的硬盘中。
当前我们应用最多的是带宽400Mbps的IEEE1394a接口,与其相比,正在发展中的IEEE1394b接口的特点是可以实现长途数据传输。今年初由美国德州仪器公司(Texas Instruments)推出了业界首款IEEE1394b器件TSB81BA3,不仅将上一代 1394a的速度加倍到800Mbps,而且还将通信距离增加到了100米,而如果采用石英类材料的光纤的话,则传输速度可以达到1.6Gbps,将来还有望提高到3.2Gbps。从而可确保在高速数据传输与多媒体网络中实现更佳的用户体验。
五、键盘、鼠标接口——PS/2
相信玩家们早已经没有使用COM端口的鼠标键盘了吧?现在我们使用的鼠标和键盘绝大多数采用PS/2接口,鼠标和键盘的PS/2接口的物理外观完全相同,初学者往往容易插错,以至于业界不得不在PC'99规范中用两种不同的颜色来将其区别开,而事实上它们在工作原理上是完全相同的,从下面的PS/2接口针脚定义我们就可以看出来。
注:1 空2 键盘、鼠标数据信号 3 +5V(驱动控制芯片和LED指示灯) 4 地 5 空置 6 键盘、鼠标时钟信号
3、什么是串口
串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。
串口定义:
串行接口 (Serial Interface) 是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯。串行通讯的特点是:数据位的传送,按位顺序进行,最少只需一根传输线即可完成;成本低但传送速度慢。串行通讯的距离可以从几米到几千米;根据信息的传送方向,串行通讯可以进一步分为单工、半双工和全双工三种。
4、串口的概念
串口叫做串行接口,现在的PC 机一般有两个串行口COM 1 和COM 2 。串行口不同于并行口之处在于它的数据和控制信息是一位接一位地传送出去的。 虽然这样速度会慢一些,但传送距离较并行口更长,因此若要进行较长距离的通信时,应使用串行口。通常 COM 1 使用的是9 针D 形连接器,也称之为RS-232接口,而COM 2 有的使用的是老式的DB25 针连接器,也称之为RS-422接口,这种接口目前已经很少使用。
串口通讯简介
一.串行通信的基本原理
串行端口的本质功能是作为CPU和串行设备间的编码转换器。当数据从 CPU经过串行端口发送出去时,字节数据转换为串行的位。在接收数据时,串行的位被转换为字节数据。
在Windows环境(Windows NT、Win98、Windows2000)下,串口是系统资源的一部分。
应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。
串口通信程序的流程如下图:
二.串口信号线的接法
一个完整的RS-232C接口有22根线,采用标准的25芯插头座(或者9芯插头座)。25芯和9芯的主要信号线相同。以下的介绍是以25芯的RS-232C为例。
①主要信号线定义:
2脚:发送数据TXD; 3脚:接收数据RXD; 4脚:请求发送RTS; 5脚:清除发送CTS;
6脚:数据设备就绪DSR;20脚:数据终端就绪DTR; 8脚:数据载波检测DCD;
1脚:保护地; 7脚:信号地。
②电气特性:
数据传输速率最大可到20K bps,最大距离仅15m.
注:看了微软的MSDN 6.0,其Windows API中关于串行通讯设备(不一定都是串口RS-232C或RS-422或RS-449)速率的设置,最大可支持到RS_256000,即256K bps! 也不知道到底是什么串行通讯设备?但不管怎样,一般主机和单片机的串口通讯大多都在9600 bps,可以满足通讯需求。
③接口的典型应用:
大多数计算机应用系统与智能单元之间只需使用3到5根信号线即可工作。这时,除了TXD、RXD以外,还需使用RTS、CTS、DCD、DTR、DSR等信号线。(当然,在程序中也需要对相应的信号线进行设置。)
以上接法,在设计程序时,直接进行数据的接收和发送就可以了,不需要 对信号线的状态进行判断或设置。(如果应用的场合需要使用握手信号等,需要对相应的信号线的状态进行监测或设置。)
三.16位串口应用程序的简单回顾
16位串口应用程序中,使用的16位的Windows API通信函数:
① OpenComm() 打开串口资源,并指定输入、输出缓冲区的大小(以字节计);
CloseComm() 关闭串口;
例:int idComDev;
idComDev = OpenComm("COM1", 1024, 128);
CloseComm(idComDev);
② BuildCommDCB() 、setCommState()填写设备控制块DCB,然后对已打开的串口进行参数配置;
例:DCB dcb;
BuildCommDCB("COM1:2400,n,8,1", dcb);
SetCommState(dcb);
③ ReadComm 、WriteComm()对串口进行读写操作,即数据的接收和发送.
例:char *m_pRecieve; int count;
ReadComm(idComDev,m_pRecieve,count);
Char wr[30]; int count2;
WriteComm(idComDev,wr,count2);
16位下的串口通信程序最大的特点就在于:串口等外部设备的操作有自己特有的API函数;而32位程序则把串口操作(以及并口等)和文件操作统一起来了,使用类似的操作。
四.在MFC下的32位串口应用程序
32位下串口通信程序可以用两种方法实现:利用ActiveX控件;使用API 通信函数。
使用ActiveX控件,程序实现非常简单,结构清晰,缺点是欠灵活;使用API 通信函数的优缺点则基本上相反。
以下介绍的都是在单文档(SDI)应用程序中加入串口通信能力的程序。
一 使用ActiveX控件:
VC++ 6.0提供的MSComm控件通过串行端口发送和接收数据,为应用程序提供串行通信功能。使用非常方便,但可惜的是,很少有介绍MSComm控件的资料。
⑴.在当前的Workspace中插入MSComm控件。
Project菜单------Add to Project----Components and Controls-----Registered
ActiveX Controls---选择Components: Microsoft Communications Control,
version 6.0 插入到当前的Workspace中。
结果添加了类CMSComm(及相应文件:mscomm.h和mscomm.cpp )。
⑵.在MainFrm.h中加入MSComm控件。
protected:
CMSComm m_ComPort;
在Mainfrm.cpp::OnCreare()中:
DWORD style=WS_VISIBLE|WS_CHILD;
if (!m_ComPort.Create(NULL,style,CRect(0,0,0,0),this,ID_COMMCTRL)){
TRACE0("Failed to create OLE Communications Control ");
return -1; // fail to create
}
⑶.初始化串口
m_ComPort.SetCommPort(1); //选择COM?
m_ComPort. SetInBufferSize(1024); //设置输入缓冲区的大小,Bytes
m_ComPort. SetOutBufferSize(512); //设置输入缓冲区的大小,Bytes//
if(!m_ComPort.GetPortOpen()) //打开串口
m_ComPort.SetPortOpen(TRUE);
m_ComPort.SetInputMode(1); //设置输入方式为二进制方式
m_ComPort.SetSettings("9600,n,8,1"); //设置波特率等参数
m_ComPort.SetRThreshold(1); //为1表示有一个字符引发一个事件
m_ComPort.SetInputLen(0);
⑷.捕捉串口事项。MSComm控件可以采用轮询或事件驱动的方法从端口获取数据。我们介绍比较使用的事件驱动方法:有事件(如接收到数据)时通知程序。在程序中需要捕获并处理这些通讯事件。
在MainFrm.h中:
protected:
afx_msg void OnCommMscomm();
DECLARE_EVENTSINK_MAP()
在MainFrm.cpp中:
BEGIN_EVENTSINK_MAP(CMainFrame,CFrameWnd )
ON_EVENT(CMainFrame,ID_COMMCTRL,1,OnCommMscomm,VTS_NONE)
//映射ActiveX控件事件
END_EVENTSINK_MAP()
⑸.串口读写. 完成读写的函数的确很简单,GetInput()和SetOutput()就可。两个函数的原型是:
VARIANT GetInput();及 void SetOutput(const VARIANT newValue);都要使用VARIANT类型(所有Idispatch::Invoke的参数和返回值在内部都是作为VARIANT对象处理的)。
无论是在PC机读取上传数据时还是在PC机发送下行命令时,我们都习惯于使用字符串的形式(也可以说是数组形式)。查阅VARIANT文档知道,可以用BSTR表示字符串,但遗憾的是所有的BSTR都是包含宽字符,即使我们没有定义_UNICODE_UNICODE也是这样! WinNT支持宽字符, 而Win95并不支持。为解决上述问题,我们在实际工作中使用CbyteArray,给出相应的部分程序如下:
void CMainFrame::OnCommMscomm(){
VARIANT vResponse; int k;
if(m_commCtrl.GetCommEvent()==2) {
k=m_commCtrl.GetInBufferCount(); //接收到的字符数目
if(k0) {
vResponse=m_commCtrl.GetInput(); //read
SaveData(k,(unsigned char*) vResponse.parray-pvData);
} // 接收到字符,MSComm控件发送事件 }
。。。。。 // 处理其他MSComm控件
}
void CMainFrame::OnCommSend() {
。。。。。。。。 // 准备需要发送的命令,放在TxData[]中
CByteArray array;
array.RemoveAll();
array.SetSize(Count);
for(i=0;i
array.SetAt(i, TxData[i]);
m_ComPort.SetOutput(COleVariant(array)); // 发送数据
}
请大家认真关注第⑷、⑸中内容,在实际工作中是重点、难点所在。
二 使用32位的API 通信函数:
可能很多朋友会觉得奇怪:用32位API函数编写串口通信程序,不就是把16位的API换成32位吗?16位的串口通信程序可是多年之前就有很多人研讨过了……
此文主要想介绍一下在API串口通信中如何结合非阻塞通信、多线程等手段,编写出高质量的通信程序。特别是在CPU处理任务比较繁重、与外围设备中有大量的通信数据时,更有实际意义。
⑴.在中MainFrm.cpp定义全局变量
HANDLE hCom; // 准备打开的串口的句柄
HANDLE hCommWatchThread ;//辅助线程的全局函数
⑵.打开串口,设置串口
hCom =CreateFile( "COM2", GENERIC_READ | GENERIC_WRITE, // 允许读写
0, // 此项必须为0
NULL, // no security attrs
OPEN_EXISTING, //设置产生方式
FILE_FLAG_OVERLAPPED, // 我们准备使用异步通信
NULL );
请大家注意,我们使用了FILE_FLAG_OVERLAPPED结构。这正是使用API实现非阻塞通信的关键所在。
ASSERT(hCom!=INVALID_HANDLE_VALUE); //检测打开串口操作是否成功
SetCommMask(hCom, EV_RXCHAR|EV_TXEMPTY );//设置事件驱动的类型
SetupComm( hCom, 1024,512) ; //设置输入、输出缓冲区的大小
PurgeComm( hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR
| PURGE_RXCLEAR ); //清干净输入、输出缓冲区
COMMTIMEOUTS CommTimeOuts ; //定义超时结构,并填写该结构
…………
SetCommTimeouts( hCom, CommTimeOuts ) ;//设置读写操作所允许的超时
DCB dcb ; // 定义数据控制块结构
GetCommState(hCom, dcb ) ; //读串口原来的参数设置
dcb.BaudRate =9600; dcb.ByteSize =8; dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT ;dcb.fBinary = TRUE ;dcb.fParity = FALSE;
SetCommState(hCom, dcb ) ; //串口参数配置
上述的COMMTIMEOUTS结构和DCB都很重要,实际工作中需要仔细选择参数。
⑶启动一个辅助线程,用于串口事件的处理。
Windows提供了两种线程,辅助线程和用户界面线程。区别在于:辅助线程没有窗口,所以它没有自己的消息循环。但是辅助线程很容易编程,通常也很有用。
在次,我们使用辅助线程。主要用它来监视串口状态,看有无数据到达、通信有无错误;而主线程则可专心进行数据处理、提供友好的用户界面等重要的工作。
hCommWatchThread=
CreateThread( (LPSECURITY_ATTRIBUTES) NULL, //安全属性
0,//初始化线程栈的大小,缺省为与主线程大小相同
(LPTHREAD_START_ROUTINE)CommWatchProc, //线程的全局函数
GetSafeHwnd(), //此处传入了主框架的句柄
0, dwThreadID );
ASSERT(hCommWatchThread!=NULL);
⑷为辅助线程写一个全局函数,主要完成数据接收的工作。请注意OVERLAPPED结构的使用,以及怎样实现了非阻塞通信。
UINT CommWatchProc(HWND hSendWnd){
DWORD dwEvtMask=0 ;
SetCommMask( hCom, EV_RXCHAR|EV_TXEMPTY );//有哪些串口事件需要监视?
WaitCommEvent( hCom, dwEvtMask, os );// 等待串口通信事件的发生
检测返回的dwEvtMask,知道发生了什么串口事件:
if ((dwEvtMask EV_RXCHAR) == EV_RXCHAR){ // 缓冲区中有数据到达
COMSTAT ComStat ; DWORD dwLength;
ClearCommError(hCom, dwErrorFlags, ComStat ) ;
dwLength = ComStat.cbInQue ; //输入缓冲区有多少数据?
if (dwLength 0) {
BOOL fReadStat ;
fReadStat = ReadFile( hCom, lpBuffer,dwLength, dwBytesRead;
READ_OS( npTTYInfo ) ); //读数据
注:我们在CreareFile()时使用了FILE_FLAG_OVERLAPPED,现在ReadFile()也必须使用
LPOVERLAPPED结构.否则,函数会不正确地报告读操作已完成了.
使用LPOVERLAPPED结构, ReadFile()立即返回,不必等待读操作完成,实现非阻塞
通信.此时, ReadFile()返回FALSE, GetLastError()返回ERROR_IO_PENDING.
if (!fReadStat){
if (GetLastError() == ERROR_IO_PENDING){
while(!GetOverlappedResult(hCom,
READ_OS( npTTYInfo ), dwBytesRead, TRUE )){
dwError = GetLastError();
if(dwError == ERROR_IO_INCOMPLETE) continue;
//缓冲区数据没有读完,继续
…… ……
::PostMessage((HWND)hSendWnd,WM_NOTIFYPROCESS,0,0);//通知主线程,串口收到数据 }
所谓的非阻塞通信,也即异步通信。是指在进行需要花费大量时间的数据读写操作(不仅仅是指串行通信操作)时,一旦调用ReadFile()、WriteFile(), 就能立即返回,而让实际的读写操作在后台运行;相反,如使用阻塞通信,则必须在读或写操作全部完成后才能返回。由于操作可能需要任意长的时间才能完成,于是问题就出现了。
非常阻塞操作还允许读、写操作能同时进行(即重叠操作?),在实际工作中非常有用。
要使用非阻塞通信,首先在CreateFile()时必须使用FILE_FLAG_OVERLAPPED;然后在 ReadFile()时lpOverlapped参数一定不能为NULL,接着检查函数调用的返回值,调用GetLastError(),看是否返回ERROR_IO_PENDING。如是,最后调用GetOverlappedResult()返回重叠操作(overlapped operation)的结果;WriteFile()的使用类似。
⑸.在主线程中发送下行命令。
BOOL fWriteStat ; char szBuffer[count];
…………//准备好发送的数据,放在szBuffer[]中
fWriteStat = WriteFile(hCom, szBuffer, dwBytesToWrite,
dwBytesWritten, WRITE_OS( npTTYInfo ) ); //写数据
注:我们在CreareFile()时使用了FILE_FLAG_OVERLAPPED,现在WriteFile()也必须使用 LPOVERLAPPED结构.否则,函数会不正确地报告写操作已完成了.
使用LPOVERLAPPED结构,WriteFile()立即返回,不必等待写操作完成,实现非阻塞 通信.此时, WriteFile()返回FALSE, GetLastError()返回ERROR_IO_PENDING.
int err=GetLastError();
if (!fWriteStat) {
if(GetLastError() == ERROR_IO_PENDING){
while(!GetOverlappedResult(hCom, WRITE_OS( npTTYInfo ),
dwBytesWritten, TRUE )) {
dwError = GetLastError();
if(dwError == ERROR_IO_INCOMPLETE){
// normal result if not finished
dwBytesSent += dwBytesWritten; continue; }
......................
综上,我们使用了多线程技术,在辅助线程中监视串口,有数据到达时依靠事件驱动,读入数据并向主线程报告(发送数据在主线程中,相对说来,下行命令的数据总是少得多);并且,WaitCommEvent()、ReadFile()、WriteFile()都使用了非阻塞通信技术,依靠重叠(overlapped)读写操作,让串口读写操作在后台运行。
依托vc6.0丰富的功能,结合我们提及的技术,写出有强大控制能力的串口通信应用程序。就个人而言,我更偏爱API技术,因为控制手段要灵活的多,功能也要强大得多。
windows串口是什么的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于windows如何打开串口、windows串口是什么的信息别忘了在本站进行查找喔。