博文

[原]VC串口API超时的详细介绍(2009-01-04 11:23:00)

摘要: _BAT_姜维    发表于2009年01月04日 11:09 阅读(0) 评论(0) 分类: 串口API 权限: 公开 昨天调了一下API结果发现同步ReadFile居然没堵塞就返回,那同步和异步岂不是一个样了,太阳!

线程没错,都没错,所以又拿资料出来看,发现有个超时设置,应该就是他了,嘿嘿。
我原本程序:
COMMTIMEOUTS TimeOuts;
//设定读超时
TimeOuts.ReadIntervalTimeout=MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier=0;
TimeOuts.ReadTotalTimeoutConstant=0;
//在读一次输入缓冲区的内容后读操作就立即返回,
//而不管是否读入了要求的字符。

//设定写超时
TimeOuts.WriteTotalTimeoutMultiplier=100;
TimeOuts.WriteTotalTimeoutConstant=500;
SetCommTimeouts(hCom,&TimeOuts); //设置超时


我留意了一下,它所说的超时是指串口读写操作超时
而总超时就是函数返回的标准,如果操作在总超时之前没完成,那么就结束了本次操作,如果在总超时之前完成了,那马上返回,官方资料:

COMMTIMEOUTS结构的成员都以毫秒为单位。总超时的计算公式是:
总超时=时间系数×要求读/写的字符数+时间常量
例如,要读入10个字符,那么读操作的总超时的计算公式为:
读总超时=ReadTotalTimeoutMultiplier×10+ReadTotalTimeoutConstant


要注意到无论读或者写,都有个要求的数目和实际读到的数目引用
ReadFile(hCom,str,wCount,&wCount,NULL);
wCount要求读入的数目,&wCount读到的数目引用
总超时=WriteTotalTimeoutMultiplier×wCount+ReadTotalTimeout......

阅读全文(8428) | 评论:0

转RS485通讯协议(2008-08-12 07:48:00)

摘要:首先要知道什么是RS232和RS485. 典型的串行通讯标准是RS232和RS485.它们定义了电压,阻抗等.但不对软件协议给予定义区别于RS232, RS485的特性包括: 1. RS-485的电气特性:逻辑“1”以两线间的电压差为+(2—6) V表示;逻辑“0”以两线间的电压差为-(2—6)V表示。接口信号电平比RS -232-C降低了,就不易损坏接口电路的芯片,且该电平与TTL电平兼容,可方便与TTL 电路连接。 2. RS-485的数据最高传输速率为10Mbps 3. RS-485接口是采用平衡驱动器和差分接收器的组合,抗共模干能力增强,即抗噪声干扰性好。 4. RS-485接口的最大传输距离标准值为4000英尺,实际上可达 3000米,另外RS-232-C接口在总线上只允许连接1个收发器,即单站能力。而 RS-485接口在总线上是允许连接多达128个收发器。即具有多站能力,这样用户可以利用单一的RS-485接口方便地建立起设备网络。因RS-485接口具有良好的抗噪声干扰性,长的传输距离和多站能力等上述优点就使其成为首选的串行接口。因为RS485接口组成的半双工网络,一般只需二根连线,所以RS485接口均采用屏蔽双绞线传输。 RS485接口连接器采用DB-9的9芯插头座,与智能终端RS485接口采用DB-9(孔) ,与键盘连接的键盘接口RS485采用DB-9(针)。 RS485编程串口协议只是定义了传输的电压,阻抗等,编程方式和普通的串口编程一样!! RS-232与RS-422之间转换原理和接法 通常我们对于视频服务器、录像机、切换台等直接播出、切换控制主要使用串口进行,主要使用到RS-232、RS-422与RS-485三种接口控制。下面就串口的接口标准以及使用和外部插件和电缆进行探讨。 RS -232、RS-422与RS-485标准只对接口的电气特性做出规定,而不涉及接插件、电缆或协议,在此基础上用户可以建立自己的高层通信协议。例如:视频服务器都带有多个RS422串行通讯接口,每个接口均可通过RS422通讯线由外部计算机控制实现记录与播放。视频服务器除提供各种控制硬件接口外,还提供协议接口,如RS422接口除支持RS422的Profile协议外,还支持 Louth、Odetics 、BVW等通过RS422控制的协议。 RS-232、RS-422与RS-48......

阅读全文(9038) | 评论:4

转基于RS485总线的串口令牌环通信的研究(2008-08-11 23:33:00)

摘要:摘要:针对串口RS232和RS485总线在工业实时控制检测系统中的广泛应用,本文介绍并分析了串口通信网络的典型拓扑结构及其特点和具体使用问题。根据串口通信在实时控制监测系统中的特点,借鉴令牌总线思想和TCP/IP协议的控制方法,研究设计了一种适用于中小型分布式实时控制检测系统的串口令牌环网络通信协议,阐述了该协议的完整工作过程。最后,总结分析了该协议的应用范围和应用扩展性问题。 关键词:RS485总线;令牌总线;串口环;数据采集 1        引言 在数据通信、计算机网络以及工业上的分布式控制检测系统中,经常采用串行通信来完成信息交换。这类系统要求用最少的信号线来完成通信任务,由于RS485具有性能优异、组网简单的优点,在集中控制系统、分布式控制系统中的应用相当广泛,特别是在要求远距离传输的应用中[1]。RS485总线通信需要一对信号线,最远的传输距离大约为1200米,如果加上中继器则通信传输距离还可以延长。由于RS485总线与RS232串口的电平信号不一致,计算机的RS232串口必须通过RS232/RS485转换接口芯片与RS485总线连接在一起。 典型的控制检测系统中通常有上位机和下位机,下位机常常由单片机或嵌入式芯片为核心的数据采集电路模块构成,而PC机通常当成上位机使用,它们之间通过RS232/RS485通信来完成数据通信传输和数据分析处理显示等应用。这种上位机和多台下位机构成的控制检测网络中,下位机采集到的数据最终传输到上位机,因此采集数据的有效控制和传输成为非常重要的问题。本文针对RS232/RS485串口通信构成的网络结构和通信方式进行了分析,并结合桥梁检测应用实例设计了一种基于RS485总线的串口令牌环网络通信协议。 2        串口通信网络拓扑结构 常用的拓扑结构有总线型和环型结构。这两种拓扑结构的一个共同特点是节点共用通信介质及使用广播式通信方式。[2] 2.1   总线型拓扑结构 总线型结构由RS485总线连接而成,其结构如图1所示,下位机由单片机或嵌入式芯片构成的多个分布式排列的智能测控设备组成,这些设备包括串口接口电路,所有的TXD端连接在RS485总线的同......

阅读全文(3983) | 评论:2

[接口总线]基于RS485总线的PC机与多单片机系统的串行通信(转)(2008-08-11 23:21:00)

摘要:基于RS485总线的PC机与多单片机系统的串行通信
林 颖,罗金炎,刘 骄,陈 忠,李伟光
(华南理工大学,广东广州510640)
SerialCommunicationBasedonRS485BusbetweenPCandMultisinglechipSystem
LINYing,LUOJinyan,LIUJiao,CHENZhong,LIWeiguang
(SouthChinaUniversityofTechnology,Guangzhou510640,China)
摘要:根据所开发的电子产品故障维修实验系统的要求,提出了一套基于RS485总线的PC机与多单片机系统间的串行通信协议,已成功应用于故障维修实验系统中"
关键词:RS485总线;多单片机;串行通信
中图分类号:TP336
文献标识码:A
文章编号:10012257(2006)01003304
收稿日期:20050902
基金项目:广东省科技攻关项目(2003C102017)
Abstract:Accordingtothefunctionalrequestofafaultmaintenanceexperimentsystemforelec2
tronicalproducts,putsforwardacommunicationprotocolwhichisdesignedforserialcommunica2
tionbasedonRS485busbetweenPCandmultisinglechipsystem.Thisprotocolhasbeenimple2
mentedintheaboveexperimentsystem.
Keywords:RS485bus;multisinglechip;serial communication
0 引言
笔者参与合作开发了一个电子产品故障维修实验系统"利用该实验系统,可以避免传统维修训练中必须进行实物拆装的缺陷"在这个实验系统应用过程中,首先,上位机可根据教学需要生成各种难度级别的实验题目并发送给进行实验的下位机,下位机通过LCD显示接收到的实验题目,并同步接收上位机根据实验题目生成的相应的嵌入式控制器的控制参数"然后,下位机根据接收到的控制参......

阅读全文(5847) | 评论:0

Win32串口编程 ++++(2007-08-16 15:39:00)

摘要:在Win32下,可以使用两种编程方式实现串口通信,其一是使用ActiveX控件,这种方法程序简单,但欠灵活。其二是调用Windows的API函数,这种方法可以清楚地掌握串口通信的机制,并且自由灵活。本文我们只介绍API串口通信部分。
  串口的操作可以有两种操作方式:同步操作方式和重叠操作方式(又称为异步操作方式)。同步操作时,API函数会阻塞直到操作完成以后才能返回(在多线程方式中,虽然不会阻塞主线程,但是仍然会阻塞监听线程);而重叠操作方式,API函数会立即返回,操作在后台进行,避免线程的阻塞。

无论那种操作方式,一般都通过四个步骤来完成:
(1) 打开串口
(2) 配置串口
(3) 读写串口
(4) 关闭串口

(1) 打开串口

Win32系统把文件的概念进行了扩展。无论是文件、通信设备、命名管道、邮件槽、磁盘、还是控制台,都是用API函数CreateFile来打开或创建的。该函数的原型为:

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:属性描述,用于指定该串口是否进行异步操作,该......

阅读全文(2772) | 评论:0

VC++ 的串口通讯(2007-08-16 14:57:00)

摘要:VC++ 的串口通讯 2007-08-09 16:41 From:http://dev.csdn.net/author/Jason009/5a65faa4258b441eab4a9d463b18f7b2.html 在VC++中有两种方法可以进行串口通讯。一种是利用Microsoft公司提供的ActiveX控件 Microsoft Communications Control。另一种是直接用VC++访问串口。下面将简述这两种方法。

  一、Microsoft Communications Control

  Microsoft公司在WINDOWS中提供了一个串口通讯控件,用它,我们可以很简单的利用串口进行通讯。在使用它之前,应将控件加在应用程序的对话框上。然后再用ClassWizard 生成相应的对象。现在我们可以使用它了。

  该控件有很多自己的属性,你可以通过它的属性窗口来设置,也可以用程序设置。我推荐用程序设置,这样更灵活。

   SetCommPort:指定使用的串口。

   GetCommPort:得到当前使用的串口。

   SetSettings:指定串口的参数。一般设为默认参数"9600,N,8,1"。这样方便与其他串口进行通讯。

   GetSettings:取得串口参数。

   SetPortOpen:打开或关闭串口,当一个程序打开串口时,另外的程序将无法使用该串口。

   GetPortOpen:取得串口状态。

   GetInBufferCount:输入缓冲区中接受到的字符数。

   SetInPutLen:一次读取输入缓冲区的字符数。设置为0时,程序将读取缓冲区的全部字符。

   GetInPut:读取输入缓冲区。

   GetOutBufferCount:输出缓冲区中待发送的字符数。

   SetOutPut:写入输出缓冲区。

  一般而言,使用上述函数和属性就可以进行串口通讯了。以下是一个范例。

#define MESSAGELENGTH 100

class C......

阅读全文(2998) | 评论:0

VC实现串口通信例程(2007-08-16 14:15:00)

摘要:WIN95界面下的VC++串口通讯程序在WIN32下是不建议对端口进行操作的,在WIN32中所有的设备都被看成是文件,串行口也不例外也是作为文件来进行处理的。这是我的一份关于串口编程的读书笔记,对于使 用VC进行编程的同行应该有一定的帮助。  1.打开串口:     在Window 95下串行口作为文件处理,使用文件操作对串行口进行处理。使用CreateFile()打开串口,CreateFile()将返回串口的句柄。 
   HANDLE CreateFile( 
   LPCTSTR lpFileName, // pointer to name of the file 
   DWORD dwDesiredAccess, // access (read-write) mode 
   DWORD dwShareMode, // share mode 
   LPSECURITY_ATTRIBUTES lpSecurityAttributes, // pointer to security attributes 
   DWORD dwCreationDistribution, // how to create 
   DWORD dwFlagsAndAttributes, // file attributes 
   HANDLE hTemplateFile // handle to file with attributes to copy 
   ); 
   lpFileName: 指明串口制备,例:COM1,COM2 
   dwDesiredAccess: 指明串口存取方式,例:GENERIC_READ|GENERIC_WRITE 
   dwShareMode: 指明串口共享方式 
   lpSecurityAttributes: 指明串口的安全属性结构,NULL为缺省安全属性 
   dwCreateionDistribution: 必须为OPEN_EXISTIN  ......

阅读全文(4153) | 评论:0

深入浅出VC++串口编程之基于Win32 API(2007-08-16 14:12:00)

摘要:1、API描述

  在WIN32 API中,串口使用文件方式进行访问,其操作的API基本上与文件操作的API一致。

  打开串口

  Win32 中用于打开串口的API 函数为CreateFile,其原型为:

HANDLE CreateFile (
 LPCTSTR lpFileName, //将要打开的串口逻辑名,如COM1 或COM2
 DWORD dwAccess, //指定串口访问的类型,可以是读取、写入或两者并列
 DWORD dwShareMode, //指定共享属性,由于串口不能共享,该参数必须置为0
 LPSECURITY_ATTRIBUTES lpsa, //引用安全性属性结构,缺省值为NULL
 DWORD dwCreate, //创建标志,对串口操作该参数必须置为OPEN EXISTING
 DWORD dwAttrsAndFlags, //属性描述,用于指定该串口是否可进行异步操作,
 //FILE_FLAG_OVERLAPPED:可使用异步的I/O
 HANDLE hTemplateFile //指向模板文件的句柄,对串口而言该参数必须置为NULL
);
  例如,以下程序用于以同步读写方式打开串口COM1:

HANDLE hCom;
DWORD dwError;
hCon = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if (hCom == (HANDLE)0xFFFFFFFF)
{
 dwError = GetLastError();
 MessageBox(dwError);
}
  对于dwAttrsAndFlags参数及FILE_FLAG_OVERLAPPED标志的由来,可解释如下:Windows文件操作分为同步I/O和重叠I/O(Overlapped I/ O)两种方式,在同步I/O方式中,API会阻塞直到操作完成以后才能返回(在多线程方式中,虽然不会阻塞主线程,但是仍然会阻塞监听线程);而在重叠I/......

阅读全文(3876) | 评论:2

CreateFile函数祥解 (2007-08-16 14:05:00)

摘要:CreateFile函数祥解2006-9-18 18:48:00
CreateFile The CreateFile function creates or opens the following objects and returns a handle that can be used to access
the object:
 files
 pipes
 mailslots
 communications resources
 disk devices(Windows NT only)
 consoles
 directories(open only) CreateFile函数创建或打开下列对象,并返回一个可以用来访问这些对象的句柄。
 文件
 pipes
 邮槽
 通信资源
 磁盘驱动器(仅适用于windowsNT)
 控制台
 文件夹(仅用于打开) HANDLE CreateFile(
 LPCTSTR lpFileName,    //指向文件名的指针
 DWORD dwDesiredAccess,    //访问模式(写/读)
 DWORD dwShareMode,    //共享模式
 LPSECURITY_ATTRIBUTES lpSecurityAttributes, //指向安全属性的指针
 DWORD dwCreationDisposition,   //如何创建
 DWORD dwFlagsAndAttributes,   //文件属性
 HANDLE hTemplateFile    //用于复制文件句柄
); Parametes
参数列表 lpFi......

阅读全文(19330) | 评论:0

借助VC++实现串口通讯程序中的多线程应用(2007-08-16 13:45:00)

摘要: 厦门湖滨北路123号广电中心管理处 卓开炜     1、概述 在广电网络数字化双向改造中,为了实现广电网络对多媒体数字业务的支持,在广电网络主干网和支干网上建设了大量的无人值守的支持数字业务的中心机房,随着现在数据业务的开展,业务平台的安全以及广  播电视的安全播出的迫切需要,必须建立相应的对这些无人值守机房进行远程实时监控和通讯的管理系统。在这些远程实时监控和通讯的管理系统中,信息实时性是最主要的技术要求之一,所以在远程实时监控和通讯管理系统的程序设计中满足实时性要求是软件设计的根本出发点之一。WINDOWS系统是抢先式的多任务操作系统,程序对CPU的占用时间由系统决定。多任务就是指操作系统可以同时运行多个进程,每个进程又可以同时执行多个线程。进程是应用程序的运行实例,要求拥有自己的地址空间,每个进程拥有一个主线程,同时可以建立其他的线程。线程是操作系统分配CPU 时间的基本实体,每个线程占用的CPU时间由系统分配,系统不停的在各个线程之间切换。进程中的线程共享进程的虚拟地址空间,可以访问进程的资源,处于并行执行状态,所以在串行通讯程序中应用多线程就可以简化应用程序的结构,把一些复杂的运算放在后台并行执行,从而大大提高应用程序的响应实时能力。 2、VC++对多线程的支持 在VC++编程中通常使用MFC程序进行开发,这样可以减少程序代码的书写。在VC++6.0版本中的MFC应用程序的线程是由CwinThread对象表来表示的,该线程分为两种:用户界面线程(GUI-Thread)和工作者线程(Worker-Thread)。用户界面线程能够提供界面和用户交互,用于处理用户输入和响应各种信息和事件;工作者线程主要用来处理应用程序的后台任务。应用程序可以通过调用AfxBejinThread()函数自动创建一个CwinThread对象,从而开始一个线程。线程的终止条件有如下4种:线程函数返回;线程调用ExitThtead()退出;异常情况下用现成的句柄调用TerminateThread()退出;线程所属的进程被终止。 3、多线程在RS-322串口通信中的应用 3.1 串口通信对线程同步的要求 因为同一进程的所有线程共享进程的虚拟地址空间,而在WINDOWS中线程是汇编级中断,......

阅读全文(5298) | 评论:0