VC++ 串口 通讯API (2010年07月17日 星期六 下午 08:39)
WIN95界面下的VC++串口通讯程序在WIN32下是不建议对端口进行操作的,在WIN32中所有的设备都被看成是文件,串行口也不例外也是作为文件来进行处理的。
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 (FILE_ATTRIBUTE_ NORMAL|FILE_FLAG_OVERLAPPED) HANDLE hTemplateFile );
lpFileName: dwDesiredAccess: dwShareMode:
// handle to file with attributes to copy
指明串口制备,例:COM1,COM2
指明串口存取方式,例:GENERIC_READ|GENERIC_WRITE 指明串口共享方式应设为0,串口为不可共享设备 指明串口的安全属性结构,NULL为缺省安全属性 必须为OPEN_EXISTIN
lpSecurityAttributes: dwCreateionDistribution:
dwFlagAndAttributes: 对串口有意义的值是FILE_FLAG_OVERLAPPED,该标志表明串口采用异步通信模式,可进行重叠操作;若值为NULL,则为同步通信方式,在同步方式下,应用程序将始终控制程序流,直到程序结束,若遭遇通信故障等因素,将导致应用程序的永久等待,所以一般多采用异步通信。
hTemplateFile: 必须为NULL
2.读串口,写串口,关闭串口: WriteFile ();
ReadFile ();
CloseHandle (hComm);
若为异步通信方式,读写两函数中最后一个参数为指向OVERLAPPED结构的非空指针,在读写函数返回值为FALSE的情况下,调用GetLastError()函数,返回值为ERROR_IO_PENDING,表明I/O操作悬挂,即操作转入后台继续执行。此时,可以用WaitForSingleObject()来等待结束信号并设置最长等待时间
3.设置缓冲区长度:
BOOL SetupComm( HANDLE hFile,
// handle of communications device
DWORD dwInQueue, // size of input buffer DWORD dwOutQueue // size of output buffer
);
5.超时设置:
可通过COMMTIMEOUTS结构设置超时,
typedef struct _COMMTIMEOUTS {
DWORD ReadIntervalTimeout;两字符之间最大的延时。当读取串口数据时,超过该时间,将返回现有的数据。为0参数不起作用
DWORD ReadTotalTimeoutMultiplier; 读取每字符间的超时
DWORD ReadTotalTimeoutConstant; 一次读取串口数据的固定超时 DWORD WriteTotalTimeoutMultiplier; 输入每字符间的超时
DWORD WriteTotalTimeoutConstant; 一次输入串口数据的固定超时
} COMMTIMEOUTS,*LPCOMMTIMEOUTS;
区间超时仅对从端口中读取数据有用)它指定在读取两个字符之间要经历的时间 总超时: 当读或写特定的字节数需要的总时间超过某一阈值时,超时触发. 超时公式: ReadTotalTimeout = (ReadTotalTimeoutMultiplier * bytes_to_read) + ReadToTaltimeoutConstant WriteTotalTimeout = (WriteTotalTimeoutMuliplier * bytes_to_write) + WritetoTotalTimeoutConstant
NOTE:在设置超时时参数0为无限等待,既无超时、参数MAXDWORD为立即返回,把间隔超时ReadIntervalTimeout设为最大,把总超时设为 0 将导致 ReadFile 立即返回并完成操作。 超时设置: SetCommTimeouts ( hComm, &timeouts );
GetCommTimeouts ( hComm, &timeouts );
4.改变端口设置
使用如下的两个方法
BOOL GetCommState ( hComm, &dcb );
BOOL SetCommState ( hComm, &dcb );
6.串口设备控制块DCB(Device Control Block)结构: typedef struct _DCB {// dcb DWORD DCBlength; // sizeof(DCB)
DWORD BaudRate; // 指定当前的波特率 DWORD fBinary: 1; // 指定是否允许二进制模式,WINDOWS 95中必须为TRUE DWORD fParity: 1; // 指定奇偶校验是否允许
DWORD fOutxCtsFlow:1; // 指定CTS是否用于检测发送控制。当为TRUE是CTS为OFF,发送将被挂起。
DWORD fOutxDsrFlow:1; // 指定CTS是否用于检测发送控制。当为TRUE是CTS为OFF,发送将被挂起。 DWORD fDtrControl:2; // DTR_CONTROL_DISABLE值将DTR置为OFF, DTR_CONTROL_ENABLE值将DTR置
//为ON, DTR_CONTROL_HANDSHAKE允许DTR\握手\
DWORD fDsrSensitivity:1; // 当该值为TRUE时DSR为OFF时接收的字节被忽略
DWORD fTXContinueOnXoff:1; // 指定当接收缓冲区已满,并且驱动程序已经发送出XoffChar字符时发送是否停止。
//TRUE时,在接收缓冲区接收到缓冲区已满的字节XoffLim且驱动程序已经发送出//XoffChar字符中止接收字节之后,发送继续进行。
//FALSE时,在接收缓冲区接收到代表缓冲区已空的字节XonChar且驱动程序已经发//送出恢复发送的XonChar之后,发送继续进行。
DWORD fOutX: 1; // TRUE时,接收到XoffChar之后便停止发送,接收到XonChar之后将重新开始 DWORD fInX: 1;
// TRUE时,接收缓冲区接收到代表缓冲区满的XoffLim之后,XoffChar发送出去,接收缓冲区// 接收到代表缓冲区空的XonLim之后,XonChar发送出去
DWORD fErrorChar: 1; // 该值为TRUE且fParity为TRUE时,用ErrorChar 成员指定的字符代替奇偶校验错误的接
// 收字符 DWORD fNull: 1; // TRUE时,接收时去掉空(0值)字节 DWORD fRtsControl:2; // RTS flow control
// RTS_CONTROL_DISABLE时,RTS置为OFF // RTS_CONTROL_ENABLE时, RTS置为ON
// RTS_CONTROL_HANDSHAKE时, // 当接收缓冲区小于半满时RTS为ON // 当接收缓冲区超过四分之三满时RTS为OFF // RTS_CONTROL_TOGGLE时,
// 当接收缓冲区仍有剩余字节时RTS为ON ,否则缺省为OFF // TRUE时,有错误发生时中止读和写操作 // 未使用
// 未使用,必须为0
// 指定在XON字符发送这前接收缓冲区中可允许的最小字节数 // 指定在XOFF字符发送这前接收缓冲区中可允许的最小字节数
DWORD fAbortOnError:1; DWORD fDummy2:17; WORD wReserved;
WORD XonLim; WORD XoffLim;
BYTE ByteSize; // 指定端口当前使用的数据位
BYTE Parity; // 指定端口当前使用的奇偶校验方法,可能为:EVENPARITY,MARKPARITY,NOPARITY,ODDPARITY BYTE StopBits; // 指定端口当前使用的停止位数,可能为:ONESTOPBIT,ONE5STOPBITS,TWOSTOPBITS char XonChar; // 指定用于发送和接收字符XON的值 char XoffChar; // 指定用于发送和接收字符XOFF值
char ErrorChar; // 本字符用来代替接收到的奇偶校验发生错误时的值
char EofChar; // 当没有使用二进制模式时,本字符可用来指示数据的结束 char EvtChar; // 当接收到此字符时,会产生一个事件 WORD wReserved1; // 未使用 } DCB;
7.COMMPROP结构:
可使用GetCommProperties()取得COMMPROP结构,COMMPROP结构中记载了系统支持的各项设置。 typedef struct _COMMPROP { // cmmp
WORD wPacketLength; WORD wPacketVersion; DWORD dwServiceMask; DWORD dwReserved1;
// packet size, in bytes // packet version
// services implemented // reserved
// max Tx bufsize, in bytes
DWORD dwMaxTxQueue;
DWORD dwMaxRxQueue; // max Rx bufsize, in bytes DWORD dwMaxBaud; // max baud rate, in bps DWORD dwProvSubType; // specific provider type DWORD dwProvCapabilities; // capabilities supported
DWORD dwSettableParams; // changeable parameters DWORD dwSettableBaud; // allowable baud rates WORD wSettableData; // allowable byte sizes
WORD wSettableStopParity; // stop bits/parity allowed DWORD dwCurrentTxQueue;
// Tx buffer size, in bytes
DWORD dwCurrentRxQueue; // Rx buffer size, in bytes DWORD dwProvSpec1; // provider-specific data DWORD dwProvSpec2; // provider-specific data WCHAR wcProvChar[1]; // provider-specific data } COMMPROP; dwMaxBaud: BAUD_075 75 bps BAUD_110 110 bps
BAUD_134_5 BAUD_150 BAUD_300 BAUD_600
BAUD_1200 BAUD_1800 BAUD_2400 BAUD_4800
134.5 bps 150 bps 300 bps 600 bps 1200 bps 1800 bps 2400 bps 4800 bps 7200 bps 9600 bps 14400 bps 19200 bps 38400 bps 56K bps 57600 bps
BAUD_7200 BAUD_9600 BAUD_14400 BAUD_19200 BAUD_38400 BAUD_56K BAUD_57600
BAUD_115200 115200 bps BAUD_128K 128K bps
BAUD_USER Programmable baud rates available dwProvSubType: PST_FAX
传真设备
PST_LAT LAT协议
PST_MODEM 调制解调器设备
PST_NETWORK_BRIDGE 未指定的网桥 PST_PARALLELPORT 并口
PST_RS232 PST_RS422 PST_RS423 PST_RS449
RS-232RS-422RS-432RS-449
口 口 口 口
PST_SCANNER 扫描仪设备 TCP/IP Telnet协议 未指定 X.25标准
支持特殊的16位模式
支持DTR(数据终端就绪)/DSR(数据设备就绪)
PST_TCPIP_TELNET PST_UNSPECIFIED PST_X25 dwProvCapabilities PCF_16BITMODE PCF_DTRDSR
PCF_INTTIMEOUTS 支持区间超时 PCF_PARITY_CHECK 支持奇偶校验 PCF_RLSD
支持RLSD(接收线信号检测) 支持RTS(请求发送)/CTS(清除发送) 支持可设置的XON/XOFF
PCF_RTSCTS PCF_SETXCHAR
PCF_SPECIALCHARS 支持特殊字符
PCF_TOTALTIMEOUTS 支持总(占用时间)超时
PCF_XONXOFF 支持XON/XOFF流控制
标准RS-232和WINDOW支持除PCF_16BITMODE和PCF_SPECIALCHAR外的所有功能 dwSettableParams SP_BAUD 可配置波特率
SP_DATABITS 可配置数据位个数 SP_HANDSHAKING 可配置握手(流控制) SP_PARITY 可配置奇偶校验模式
SP_PARITY_CHECK 可配置奇偶校验允许/禁止
SP_RLSD 可配置RLSD(接收信号检测) SP_STOPBITS 可配置停止位个数 标准RS-232和WINDOW支持以上所有功能 wSettableData 5个数据位 6个数据位 7个数据位 8个数据位
DATABITS_5 DATABITS_6 DATABITS_7 DATABITS_8
DATABITS_16 16个数据位
DATABITS_16X 通过串行硬件线路的特殊宽度路径
WINDOWS 95支持16的所有设置
8.改变普通设置
BuildCommDCB(szSettings,&DCB); szSettings的格式:baud parity data stop 例: \baud=96 parity=n data=8 stop=1\ 简写:\96,N,8,1\ szSettings 的有效值 baud: 11 or 110 = 110 bps
15 or 150 = 150 bps 30 or 300 = 300 bps 60 or 600 = 600 bps 12 or 1200 = 1200 bps 48 or 4800 = 4800 bps 96 or 9600 = 9600 bps 19 or 19200= 19200bps parity: 24 or 2400 = 2400 bps
n=none e=even o=odd m=mark s=space data: 5,6,7,8 StopBit 1, 1.5, 2
9.COMMCONFIG结构:
typedef struct _COMM_CONFIG { DWORD dwSize;
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库VC++ - 串口 - 通讯API在线全文阅读。
相关推荐: