分隔线
然诸 CSerialPort VC串口类MSComm VC 串口控件等非常方便时控件适合特殊需求必解基Windows API串口编程方法面介绍API串口编程般步骤相关串口API函数
串口操作般四步分:
1) 开串口
2) 配置串口
3) 读写串口
4) 关闭串口
1 开串口
VC 开串口文中已单独介绍果利API开串口方法开串口API函数CreateFile开创建该函数原型:
1HANDLE CreateFile( LPCTSTR lpFileName
2 DWORD dwDesiredAccess
3 DWORD dwShareMode
4 LPSECURITY_ATTRIBUTES lpSecurityAttributes
5 DWORD dwCreationDistribution
6DWORD dwFlagsAndAttributes
7HANDLE hTemplateFile)
参数详解:
lpFileName:开串口逻辑名COM1
dwDesiredAccess:指定串口访问类型读取写入二者列
dwShareMode:指定享属性串口享该参数必须置0
lpSecurityAttributes:引安全性属性结构缺省值NULL
dwCreationDistribution:创建标志串口操作该参数必须置OPEN_EXISTING
dwFlagsAndAttributes:属性描述指定该串口否进行异步操作该值FILE_FLAG_OVERLAPPED表示异步IO该值0表示步IO操作
hTemplateFile:串口言该参数必须置NULL
串口操作两种操作方式:步操作方式重叠操作方式(称异步操作方式)步操作时API函数会阻塞直操作完成返回(线程方式中然会阻塞线程然会阻塞监听线程)重叠操作方式API函数会立返回操作台进行避免线程阻塞
步IO方式开串口示例:
8HANDLE hCom 全局变量串口句柄
9hComCreateFile(COM1COM1口
10 GENERIC_READ|GENERIC_WRITE 允许读写
11 0 独占方式
12 NULL
13 OPEN_EXISTING 开创建
14 0 步方式
15 NULL)
16if(hCom(HANDLE)1)
17{
18 AfxMessageBox(开COM失败)
19 return FALSE
20}
21return TRUE
重叠IO开串口示例:
22HANDLE hCom 全局变量串口句柄
23hCom CreateFile(COM1 COM1口
24 GENERIC_READ|GENERIC_WRITE 允许读写
25 0 独占方式
26 NULL
27 OPEN_EXISTING 开创建
28 FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED 重叠方式
29 NULL)
30if(hCom INVALID_HANDLE_VALUE)
31{
32 AfxMessageBox(开COM失败)
33 return FALSE
34}
35 return TRUE
2配置串口
开通讯设备句柄常常需串口进行初始化配置工作需通DCB结构进行DCB结构包含诸波特率数位数奇偶校验停止位数等信息查询配置串口属性时DCB结构作缓区
般CreateFile开串口调GetCommState函数获取串口初始配置修改串口配置应该先修改DCB结构然调SetCommState函数设置串口
DCB结构包含串口项参数设置面仅介绍该结构常变量:
36typedef struct _DCB{
37 ………
38 波特率指定通信设备传输速率成员实际波特率值者面常量值:
39 DWORD BaudRate
40CBR_110CBR_300CBR_600CBR_1200CBR_2400CBR_4800CBR_9600CBR_19200 CBR_38400
41CBR_56000 CBR_57600 CBR_115200 CBR_128000 CBR_256000 CBR_14400
42
43DWORD fParity 指定奇偶校验成员1允许奇偶校验检查
44 …
45BYTE ByteSize 通信字节位数4—8
46BYTE Parity 指定奇偶校验方法成员列值:
47EVENPARITY 偶校验 NOPARITY 校验
48MARKPARITY 标记校验 ODDPARITY 奇校验
49BYTE StopBits 指定停止位位数成员列值:
50ONESTOPBIT 1位停止位 TWOSTOPBITS 2位停止位
51ONE5STOPBITS 15位停止位
52 ………
53 } DCB
54winbaseh文件中定义常量:
55#define NOPARITY 0
56#define ODDPARITY 1
57#define EVENPARITY 2
58#define ONESTOPBIT 0
59#define ONE5STOPBITS 1
60#define TWOSTOPBITS 2
61#define CBR_110 110
62#define CBR_300 300
63#define CBR_600 600
64#define CBR_1200 1200
65#define CBR_2400 2400
66#define CBR_4800 4800
67#define CBR_9600 9600
68#define CBR_14400 14400
69#define CBR_19200 19200
70#define CBR_38400 38400
71#define CBR_56000 56000
72#define CBR_57600 57600
73#define CBR_115200 115200
74#define CBR_128000 128000
75#define CBR_256000 256000
GetCommState函数获COM口设备控制块获相关参数:
76BOOL GetCommState(
77 HANDLE hFile 标识通讯端口句柄
78 LPDCB lpDCB 指设备控制块(DCB结构)指针
79 )
80SetCommState函数设置COM口设备控制块:
81BOOL SetCommState(
82 HANDLE hFile
83 LPDCB lpDCB
84 )
BCD中设置外程序般需设置IO缓区超时WindowsIO缓区暂存串口输入输出数果通信速率较高应该设置较缓区调SetupComm函数设置串行口输入输出缓区
85BOOL SetupComm(
86
87 HANDLE hFile 通信设备句柄
88 DWORD dwInQueue 输入缓区(字节数)
89 DWORD dwOutQueue 输出缓区(字节数)
90 )
ReadFileWriteFile读写串行口时需考虑超时问题超时作指定时间没读入发送指定数量字符ReadFileWriteFile操作然会结束
查询前超时设置应调GetCommTimeouts函数该函数会填充COMMTIMEOUTS结构调SetCommTimeouts某COMMTIMEOUTS结构容设置超时
读写串口超时两种:间隔超时总超时间隔超时指接收时两字符间时延总超时指读写操作总花费时间写操作支持总超时读操作两种超时均支持COMMTIMEOUTS结构规定读写操作超时
COMMTIMEOUTS结构定义:
91typedef struct _COMMTIMEOUTS {
92 DWORD ReadIntervalTimeout 读间隔超时
93 DWORD ReadTotalTimeoutMultiplier 读时间系数
94 DWORD ReadTotalTimeoutConstant 读时间常量
95 DWORD WriteTotalTimeoutMultiplier 写时间系数
96 DWORD WriteTotalTimeoutConstant 写时间常量
97} COMMTIMEOUTS*LPCOMMTIMEOUTS
COMMTIMEOUTS结构成员毫秒单位总超时计算公式:
总超时=时间系数×求读写字符数+时间常量
例读入10字符读操作总超时计算公式:
读总超时=ReadTotalTimeoutMultiplier×10+ReadTotalTimeoutConstant
出:间隔超时总超时设置相关方便通信程序灵活设置种超时
果写超时参数均0写超时果ReadIntervalTimeout0读间隔超时果ReadTotalTimeoutMultiplier ReadTotalTimeoutConstant 0读总超时果读间隔超时设置成MAXDWORD读时间系数读时间常量0读次输入缓区容读操作立返回否读入求字符
重叠方式读写串口时然ReadFileWriteFile完成操作前返回超时然起作种情况超时规定操作完成时间ReadFileWriteFile返回时间
配置串口示例代码:
98SetupComm(hCom10241024) 输入缓区输出缓区1024
99
100COMMTIMEOUTS TimeOuts
101设定读超时
102TimeOutsReadIntervalTimeout1000
103TimeOutsReadTotalTimeoutMultiplier500
104TimeOutsReadTotalTimeoutConstant5000
105设定写超时
106TimeOutsWriteTotalTimeoutMultiplier500
107TimeOutsWriteTotalTimeoutConstant2000
108SetCommTimeouts(hCom&TimeOuts) 设置超时
109
110DCB dcb
111GetCommState(hCom&dcb)
112dcbBaudRate9600 波特率9600
113dcbByteSize8 字节8位
114dcbParityNOPARITY 奇偶校验位
115dcbStopBitsTWOSTOPBITS 两停止位
116SetCommState(hCom&dcb)
117
118PurgeComm(hComPURGE_TXCLEAR|PURGE_RXCLEAR)
读写串口前PurgeComm()函数清空缓区该函数原型:
119BOOL PurgeComm(
120
121 HANDLE hFile 串口句柄
122 DWORD dwFlags 需完成操作
123 )
参数dwFlags指定完成操作列值组合:
124PURGE_TXABORT 中断写操作立返回写操作没完成
125PURGE_RXABORT 中断读操作立返回读操作没完成
126PURGE_TXCLEAR 清输出缓区
127PURGE_RXCLEAR 清输入缓区
3读写串口
ReadFileWriteFile读写串口面两函数声明:
128BOOL ReadFile(
129
130 HANDLE hFile 串口句柄
131
132 读入数存储址
133 读入数存储该指针值首址片存区
134 LPVOID lpBuffer
135 DWORD nNumberOfBytesToRead 读入数字节数
136
137 指DWORD数值该数值返回读操作实际读入字节数
138 LPDWORD lpNumberOfBytesRead
139
140 重叠操作时该参数指OVERLAPPED结构步操作时该参数NULL
141 LPOVERLAPPED lpOverlapped
142 )
143BOOL WriteFile(
144
145 HANDLE hFile 串口句柄
146
147 写入数存储址
148 该指针值首址nNumberOfBytesToWrite
149 字节数写入串口发送数缓区
150 LPCVOID lpBuffer
151
152 DWORD nNumberOfBytesToWrite 写入数字节数
153
154 指指DWORD数值该数值返回实际写入字节数
155 LPDWORD lpNumberOfBytesWritten
156
157 重叠操作时该参数指OVERLAPPED结构
158 步操作时该参数NULL
159 LPOVERLAPPED lpOverlapped
160 )
ReadFileWriteFile读写串口时步执行重叠执行步执行时函数直操作完成返回意味着步执行时线程会阻塞导致效率降重叠执行时操作未完成两函数会立返回费时IO操作台进行
ReadFileWriteFile函数步异步CreateFile函数决定果调CreateFile创建句柄时指定FILE_FLAG_OVERLAPPED标志调ReadFileWriteFile该句柄进行操作应该重叠果未指定重叠标志读写操作应该步ReadFileWriteFile函数步者异步应该CreateFile函数相致
ReadFile函数串口输入缓区中读入指定数量字符算完成操作WriteFile函数指定数量字符拷入输出缓区等字符串行口送出算完成操作
果操作成功两函数返回TRUE需注意ReadFileWriteFile返回FALSE时定操作失败线程应该调GetLastError函数分析返回结果例重叠操作时果操作未完成函数返回函数返回FALSEGetLastError函数返回ERROR_IO_PENDING说明重叠操作未完成
步方式读写串口较简单面先例举步方式读写串口代码:
161步读串口
162char str[100]
163DWORD wCount读取字节数
164BOOL bReadStat
165bReadStatReadFile(hComstr100&wCountNULL)
166if(bReadStat)
167{
168 AfxMessageBox(读串口失败)
169 return FALSE
170}
171return TRUE
172
173步写串口
174
175 char lpOutBuffer[100]
176 DWORD dwBytesWrite100
177 COMSTAT ComStat
178 DWORD dwErrorFlags
179 BOOL bWriteStat
180 ClearCommError(hCom&dwErrorFlags&ComStat)
181 bWriteStatWriteFile(hComlpOutBufferdwBytesWrite& dwBytesWriteNULL)
182 if(bWriteStat)
183 {
184 AfxMessageBox(写串口失败)
185 }
186 PurgeComm(hCom PURGE_TXABORT|
187 PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR)
重叠操作时操作未完成函数返回
重叠IO非常灵活实现阻塞(例设置定读取数进行步操作)两种方法等操作完成:种方法象WaitForSingleObject样等函数等OVERLAPPED结构hEvent成员种方法调GetOverlappedResult函数等面演示说明
面先简单说OVERLAPPED结构GetOverlappedResult函数:
OVERLAPPED结构
OVERLAPPED结构包含重叠IO信息定义:
188typedef struct _OVERLAPPED { o
189 DWORD Internal
190 DWORD InternalHigh
191 DWORD Offset
192 DWORD OffsetHigh
193 HANDLE hEvent
194} OVERLAPPED
ReadFileWriteFile重叠操作时线程需创建OVERLAPPED结构供两函数线程通OVERLAPPED结构获前操作状态该结构重成员hEventhEvent读写事件串口异步通讯时函数返回时操作没完成程序通检查该事件知否读写完毕
调ReadFile WriteFile 函数时候该成员会动置信号状态重叠操作完成该成员变量会动置信号状态
195GetOverlappedResult函数
196BOOL GetOverlappedResult(
197 HANDLE hFile 串口句柄
198
199 指重叠操作开始时指定OVERLAPPED结构
200 LPOVERLAPPED lpOverlapped
201
202 指32位变量该变量值返回实际读写操作传输字节数
203 LPDWORD lpNumberOfBytesTransferred
204
205 该参数指定函数否直等重叠操作结束
206 果该参数TRUE函数直操作结束返回
207 果该参数FALSE函数直接返回时果操作没完成
208 通调GetLastError()函数会返回ERROR_IO_INCOMPLETE
209 BOOL bWait
210 )
该函数返回重叠操作结果判断异步操作否完成通判断OVERLAPPED结构中hEvent否置位实现
异步读串口示例代码:
211char lpInBuffer[1024]
212DWORD dwBytesRead1024
213COMSTAT ComStat
214DWORD dwErrorFlags
215OVERLAPPED m_osRead
216memset(&m_osRead0sizeof(OVERLAPPED))
217m_osReadhEventCreateEvent(NULLTRUEFALSENULL)
218
219ClearCommError(hCom&dwErrorFlags&ComStat)
220dwBytesReadmin(dwBytesRead(DWORD)ComStatcbInQue)
221if(dwBytesRead)
222return FALSE
223BOOL bReadStatus
224bReadStatusReadFile(hComlpInBuffer
225 dwBytesRead&dwBytesRead&m_osRead)
226
227if(bReadStatus) 果ReadFile函数返回FALSE
228{
229 if(GetLastError()ERROR_IO_PENDING)
230 GetLastError()函数返回ERROR_IO_PENDING表明串口正进行读操作
231 {
232 WaitForSingleObject(m_osReadhEvent2000)
233 WaitForSingleObject函数等直读操作完成延时已达2秒钟
234 串口读操作进行完毕m_osReadhEvent事件会变信号
235 PurgeComm(hCom PURGE_TXABORT|
236 PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR)
237 return dwBytesRead
238 }
239 return 0
240}
241PurgeComm(hCom PURGE_TXABORT|
242 PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR)
243return dwBytesRead
代码作简说明:ReadFile 函数进行读操作前应先ClearCommError函数清错误ClearCommError函数原型:
244BOOL ClearCommError(
245
246 HANDLE hFile 串口句柄
247 LPDWORD lpErrors 指接收错误码变量
248 LPCOMSTAT lpStat 指通讯状态缓区
249 )
该函数获通信错误报告串口前状态时该函数清串口错误标志便继续输入输出操作
参数lpStat指COMSTAT结构该结构返回串口状态信息 COMSTAT结构 COMSTAT结构包含串口信息结构定义:
250typedef struct _COMSTAT { cst
251 DWORD fCtsHold 1 Tx waiting for CTS signal
252 DWORD fDsrHold 1 Tx waiting for DSR signal
253 DWORD fRlsdHold 1 Tx waiting for RLSD signal
254 DWORD fXoffHold 1 Tx waiting XOFF char rec''d
255 DWORD fXoffSent 1 Tx waiting XOFF char sent
256 DWORD fEof 1 EOF character sent
257 DWORD fTxim 1 character waiting for Tx
258 DWORD fReserved 25 reserved
259 DWORD cbInQue bytes in input buffer
260 DWORD cbOutQue bytes in output buffer
261} COMSTAT *LPCOMSTAT
里cbInQue成员变量该成员变量值代表输入缓区字节数
PurgeComm函数清空串口输入输出缓区
段代码WaitForSingleObject函数等OVERLAPPED结构hEvent成员面演示段调GetOverlappedResult函数等异步读串口示例代码:
262char lpInBuffer[1024]
263DWORD dwBytesRead1024
264 BOOL bReadStatus
265 DWORD dwErrorFlags
266 COMSTAT ComStat
267OVERLAPPED m_osRead
268
269 ClearCommError(hCom&dwErrorFlags&ComStat)
270 if(ComStatcbInQue)
271 return 0
272 dwBytesReadmin(dwBytesRead(DWORD)ComStatcbInQue)
273 bReadStatusReadFile(hCom lpInBufferdwBytesRead
274 &dwBytesRead&m_osRead)
275 if(bReadStatus) 果ReadFile函数返回FALSE
276 {
277 if(GetLastError()ERROR_IO_PENDING)
278 {
279 GetOverlappedResult(hCom
280 &m_osRead&dwBytesReadTRUE)
281 GetOverlappedResult函数参数设TRUE
282 函数会直等直读操作完成错误返回
283
284 return dwBytesRead
285 }
286 return 0
287 }
288 return dwBytesRead
异步写串口示例代码:
289char buffer[1024]
290DWORD dwBytesWritten1024
291 DWORD dwErrorFlags
292 COMSTAT ComStat
293OVERLAPPED m_osWrite
294 BOOL bWriteStat
295
296 bWriteStatWriteFile(hCombufferdwBytesWritten
297 &dwBytesWritten&m_OsWrite)
298 if(bWriteStat)
299 {
300 if(GetLastError()ERROR_IO_PENDING)
301 {
302 WaitForSingleObject(m_osWritehEvent1000)
303 return dwBytesWritten
304 }
305 return 0
306 }
307 return dwBytesWritten
4关闭串口
利API函数关闭串口非常简单需CreateFile函数返回句柄作参数调CloseHandle:
308BOOL CloseHandle(
309 HANDLE hObject handle to object to close
310)
文香网httpwwwxiangdangnet
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档