利用Windows应用程序编程接口为程序提供串口通信功能
1.串行编程的数据结构:DCB(Device Control Block)、CIMMTIMEOUTS
DCB:设备控制块
通过该数据结构,完成对串口端的初始化工作 该数据结构包含了 传输波特率、数据位数、奇偶检验类型和停止位数等参数
在查询或者配置串行端口的属性时,需要使用DCB数据结构作为缓冲区
Win32 API
USER32.DLL 负责窗口管理,包括消息、菜单、光标、通信、计时器和其它与控制窗口显示
GDI32.DLL 提供图形设备接口、管理用户界面和图形绘制,包括Windows元文件、位图、设备描述符和字体等
KERNEL32.DLL 处理存储器底层功能、任务和资源管理等windows核心服务
Win16:
打开和关闭串口
OpenComm() 打开串口资源,并指定输入、输出缓冲区的大小
CloseComm() 关闭串口
int idComDev;
idComDev = OpenComm("COM1",1024,128);
CloseComm(idComDev);
2.初始化串口,设置串口参数
BuildCommDCB()、SetCommState()填写设备控制块DCB 然后对已打开的串口进行参数配置
DCB dcb;
BuildCommDCB("COM1:2400,n,8,1",&dcb);
SetCommState(&dcb);
3.读写串口,收发数据
ReadComm、WriteComm 对串口进行读写操作 数据的接收和发送
char *m_pReceive;
int count;
ReadComm(idComDev,m_pReceive,count);
char wr[30];
int count2;
WriteComm(idComDev,wr,count2);
16位下的串口等外部设备操作 有自己特有的API函数 而32位程序则把串口操作(以及并口)和文件系统操作关联在了一起
串口编程中常用到的结构及相关的概念
1. DCB(Device Control Block) 结构
GetCommState()可以用来获得串口的配置
将当前配置填充到一个DCB结构中
在用CreateFile 打开串行口后,可以调用GetCommState函数来获取串行口的初始配置
然后修改DCB结构 再调用SetCommState函数用指定的DCB结构来设置串行口
typedef struct _DCB {
DWORD DCBlength; /* DCB结构大小 */
DWORD BaudRate; /* 当前波特率 */
DWORD fBinary: 1; /* 二进制模式,不检测EOF */
DWORD fParity: 1; /* 允许奇偶校验 */
DWORD fOutxCtsFlow:1; /* CTS 输出流控制 */
DWORD fOutxDsrFlow:1; /* DSR 输出流控制 */
DWORD fDtrControl:2; /* DTR 流控制类型 */
DWORD fDsrSensitivity:1; /* DSR 信号线是否敏感 */
DWORD fTXContinueOnXoff: 1; /* XOFF continues Tx */
DWORD fOutX: 1; /* XON/XOFF 输出流控制 */
DWORD fInX: 1; /* XON/XOFF 输入流控制 */
DWORD fErrorChar: 1; /* 允许错误替换 */
DWORD fNull: 1; /* 允许剥离去掉NULL字符 */
DWORD fRtsControl:2; /* Rts 流控制 */
DWORD fAbortOnError:1; /* 有错误是终止读/写操作 */
DWORD fDummy2:17; /* 保留 */
WORD wReserved; /* 当前不用 */
WORD XonLim; /* XON发送字符之前缓冲区中允许接收最小字节数 */
WORD XoffLim; /* XON发送字符之前缓冲区中允许接收最小可用字节数 */
BYTE ByteSize; /* 数据位数 */
BYTE Parity; /* 奇偶校验0-4 表示:不校验 奇校验 偶校验 标号 空格 */
BYTE StopBits; /* 停止位 0,1,2 = 1, 1.5, 2 */
char XonChar; /* 发送和接收的 XON 字符 */
char XoffChar; /* 发送和接收的 XOFF 字符 */
char ErrorChar; /* 替换接收到的奇偶校验发生错误的字符 */
char EofChar; /* 输入数据结束字符 */
char EvtChar; /* 接收到的事件字符 */
WORD wReserved1; /* 保留位 不用 */
} DCB, *LPDCB;
DCB 结构参数说明
DCBlength:
以字节为单位设置DCB结构长度大小
BaudRate:
设置波特率(串口传输速率) 可以以实际数据表示 如9600等
或 CBR_110 CBR_300 CBR_1200 CBR_2400 CBR_4800 CBR_9600 CBR_14400 CBR_19200等
fBinary:
是否允许二进制传输 Win32API 不支持非二进制方式传输 因此 该参数必须设置为TRUE
fParity:
是否允许奇偶校验 如果设置为TRUE 则进行就校验并报告错误信息
fOutxCtsFlow:
指定CTS(clear-to-send)信号是否检测输出流控制 该值为TRUE且CTS为off时,发送被暂停 直至CTS被重新置为on
fOutxDsrFlow:
指定DSR(data-set-ready)信号是否检测输出流控制 该值为TRUE且DSR为off时,发送被暂停 直至DSR被重新置为on
fDtrControl:
设置DTR(data-terminal-ready)流控制
DTR_CONTROL_DISABLE 当串口被打开时 禁止DTR线 并保持禁止状态
DTR_CONTROL_ENABLE 当串口被打开时 允许DTR线 并保持允许状态
DTR_CONTROL_HANDSHAKE 允许DTR握手 如果handshaking被打开 不允许使用EscapeCommFunction函数 调整线路状态
fDsrSensitivity:
设置通信驱动程序对DTR信号是否敏感 如果该值