【2017年整理】串口编程学习报告

上传人:爱****1 文档编号:942134 上传时间:2017-05-23 格式:DOC 页数:31 大小:148KB
返回 下载 相关 举报
【2017年整理】串口编程学习报告_第1页
第1页 / 共31页
【2017年整理】串口编程学习报告_第2页
第2页 / 共31页
【2017年整理】串口编程学习报告_第3页
第3页 / 共31页
【2017年整理】串口编程学习报告_第4页
第4页 / 共31页
【2017年整理】串口编程学习报告_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《【2017年整理】串口编程学习报告》由会员分享,可在线阅读,更多相关《【2017年整理】串口编程学习报告(31页珍藏版)》请在金锄头文库上搜索。

1、串口编程学习报告引言:串口是计算机上非常通用设备通信的协议,串行接口可以接收来自 CPU 的并行数据字符转换为连续的串行数据流发送出去,同时可将接收的串行数据流转换为并行数据字符供给 CPU 的器件,在日常生活中应用广泛,因此有必要对串口进行深入学习,首先谈到需要了解的硬件和软件方面的知识,然后可以整体的了解从硬件到软件数据收发的过程.一.硬件部分1、串口通信是一位一位的传输的,但是计算机处理数据是并行数据,所以当数据由计算机送至数据发送器时,首先用移位寄存器把串行数据转换为并行数据才能送入计算机处理。RS232C 是用正负电压表示逻辑状态与 TTL 高低电压表示逻辑状态的规定不一样在这里就需

2、要硬件部分有 ETA 与 TTL 电平转换电路这样才能和计算机和TTL 的器件连接,并且下位机还需要有可编程的串口芯片这样可以通过编程控制我们需要达到的成效.2、串口要遵守串口之间的协议,在物理方面就要求有相同的波特率来控制数据的发送速度,因此需要有波特率发生器. 具体的要多大的波特率可以根据需求通过控制寄存器来控制发生的波特率 3、根据同步/异步方式,有时要要求上位机与下位机时间同步,需要一个授时器授时.4、每个下位机都有它自己的地址,这时当上位机要寻找这个下位机时就需要寻找它的地址,这里要一个地址译码器。5、对于数据流的控件,可以是硬件流控制(RTC/CTS DTR/CTS等)也可以是软件

3、流控制(XON/XOFF),不过现在大多都是用软件控制。6、普遍情况下电脑都有一个 RS232 的串口,所以我们一般都采用 RS232 串口线,通常情况下无论使用的是九针的还是二十五针的只要接通 2,3 针就可以进行简单的收发数据测试 DB-25,DB-9 接口如下图。7、串口都有一定的存贮功能,这些可以由下位机单片机上的RAM,移位寄存器或其它的外部存贮来实现的.二.软件部分WINDOWS API 已经提供给我们通用接口方法程序,只要在适当的时候调用就可以完成自己想要的功能,在写一个串口程序中(打开 /关闭 ,配置,读写)需要如下的 API 提供的方法:1、打开串口:Win32系统把文件的概

4、念进行了扩展,无论是文件、通信设备、命名管道、邮件槽、磁盘、还是控制台,都是用API函数CreateFile来打开或创建的。该函数的原型为: private static extern int CreateFile(string lpFileName, uint dwDesiredAccess, int dwShareMode,int lpSecurityAttributes,int dwCreationDistribution,int dwFlagsAndAttributes,int hTemplateFile);lpFileName:将要打开的串口逻辑名,如“COM1”; dwDesire

5、dAccess:指定串口访问的类型,可以是读取、写入或二者并列;dwShareMode:指定共享属性,由于串口不能共享,该参数必须置为 0;lpSecurityAttributes:引用安全性属性结构,缺省值为 NULL; dwCreationDistribution:创建标志,对串口操作该参数必须置为OPEN_EXISTING;dwFlagsAndAttributes:属性描述,用于指定该串口是否进行异步操作,该值为 FILE_FLAG_OVERLAPPED,表示使用异步的I/O;该值为 0,表示同步 I/O 操作; hTemplateFile:对串口而言该参数必须置为 NULL; 2、关闭

6、串口: 利用 API 函数关闭串口非常简单,只需使用 CreateFile 函数返回的句柄作为参数调用 CloseHandle 即可: BOOL CloseHandle( Int hObject; /handle to object to close );3、配置串口:(1)缓冲区大小设置:打开串口后,可以对 I/O 口的缓冲区的大小进行设置,虽然 Windows 用 I/O 缓冲区来暂存串口输入和输出的数据。如果通信的速率较高,则应该设置较大的缓冲区。调用 SetupComm函数可以设置串行口的输入和输出缓冲区的大小。 BOOL SetupComm( Int hFile, / 通信设备的句柄

7、 Int dwInQueue, / 输入缓冲区的大小(字节数)Int dwOutQueue / 输出缓冲区的大小(字节数) ); (2)超时设置:在用 ReadFile 和 WriteFile 读写串行口时,需要考虑超时问题。超时的作用是在指定的时间内没有读入或发送指定数量的字符,ReadFile 或 WriteFile 的操作仍然会结束。要查询当前的超时设置应调用 GetCommTimeouts 函数,该函数会填充一个COMMTIMEOUTS 结构。调用 SetCommTimeouts 可以用某个COMMTIMEOUTS 结构的内容来设置超时。读写串口的超时有两种情况:间隔超时和总超时。间隔

8、超时是指在接收时两个字符之间的最大时延。总超时是指读写操作总共花费的最大时间。写操作只支持总超时,而读操作两种超时均支持。用 COMMTIMEOUTS 结构可以规定读写操作的超时。 COMMTIMEOUTS 结构的定义为:typedef struct _COMMTIMEOUTS int ReadIntervalTimeout; /读间隔超时 int ReadTotalTimeoutMultiplier; /读时间系数 int ReadTotalTimeoutConstant; /读时间常量 int WriteTotalTimeoutMultiplier; / 写时间系数 int WriteTo

9、talTimeoutConstant; /写时间常量 COMMTIMEOUTS,*LPCOMMTIMEOUTS;COMMTIMEOUTS 结构的成员都以毫秒为单位。总超时的计算公式是: 总超时时间系数要求读/写的字符数时间常量 如果所有写超时参数均为 0,那么就不使用写超时。如果ReadIntervalTimeout 为 0,那么就不使用读间隔超时。如果ReadTotalTimeoutMultiplier 和 ReadTotalTimeoutConstant 都为 0,则不使用读总超时。如果读间隔超时被设置成 MAXDWORD 并且读时间系数和读时间常量都为 0,那么在读一次输入缓冲区的内容后

10、读操作就立即返回,而不管是否读入了要求的字符。(3)对串口的一些属性配置我们会用到DCB, DCB结构包含了诸如波特率、数据位数、奇偶校验和停止位数等信息。在查询或配置串口的属性时,都要用DCB结构来作为缓冲区一般用CreateFile 打开串口后,可以调用GetCommState函数来获取串口的初始配置。要修改串口的配置,应该先修改DCB结构,然后再调用SetCommState函数设置串口: BOOL GetCommState( Int hFile, /标识通讯端口的句柄 RefDCB lpDCB /指向一个设备控制块(DCB 结构)的指针 ); SetCommState 函数设置 COM

11、口的设备控制块:BOOL SetCommState( int hFile, refDCB lpDCB );我们用到的 DCB 部分结构如下:typedef struct _DCB /波特率,指定通信设备的传输速率。这个成员可以是实际波特率值或者下面的常量值之一: Public int BaudRate; Public int fParity; / 指定奇偶校验使能。若此成员为 1,允许奇偶校验检查 BYTE ByteSize; / 通信字节位数, 48 Public byte Parity; /指定奇偶校验方法。此成员可以有下列值: /EVENPARITY 偶校验 NOPARITY 无校验 /

12、MARKPARITY 标记校验 ODDPARITY 奇校验 Public byte StopBits; /指定停止位的位数。此成员可以有下列值:/ONESTOPBIT 1 位停止位 TWOSTOPBITS 2 位停止位 ONE5STOPBITS 1.5 位停止位 DCB; 4、读/写串口:(1)读串口:BOOL ReadFile( Int hFile, /串口的句柄 / 读入的数据存储的地址, / 即读入的数据将存储在以该指针的值为首地址的一片内存区 Byte lpBuffer, int nNumberOfBytesToRead, / 要读入的数据的字节数 / 指向一个 DWORD 数值,该数

13、值返回读操作实际读入的字节数 Ref int lpNumberOfBytesRead, / 重叠操作时,该参数指向一个 OVERLAPPED 结构,同步操作时,该参数为 NULL。 Ref OVERLAPPED lpOverlapped ); OVERLAPPED 的结构如下(该结构最重要的成员是hEvent。hEvent 是读写事件。当串口使用异步通讯时,函数返回时操作可能还没有完成,程序可以通过检查该事件得知是否读写完毕。):typedef struct _OVERLAPPED public int Internal; public int InternalHigh; public int

14、 Offset; public int OffsetHigh; public int hEvent; OVERLAPPED;(2)写串口:BOOL WriteFile( int hFile, /串口的句柄 / 写入的数据存储的地址, / 即以该指针的值为首地址的 nNumberOfBytesToWrite / 个字节的数据将要写入串口的发送数据缓冲区。 Byte lpBuffer, int nNumberOfBytesToWrite, /要写入的数据的字节数 / 指向指向一个 DWORD 数值,该数值返回实际写入的字节数 Ref int lpNumberOfBytesWritten, / 重叠

15、操作时,该参数指向一个 OVERLAPPED 结构, / 同步操作时,该参数为 NULL。 Ref OVERLAPPED lpOverlapped );(3)清除缓存或内在空间方法:BOOL PurgeComm( int hFile, /串口句柄 uint dwFlags / 需要完成的操作 ); 参数 dwFlags 指定要完成的操作,可以是下列值的组合: PURGE_TXABORT 中断所有写操作并立即返回,即使写操作还没有完成。 PURGE_RXABORT 中断所有读操作并立即返回,即使读操作还没有完成。 PURGE_TXCLEAR 清除输出缓冲区 PURGE_RXCLEAR 清除输入缓

16、冲综上:在了解了以上的基本 API 方法的用法和作用后,现在来假设上位机发命令从下位机读取一条数据的例子。首先假设一下我们的串口和通信协议如下:串口协议:Portname(com3) ,BaudRate = 9600,ByteSize = 8,Parity = 0通信协议: 数据头+ 内容+ 数据尾(BG+END)Readtime:下位机就可以传回(BG20121020END)这里假设下位机只有一个,但是每个下位机地址是唯一的,所以这里的大致流程可以是这样的: (1)首先打开串口,下面程序中的 open()。(2)由上位机发送一个相应的下位机地址【下面程序的writefile() ,发送到串口 】,下

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 研究报告 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号