您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > 串口编程学习笔记-从入门到精通
串口编程串口编程串口编程串口编程学习笔记学习笔记学习笔记学习笔记作者:林国树1.串口定义串口定义串口定义串口定义串口即串行通信接口,它是PC与通信工业应用比较广泛的一种接口,主要是RS-232。它被定义为一种在低速率串行通信中增加通信距离的单端标准。RS-232采用不平衡传输方式。一个完整的RS-232接口有22根线,采用标准25芯插座头(DB-25)。除此,目前广泛使用一种9芯的RS-232接口(DB-9),如图1所示。其各个引脚及其信号如表1,表2。图1RS-232接头形式表1RS-232DB-25引脚定义引脚号缩写符信号方向说明1PE公共端连接器外壳2TXD输出发送数据3RXD输入接收数据4RTS输出请示发送5CTS输入清除发送6DSR输入数据设备准备好7SG公共端信号地8DCD输入载波检测9——保留10——保留11STF输出选择传送通道12DCD输入载波检测13CTS输入清除发送14TXD输出发送数据15TCK输入发送时钟16RXD输入接收数据17RCK输入接收器定时18LL输出本地回路控制19RTS输出请示发送20DTR输出数据终端准备好21RL输出远程回路控制22RI输入振铃指示器23DSR输入数据装置准备好24XCK输出发送器定时25TI输入测试指示器表2RS-232DB-9引脚定义引脚号缩写符信号方向说明1DCD输入载波检测2RXD输入接收数据3TXD输出发送数据4DTR输出数据终端准备好5GND公共端信号地6DSR输入数据装置准备好7RTS输出请示发送8CTS输入清除发送9RI输入振铃指示在RS-232标准中规定的设备可以分为数据终端设备(DTE)和数据通信设备(DCE)两类,这种分类定义了不同的线路用来发送和接收信号。一般来说,计算机和终端设备有DTE连接器,调制解调器和打印机有DCE连接器。RS-232标准中指定了20个不同的信号连接,由25个D-sub(微型D类)引脚构成的DB-25连接器。但很多设备只用其中的一小部分引脚,出于节省资金和空间的考虑不少机器采用较少的连接器,特别是9引脚的D-sub或者DB-9型连接器被广泛使用。因为RS-232到目前为止经历很多不同版本,最近版本为E,它相对于广泛使用的C版本来说,电气性能改进了不少,也对连接器中的25个引脚进行了充分利用(只有2个予以保留)。在RS-232C版本中,DB-25的25个引脚(4个数据引脚、11个控制信号引脚、3个定时引脚、7个备用和未定义引脚)。实际上只用到表1中的9个,分别是:1、2、3、4、5、6、8、20、22脚,它们的作用如下:(1)控制信号线(4、5、6、8、20、22等6个引脚)数据装置准备好(DataSetReady,DSR):有效(ON)状态表明接口处于可以使用状态;数据终端准备好(DataTerminalReady,DTR):有效时(ON)状态,表明数据终端可以使用;这两个信号有时连到电源上,一上电就立即有效。但这两个设备状态信号有效,只表示设备本身可用,并不说明通信链路可以开始进行通信了,能否开始进行通信要由下面的控制信号决定。请求发送(RequestToSend,RTS):用来表示DTE请求DCE发送数据,即当终端要发送数据时,使该信号有效(ON),向DTE设备请求发送;允许发送(ClearToSend,CTS):用来表示DCE准备好接受DTE发来的数据,是对发送信号RTS的响应信号。当MODEM之类设备已准备好接收终端传来的数据并向前发送时,使该信号有效,通知终端开始沿发送数据线TxD发送数据。这对RTS/CTS请求应答联络信号是用于半双工MODEM系统中发送方式和接收方式之间的切换。在全双工系统中作发送方式和接收方式之间的切换。在全双工系统中,因配置双向通道,故不需要RTS/CTS联络信号使其变高;数据载波检出(DataνCarrierDectection,DCD):也叫“接收线信号检出”(ReceivedLineDectection,RLSD),用来表示DCE已接通通信链路,告知DTE准备接收数据。当本地的MODEM收到由通信链路另一端(远地)的MODEM送来的载波信号时,使RLSD信号有效,通知终端准备接收,并且由MODEM将接收下来的载波信号解调成数字数据后,沿接收数据线RxD送到终端;振铃指示(Ringing,RI):当MODEM收到交换台送来的振铃呼叫信号时,使该信号有效(ON状态),通知终端,已被呼叫;(2)数据发送和接收线(2、3引脚)发送数据(TransmittedνData,TxD):通过TxD终端将串行数据发送到MODEM,(DTE→DCE);接收数据(ReceivedνData,RxD):通过RxD线终端接收从MODEM发来的串行数据,(DCE→DTE)(3)地线SG(7脚)、PE(1脚)分别用来接信号地和保护地信号线,无方向上述控制信号线何时有效,何时无效的顺序表示了接口信号的传送过程。例如,只有当DSR和DTR都处于有效(ON)状态时,才能在DTE和DCE间传送操作。若DTE要发送数据,则预先将DTR线置成有效(ON)状态,等CTS线上收到有效(ON)状态的回答后,才能在TxD线上发送串行数据。这种顺序的规定对半双工的通信线路特别有用,因为只有半双工的通信能确定DCE已由接收方向改为发送方向,这时线路才能开始发送。使用DB-9连接器,作为提供多功能I/O卡或主板上COM1和COM2两个串行接口的连接器,它只提供异步通信的9个信号。DB-25型连接器的引脚分配与DB-25型引脚信号完全不同。因此,若与配接DB-25型连接器的DCE设备连接,必须使用专门的电缆线。在连接距离上,如果通信速率低于20kbit/s时,RS-232所直接连接的最大物理距离为15m。2.Windows下串口编程方式下串口编程方式下串口编程方式下串口编程方式在windows操作系统下,串口通信的编程可以在wince、win32或者dotnet下实现。2.1win32方式方式方式方式(SerialCommunicationsinWin32)简介简介简介简介串口通信的主要步骤为:打开串口,设置串口参数,读/写串口,关闭串口等四步。串口编程主要是win32API的应用,在windows操作系统中,把串口看作是一种文件,对串口的操作也是对一种文件的操作,只不过这种文件需要作一些特殊的设置,以及有特定的操作步骤,以下介绍其具体的过程和用到的API。打开串口打开串口打开串口打开串口用CreateFileCreateFileCreateFileCreateFile函数打开通信串口。打开串口有俩种方式:重叠和非重叠。下面的代码演示了以重叠方式打开串口:HANDLEhComm;hComm=CreateFile(gszPort,GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);if(hComm==INVALID_HANDLE_VALUE)//串口没有打开,中止操作取消标识FILE_FLAG_OVERLAPPED,即用NULL方式调用CreateFileCreateFileCreateFileCreateFile就指定非重叠方式。重叠与非重叠方式在下一节介绍。SDK文档中对串口通信的CreateFileCreateFileCreateFileCreateFile调用有以下特殊要求:•fdwShareMode必须为0。通信串口不能共享,只能独占。•fdwCreate必须指定为OPEN_EXISTING。•hTemplateFile必须为NULL。注意:串口的名字为COM1,COM2,COM3,或者COM4。但Win32API并不提供检测串口存在的机制。用户可以自由指定要使用的串口名字,如果串口不存在,打开串口的操作时,系统会返回一个错误标识(ERROR_FILE_NOT_FOUND)。读读读读/写串口写串口写串口写串口Win32的读/写串口操作与文件操作的输入/输(I/O)出类似,实际上它们使用的是同样的函数。Win32的串口I/O操作有两种方式:重叠或者非重叠。即文件操作里的同步和异步,在本笔记里,我们用重叠和非重叠。多数开发人员都熟悉非重叠方式I/O,即一个操作完成以后函数才返回。而重叠方式I/O调用函数会立即返回,不管操作有没有完成。但是操作完成后操作系统会有信号发送给调用者。用这种方式程序可以在I/O要求后和完成之前这段时间干别的工作。读/写串口操作包括很多功能和选择,以下详细介绍:非重叠非重叠非重叠非重叠I/O非重叠I/O有些限制,但很直观。当一个操作发生时,线程会阻塞,直到这个操作函数返回,该线程才会继续工作。这种I/O方式适合于多线程,因为一个线程在I/O操作阻塞后,其他类型的线程还可以继续工作。应用程序的责任是安排好串口的访问顺序,避免一个线程阻塞了,其他的线程在等待这个线程函数返回结果也被阻塞。例如,一个线程读操作(ReadFileReadFileReadFileReadFile)没有完成,那么其他线程的写操作(WriteFileWriteFileWriteFileWriteFile)就会被阻塞。选择非重叠方式的主要原因是可移植性,因为多数系统不支持重叠方式,但多数系统都支持多线程,所以多线程非重叠I/O是可移植性的最好选择。重叠重叠重叠重叠I/O重叠I/O不如非重叠I/O那样直观,但更灵活和有效。用重叠方式打开一个串口允许多线程多个线程同时操作,而且重叠操作还允许同一个线程对一个串口同时执行多种不同的操作。重叠I/O的优点在于线程可以在I/O操作的申请和结束之间这段时间最别的工作。重叠I/O操作有俩个部分:请求开始和完成检测,请求开始设置OVERLAPPEDOVERLAPPEDOVERLAPPEDOVERLAPPED结构,设置同步重置事件,然后调用读/写操作。I/O操作可能不能立即完成。如果立即完成,应用程序可以准备正常继续处理,否则重叠I/O提供检测机制,检测方法包括等待事件句柄,然后获取数据。有许多错误标识标明错误结果,如创建失败,超时或者等待别的事件完成信号。读操作读操作读操作读操作读操作使用ReadFileReadFileReadFileReadFile函数。以下代码给出读串口的一个例子,代码中定义fWaitingOnRead标志用于在重叠操作中,如果一个操作正在进行,阻止其他新的操作。DWORDdwRead;BOOLfWaitingOnRead=FALSE;OVERLAPPEDosReader={0};//创建重叠事件,退出程序前必须关闭其句柄,防止内存泄露osReader.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);if(osReader.hEvent==NULL)//错误创建重叠事件,程序终止。if(!fWaitingOnRead){//开始读操作if(!ReadFile(hComm,lpBuf,READ_BUF_SIZE,&dwRead,&osReader)){if(GetLastError()!=ERROR_IO_PENDING)//立即读?//通信错误,报告elsefWaitingOnRead=TRUE;}else{//读立即完成HandleASuccessfulRead(lpBuf,dwRead);}}重叠操作的第二部分是检测是否完成。事件句柄在信号标识时通过WaitForSingleObjectWaitForSingleObjectWaitForSingleObjectWaitForSingleObject函数返回给OVERLAPPEDOVERLAPPEDOVERLAPPEDOVERLAPPED结构。一旦事件被标识,操作就完成。但这并不表明操作成功,它只是表明操作完成。GetOverlappedResultGetOverlappedResultGetOverlappedResultGetOverlappedResult函数报告操作结果
本文标题:串口编程学习笔记-从入门到精通
链接地址:https://www.777doc.com/doc-5257427 .html