问一个有点难度的问题,如何检测串口检测工具是否被h

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
信息来自Internet
8:43 “9600,n,8,1”的问题?BuildCommDCB的功能是把一个字符串如com1:9600,n,8,1这样的转换到具体的数据填写到DCB中,但使用中也存在问题,我发现我用它转换象com1:9600,e,7,1 之类的带校验位的字符串,它总是无法把这个e给我转换过去,设置好串口一看,成了9600,n,7,1,而上面提到的CommConfigDialog返回的结果用来设置串口却是正确的,经过比较,发现问题出在DCB.fbits.fParity这个bit上,只有把这个bit置1,校验位才是有效的,而BuildCommDCB恰恰是漏了这个bit,所有如果你要使用BuildCommDCB,别忘了补充把DCB.fbits.fParity设置回去。8:46 “WaitCommEvent”的问题?结束时关闭端口--停止WaitCommEvent的等待以及关闭端口CloseHandle,平时程序会停留在WaitCommEvent的等待中,当要终止线程的时候,必须是程序从WaitCommEvent中退出来,这时候要用按照Win32手册上的说明,参数为NULL的SetCommMask会使另一个线程中的WaitCommEvent马上返回,然后就是用CloseHandle关闭端口invoke CloseHandle,hComWin32通讯API Bug之二---SetCommMask和WaitCommEvent严格的说这不应该是Bug,而是偶然的情况,发现有时读线程无法结束,跟踪发现是停在了 WaitCommEvent 上,这说明有时候invoke SetCommMask,hCom,NULL并不能使WaitCommEvent退出,我最后使用的办法是:在SetCommMask以后再执行invoke SetEvent,stReadState.hEvent,把读的OVERLAPPED结构中的Event置位,让WaitCommEvent认为有Event发生,它就会马上返回,也许这并不是普遍的情况,但如果你的程序也是停在了WaitCommEvent 的地方,不妨一试。9:16 流控制的问题在流控制方式为“无”和“软件控制”的情况下,基本上没有什么问题,但在“硬件控制”下,win32手册中说明RTS_CONTROL_HANDSHAKE控制方式的含义是:也就是说,当缓冲区快满的时候RTS会自动OFF通知对方暂停发送,当缓冲区重新空出来时,RTS会自动ON,但我发现当RTS变OFF以后即使你已经清空了缓冲区,RTS也不会自动的ON,造成对方停在那里不发送了,所以,如用硬件流控制,还要在接收后最好加上检测缓冲区大小的判断,具体是使用ClearCommError后返回的COMSTAT.cbInQue,当缓冲区已经空出来的时候,要使用invoke EscapeCommFunction,hCom,SETRTS重新将RTS设置为ON。
9:21 设置等待事件SetCommMask:等待事件WaitCommEvent(内循环,等待触发)。
作者:&佚名&
在WIN32下是不建议对端口进行操作的,在WIN32中所有的设备都被看成是文件,串行口也不例外也是作为文件来进行处理的。这是我的一份关于串口编程的读书笔记,对于使用VC进行编程的同行应该有一定的帮助。
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&
HANDLE&hTemplateFile&//&handle&to&file&with&attributes&to&copy&
lpFileName:&指明串口制备,例:COM1,COM2
dwDesiredAccess:&指明串口存取方式,例:GENERIC_READ|GENERIC_WRITE
dwShareMode:&指明串口共享方式
lpSecurityAttributes:&指明串口的安全属性结构,NULL为缺省安全属性
dwCreateionDistribution:&必须为OPEN_EXISTIN
dwFlagAndAttributes:&对串口唯一有意义的是FILE_FLAG_OVERLAPPED
hTemplateFile:&必须为NULL
2.关闭串口:
CloseHandle(hCommDev);
3.设置缓冲区长度:
BOOL&SetupComm(&
HANDLE&hFile,&//&handle&of&communications&device&
DWORD&dwInQueue,&//&size&of&input&buffer&
DWORD&dwOutQueue&//&size&of&output&buffer&
4.COMMPROP结构:
可使用GetCommProperties()取得COMMPROP结构,COMMPROP结构中记载了系统支持的各项设置。
typedef&struct&_COMMPROP&{&//&cmmp&
WORD&wPacketL&//&packet&size,&in&bytes&
WORD&wPacketV&//&packet&version&
DWORD&dwServiceM&//&services&implemented&
DWORD&dwReserved1;&//&reserved&
DWORD&dwMaxTxQ&//&max&Tx&bufsize,&in&bytes&
DWORD&dwMaxRxQ&//&max&Rx&bufsize,&in&bytes&
DWORD&dwMaxB&//&max&baud&rate,&in&bps&
DWORD&dwProvSubT&//&specific&provider&type&
DWORD&dwProvC&//&capabilities&supported&
DWORD&dwSettableP&//&changeable&parameters&
DWORD&dwSettableB&//&allowable&baud&rates&
WORD&wSettableD&//&allowable&byte&sizes&
WORD&wSettableStopP&//&stop&bits/parity&allowed&
DWORD&dwCurrentTxQ&//&Tx&buffer&size,&in&bytes&
DWORD&dwCurrentRxQ&//&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&134.5&bps&
BAUD_150&150&bps&
BAUD_300&300&bps&
BAUD_600&600&bps&
BAUD_&bps&
BAUD_&bps&
BAUD_&bps&
BAUD_&bps&
BAUD_&bps&
BAUD_&bps&
BAUD_&bps&
BAUD_&bps&
BAUD_&bps&
BAUD_56K&56K&bps&
BAUD_&bps&
BAUD_200&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&RS-232口
PST_RS422&RS-422口
PST_RS423&RS-432口
PST_RS449&RS-449口
PST_SCANNER&扫描仪设备
PST_TCPIP_TELNET&TCP/IP&Telnet协议
PST_UNSPECIFIED&未指定
PST_X25&X.25标准
dwProvCapabilities&
PCF_16BITMODE&支持特殊的16位模式
PCF_DTRDSR&支持DTR(数据终端就绪)/DSR(数据设备就绪)&
PCF_INTTIMEOUTS&支持区间超时&
PCF_PARITY_CHECK&支持奇偶校验
PCF_RLSD&支持RLSD(接收线信号检测)
PCF_RTSCTS&支持RTS(请求发送)/CTS(清除发送)
PCF_SETXCHAR&支持可设置的XON/XOFF
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&
DATABITS_5&5个数据位
DATABITS_6&6个数据位
DATABITS_7&7个数据位
DATABITS_8&8个数据位
DATABITS_16&16个数据位
DATABITS_16X&通过串行硬件线路的特殊宽度路径
WINDOWS&95支持16的所有设置
5.DCB结构:
typedef&struct&_DCB&{//&dcb
DWORD&DCB&//&sizeof(DCB)&
DWORD&BaudR&//&current&baud&rate&
指定当前的波特率
DWORD&fBinary:&1;&//&binary&mode,&no&EOF&check&
指定是否允许二进制模式,
WINDOWS&95中必须为TRUE
DWORD&fParity:&1;&//&enable&parity&checking&
指定奇偶校验是否允许
DWORD&fOutxCtsFlow:1;&//&CTS&output&flow&control&
指定CTS是否用于检测发送控制。
当为TRUE是CTS为OFF,发送将被挂起。
DWORD&fOutxDsrFlow:1;&//&DSR&output&flow&control&
指定CTS是否用于检测发送控制。&
当为TRUE是CTS为OFF,发送将被挂起。
DWORD&fDtrControl:2;&//&DTR&flow&control&type&
DTR_CONTROL_DISABLE值将DTR置为OFF,
DTR_CONTROL_ENABLE值将DTR置为ON,
DTR_CONTROL_HANDSHAKE允许DTR"握手"
DWORD&fDsrSensitivity:1;&//&DSR&sensitivity&
当该值为TRUE时DSR为OFF时接收的字节被忽略
DWORD&fTXContinueOnXoff:1;&//&XOFF&continues&Tx&
指定当接收缓冲区已满,并且驱动程序已经发
送出XoffChar字符时发送是否停止。
TRUE时,在接收缓冲区接收到缓冲区已满的字
节XoffLim且驱动程序已经发送出XoffChar字符中
止接收字节之后,发送继续进行。
FALSE时,在接收缓冲区接收到代表缓冲区已空
的字节XonChar且驱动程序已经发送出恢复发送
的XonChar之后,发送继续进行。&
DWORD&fOutX:&1;&//&XON/XOFF&out&flow&control&
TRUE时,接收到XoffChar之后便停止发送
接收到XonChar之后将重新开始&
DWORD&fInX:&1;&//&XON/XOFF&in&flow&control&
TRUE时,接收缓冲区接收到代表缓冲区满的
XoffLim之后,XoffChar发送出去
接收缓冲区接收到代表缓冲区空的
XonLim之后,XonChar发送出
DWORD&fErrorChar:&1;&//&enable&error&replacement&
该值为TRUE且fParity为TRUE时,用ErrorChar
成员指定的字符代替奇偶校验错误的接收字
DWORD&fNull:&1;&//&enable&null&stripping&
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
DWORD&fAbortOnError:1;&//&abort&reads/writes&on&error&
TRUE时,有错误发生时中止读和写操作
DWORD&fDummy2:17;&//&reserved&
WORD&wR&//&not&currently&used&
未使用,必须为0
WORD&XonL&//&transmit&XON&threshold&
指定在XON字符发送这前接收缓冲区中可允许
的最小字节数
WORD&XoffL&//&transmit&XOFF&threshold&
指定在XOFF字符发送这前接收缓冲区中可允许
的最小字节数
BYTE&ByteS&//&number&of&bits/byte,&4-8&
指定端口当前使用的数据位
BYTE&P&//&0-4=no,odd,even,mark,space&
指定端口当前使用的奇偶校验方法,可能为:
EVENPARITY,MARKPARITY,NOPARITY,ODDPARITY
BYTE&StopB&//&0,1,2&=&1,&1.5,&2&
指定端口当前使用的停止位数,可能为:
ONESTOPBIT,ONE5STOPBITS,TWOSTOPBITS
char&XonC&//&Tx&and&Rx&XON&character&
指定用于发送和接收字符XON的值
char&XoffC&//&Tx&and&Rx&XOFF&character&
指定用于发送和接收字符XOFF值
char&ErrorC&//&error&replacement&character&
本字符用来代替接收到的奇偶校验发生错误时
char&EofC&//&end&of&input&character&
当没有使用二进制模式时,本字符可用来指示
数据的结束
char&EvtC&//&received&event&character&
当接收到此字符时,会产生一个事件
WORD&wReserved1;&//&&do&not&use
6.改变端口设置
使用如下的两个方法
BOOL&GetCommState(hComm,&dcb);
BOOL&SetCommState(hComm,&dcb);
7,改变普通设置
BuildCommDCB(szSettings,&DCB);
szSettings的格式:baud&parity&data&stop
例:&"baud=96&parity=n&data=8&stop=1"
简写:"96,N,8,1"
szSettings&的有效值
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
24&or&2400&=&2400&bps
48&or&4800&=&4800&bps
96&or&9600&=&9600&bps
19&or&1bps&
8.COMMCONFIG结构:
typedef&struct&_COMM_CONFIG&{
DWORD&dwProviderSubT
DWORD&dwProviderO
DWORD&dwProviderS
WCHAR&wcProviderData[1];
}&COMMCONFIG,&*LPCOMMCONFIG;
可方便的使用BOOL&CommConfigDialog(
LPTSTR&lpszName,&
HWND&hWnd,&
LPCOMMCONFIG&lpCC);&
来设置串行口。
9.超时设置:
可通过COMMTIMEOUTS结构设置超时,
typedef&struct&_COMMTIMEOUTS&{
DWORD&ReadIntervalT&
DWORD&ReadTotalTimeoutM
DWORD&ReadTotalTimeoutC
DWORD&WriteTotalTimeoutM
DWORD&WriteTotalTimeoutC&
}&COMMTIMEOUTS,*LPCOMMTIMEOUTS;&
区间超时:(仅对从端口中读取数据有用)它指定在读取两个字符之间要经历的时间
总超时:&当读或写特定的字节数需要的总时间超过某一阈值时,超时触发.
ReadTotalTimeout&=&(ReadTotalTimeoutMultiplier&*&bytes_to_read)
+&ReadToTaltimeoutConstant
WriteTotalTimeout&=&(WriteTotalTimeoutMuliplier&*&bytes_to_write)
+&WritetoTotalTimeoutConstant
NOTE:在设置超时时参数0为无限等待,既无超时
参数MAXDWORD为立即返回
超时设置:&
GetCommTimeouts(hComm,&timeouts);
SetCommTimeouts(hComm,&timeouts);
10.查询方式读写数据
COMMTIMEOUTS&
DWORD&ReadThread(LPDWORD&lpdwParam)
BYTE&inbuff[100];
DWORD&nBytesR
if(!(cp.dwProvCapabilities&PCF_INTTIMEOUTS))
return&1L;
memset(&to,0,sizeof(to));
to.ReadIntervalTimeout&=&MAXDWORD;
SetCommTimeouts(hComm,&to);
while(bReading)
if(!ReadFile(hComm,inbuff,100,&nBytesRead,NULL))
locProcessCommError(GetLastError());
if(nBytesRead)
locProcessBytes(inbuff,nBytesRead);
PurgeComm(hComm,PURGE_RXCLEAR);
return&0L;
PurgeComm()是一个清除函数,它可以中止任何未决的后台读或写,并且
可以冲掉I/O缓冲区.
BOOL&PurgeComm(HANDLE&hFile,DWORD&dwFlags);
dwFlages的有效值:&
PURGE_TXABORT:&中止后台写操作
PRUGE_RXABORT:&中止后台读操作&
PRUGE_TXCLEAR:&清除发送缓冲区
PRUGE_RXCLEAR:&清除接收缓冲区
可通过ClearCommError()来确定接收缓区中处于等待的字节数。
BOOL&ClearCommError(&
HANDLE&hFile,&//&handle&to&communications&device&
LPDWORD&lpErrors,&//&pointer&to&variable&to&receive&error&codes&
LPCOMSTAT&lpStat&//&pointer&to&buffer&for&communications&status&
ClearCommError()将返回一个COMSTAT结构:
typedef&struct&_COMSTAT&{&//&cst&
DWORD&fCtsHold&:&1;&//&Tx&waiting&for&CTS&signal&
DWORD&fDsrHold&:&1;&//&Tx&waiting&for&DSR&signal&
DWORD&fRlsdHold&:&1;&//&Tx&waiting&for&RLSD&signal&
DWORD&fXoffHold&:&1;&//&Tx&waiting,&XOFF&char&rec`d&
DWORD&fXoffSent&:&1;&//&Tx&waiting,&XOFF&char&sent&
DWORD&fEof&:&1;&//&EOF&character&sent&
DWORD&fTxim&:&1;&//&character&waiting&for&Tx&
DWORD&fReserved&:&25;&//&reserved&
DWORD&cbInQ&//&bytes&in&input&buffer&
DWORD&cbOutQ&//&bytes&in&output&buffer&
}&COMSTAT,&*LPCOMSTAT;&
其中的cbInQue和cbOutQue中即为缓冲区字节。
11.同步I/O读写数据
COMMTIOMOUTS&
DWORD&ReadThread(LPDWORD&lpdwParam)
BYTE&inbuff[100];
DWORD&nByteRead,dwErrorMask,nToR
if(!cp.dwProvCapabilities&PCF_TOTALTIMEOUTS)
return&1L;
memset(&to,0,sizeof(to));
to.ReadTotalTimeoutMultiplier&=&5;
to.ReadTotalTimeoutConstant&=&50;
SetCommTimeouts(hComm,&to);
while(bReading)
ClearCommError(hComm,&dwErrorMask,&comstat);
if(dwErrorMask)
locProcessCommError(dwErrorMask);
if(comstat.cbInQue&&100)
nToRead&=&100;
nToRead&=&comstat.cbInQ
if(nToRead&==&0)
if(!ReadFile(hComm,inbuff,nToRead,&nBytesRead,NULL))
locProcessCommError(GetLastError());
if(nBytesRead)
locProcessBytes(inbuff,nBytesRead);
return&0L;
12.异步I/O读写数据
当CreateFile()中的fdwAttrsAndFlags参数为FILE_FLAG_OVERLAPPEN时,
端口是为异步I/O打开的,此时可以在ReadFile的最后一个参数中指定一个
OVERLAPPED结构,使数据的读操作在后台进行。WINDOWS&95包括了异步
I/O的许多变种。
typedef&struct&_OVERLAPPED&{&
DWORD&InternalH&
DWORD&OffsetH&
HANDLE&hE&
}&OVERLAPPED;&
对于串行口仅hEvent成员有效,其于成员必须为0。
COMMTIMEOUTS&
DWORD&ReadThread((LPDWORD&lpdwParam)
BYTE&inbuff[100];
DWORD&nRytesRead,endtime,
static&OVERLAPPED&o;
if(!cp.dwProvCapabilities&&&PCF_TOTALTIMEOUTS)
return&1L;
memset(&to,0,sizeof(to));
to.ReadTotalTimeoutMultiplier&=&5;
to.ReadTotalTimeoutConstant&=&1000;
SetCommTimeouts(hComm,&to);
o.hEvent&=&CreateEvent(NULL,TRUE,FALSE,NULL);
while(bReading)
if(!ReadFile(hComm,inbuff,10,&nBytesRead,&o))
nBytesRead&=&0;
if(lrc=GetLastError()&==&ERROR_IO_PENDING)
endtime&=&GetTickCount()&+&1000;
while(!GetOverlappedResult(hComm,&o,&nBytesRead,FALSE))
if(GetTickCount()&&&endtime)&
if(nBytesRead)&locProcessBytes(inbuff,nBytesRead);
if(nBytesRead)&locProcessBytes(inbuff,nBytesRead);
ResetEvent(o.hEvent);
PurgeComm(hComm,PURGE_RXCLEAR);
return&0L;
这一例程是对一开始读缓冲区就读到所需的字节时的处理:
while(bReading)
if(!ReadFile(hComm,inbuff,10,&nBytesRead,&o))
if((lrc=GetLastError())&==ERROR_IO_PENDING)
if(GetOverlappedResult(hComm,&o,&nBytesRead,TRUE))
if(nBytesRead)
locProcessBytesa(inbuff,nBytesRead);
locProcessCommError(GetLastError());
locProcessCommError(GetLastError));
if(nBytesRead)&locProcessBytes(inbuff,nBytesRead);
ResetEvent(o.hEvent);
13.事件驱I/O读写:
GetCommMask(hComm,&dwMask)
Windows&95报告给应用程序的事件由此方法返回。
SetCommMasl(hComm,&dwMask)
添加或修改Windows&95所报告的事件列表。
事件掩码如下:
EV_BREAK&检测到输入为止
EV_CTS&CTS(清除发送)信号改变状态
EV_DSR&DSR(数据设置就绪)信号改变状态
EV_ERR&发生了线路状态错误.
线路状态错误为:
CE_FRAME(帧错误)
CE_OVERRUN(接收缓冲区超限)
CE_RXPARITY(奇偶校验错误)
EV_RING&检测到振铃
EV_RLSD&RLSD(接收线路信号检测)信号改变状态
EV_EXCHAR&接收到一个字符,并放入输入缓冲区
EV_RXFLAG&接收到事件字符(DCB成员的EvtChar成员),度放入输入缓冲区
EV_TXEMPTY&输出缓冲区中最后一个字符发送出去
在用SetCommMask指定了有用的事件后,应用程序可调用WaitCommEvent()来等
待事件发生.
BOOL&WaitCommEvent(
HANDLE&hFile,&//&handle&of&communications&device&
LPDWORD&lpEvtMask,&//&address&of&variable&for&event&that&occurred&
LPOVERLAPPED&lpOverlapped,&//&address&of&overlapped&structure&
此方法可以以同步或异步方式操作
COMMTIMEOUTS&
DWORD&ReadTherad(LPDWORD&lpdwParam)
BYTE&binbuff[100];
DWORD&nBytesRead,dwEvent,dwE
SetCommMask(hComm,EV_RXHAR);
while(bReading)
if(WaitCommEvent(hComm,&dwEvent,NULL))
ClearCommError(hComm,&dwError,&cs);
if((dwEvent&EV_RXCHAR)&&cs.cbInQue)
if(!ReadFile(hComm,inbuff,cs.cbInQue,&nBytesRead,NULL)
locProcessCommError(GetLastError());
if(nByteRead)
locProcessBytes(inbuff,nBytesRead);
locProcessCommError(GetLastError());
PurgeComm(hComm,PURGE_RXCLEAR);
return&0L;
NOTE:&SetCommMask(hComm,0)可使WaitCommEvent()中止.
可使用GetCommmodemStatus()方法,例程:
if(cp.dwProvCapabilities&PCF_RTSCTS)
SetCommMask(hComm,EV_CTS);
WaitCommEvent(hComm,&dwMask,NULL);
if(dwMask&EV_CTS)
GetCommModemStatus(hComm,&dwStatus)
if(dwStatus&MS_CTS_ON)&/*&CTS&stransition&OFF-ON&*/
else&/*&CTS&stransition&ON-OFF&*/
MS_CTS_ON&CTS为ON
MS_DSR_ON&DSR为ON
MS_RING_ON&RING为ON
MS_ELSD_ON&RLSD为ON
当发生错误时应用方法ClearCommError(hComm,&dwErrorMask,&constat)
得到错误掩码。
CE_BREAK&中止条件
CE_FRAME&帧错误
CW_IOE&一般I/O错误,常伴有更为详细的错误标志
CE_MODE&不支持请求的模式
CE_OVERRUN&缓冲区超限下一个字符将丢失
CE_RXOVER&接收缓冲区超限
CE_RXPARITY&奇偶校验错误
CE_TXFULL&发送缓冲区满&
CE_DNS&没有选择并行设备
CE_PTO&并行设备发生超时&
CE_OOP&并行设备缺纸
15.控制命令
EscapeCommFunction()可将硬件信号置ON或OFF,模拟XON或XOFF
BOOL&EscapeCommFunction(
HANDLE&hFile,&//&handle&to&communications&device&
DWORD&dwFunc&//&extended&function&to&perform&
dwFunc的有效值(可用‘|’同时使用多个值)
CLRDTR&DTR置OFF
CLRRTS&RTS置OFF
SETDTR&STR置ON
SETRTS&TRS置ON
SETXOFF&模拟XOFF字符的接收
SETXON&模拟XON字符的接收
SETBREAK&在发送中产生一个中止
CLRBREAK&在发送中清除中止 &
阅读(2090)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_085074',
blogTitle:'Windows API串口通讯的一些注意问题',
blogAbstract:'&\r\n 16:32\r\n\r\n\r\n\r\n\r\n\r\n信息来自Internet\r\n8:43 “9600,n,8,1”的问题?BuildCommDCB的功能是把一个字符串如com1:9600,n,8,1这样的转换到具体的数据填写到DCB中,但使用中也存在问题,我发现我用它转换象com1:9600,e,7,1 之类的带校验位的字符串,它总是无法把这个e给我转换过去,设置好串口一看,成了9600,n,7,1,而上面提到的CommConfigDialog返回的结果用来设置串口却是正确的,经过比较,发现问题出在DCB.fbits.fParity这个bit上,',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:8,
publishTime:1,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}关于单片机串口通信的问题_百度拇指医生
&&&网友互助
?关于单片机串口通信的问题
拇指医生提醒您:该问题下为网友贡献,仅供参考。
我想让单片机发送一个字符串让PC的串口助手接收,但是一直不成功,下面是我的代码,有两个问题,烧写下面的程序到板子后,无法向电脑发送字符串,用示波器检测TXD引脚能输出方波信号,但是特别不稳定,一直是闪烁,看不清程序中的delay函数不起作用,无论放哪,无论怎么改变delay的值延迟都不受影响,这是什么原因啊,要怎么修改才能成功发送字符串到电脑啊,下面有硬件图,连线应该没有错,晶振在背面,点亮LED之类的都可以,谢谢大家#include&reg52.h&#include&stdio.h&#define uchar unsigned char#define uint unsigned intuchar idata trdata[10]={&Wang\n\a\0&};sbit led=P1^7;void delay(uint);void main(){
TMOD=0x20;
// timer 1, 8-bit auto-reload
// reload value for 9600 baud
SCON=0x50;
// mode 1, 8-bit UART
PCON=0x00;
// start timer
RI=0; // P3=0;
// LED=0;
while(trdata[i]!=0)
//transmit string
SBUF=trdata[i];
// put the uchar in SBUF register
while(TI==0)
// wait until transmitted
delay(500);
}void delay(uint time) {
uint s,j,k;
for(s=5;s&0;s--)
for(j=4;j&0;j--)
for(k=248;k&0;k--); }
没看到原理图,不好说!!/*------------------------------------------------------------------*//* --- STC MCU Limited ---------------------------------------------*//* --- STC89-90xx Series MCU UART (8-bit/9-bit)Demo ----------------*//* --- Mobile: (86) -------------------------------------*//* --- Fax: 86-755- ----------------------------------------*//* --- Tel: 86-755- ----------------------------------------*//* --- Web:
-----------------------------------------*//* If you want to use the program or the program referenced in the
*//* article, please specify in which data and procedures from STC
*//*------------------------------------------------------------------*/#include &reg51.h&#include &intrins.h&typedef unsigned char BYTE;typedef unsigned int WORD;#define FOSC L
//System frequency#define BAUD 9600
//UART baudrate/*Define UART parity mode*/#define NONE_PARITY
//None parity#define ODD_PARITY
//Odd parity#define EVEN_PARITY
//Even parity#define MARK_PARITY
//Mark parity#define SPACE_PARITY
//Space parity#define PARITYBIT EVEN_PARITY
//Testing even paritysbit bit9 = P2^2;
//P2.2 show UART data bit9void SendData(BYTE dat);void SendString(char *s);void main(){#if (PARITYBIT == NONE_PARITY)
SCON = 0x50;
//8-bit variable UART#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
//9-bit variable UART, parity bit initial to 1#elif (PARITYBIT == SPACE_PARITY)
SCON = 0xd2;
//9-bit variable UART, parity bit initial to 0#endif
TMOD = 0x20;
//Set Timer1 as 8-bit auto reload mode
TH1 = TL1 = -(FOSC/12/32/BAUD); //Set auto-reload vaule
//Timer1 start run
//Enable UART interrupt
//Open master interrupt switch
SendString(&STC89-90xx\r\nUart Test !\r\n&);
while(1);}/*----------------------------UART interrupt service routine----------------------------*/void Uart_Isr() interrupt 4 using 1{
//Clear receive interrupt flag
P0 = SBUF;
//P0 show UART data
bit9 = RB8;
//P2.2 show parity bit
//Clear transmit interrupt flag
//Clear transmit busy flag
}}/*----------------------------Send a byte data to UARTInput: dat (data to be sent)Output:None----------------------------*/void SendData(BYTE dat){
while (busy);
//Wait for the completion of the previous data is sent
//Calculate the even parity bit P (PSW.0)
//Set the parity bit according to P
{#if (PARITYBIT == ODD_PARITY)
//Set parity bit to 0#elif (PARITYBIT == EVEN_PARITY)
//Set parity bit to 1#endif
{#if (PARITYBIT == ODD_PARITY)
//Set parity bit to 1#elif (PARITYBIT == EVEN_PARITY)
//Set parity bit to 0#endif
SBUF = ACC;
//Send data to UART buffer}/*----------------------------Send a string to UARTInput: s (address of string)Output:None----------------------------*/void SendString(char *s){
while (*s)
//Check the end of the string
SendData(*s++);
//Send current char and increment string ptr
}}这个是串口通讯的程序。。。。STC单片机的,,,51的基本都行!
向医生提问
完善患者资料:*性别:
为您推荐:
您可能关注的推广
* 百度拇指医生解答内容由公立医院医生提供,不代表百度立场。
* 由于网上问答无法全面了解具体情况,回答仅供参考,如有必要建议您及时当面咨询医生}

我要回帖

更多关于 怎么检测串口通不通 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信