关于串口通信的问题! 我想从一个串口读取数据,改怎么办? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Serial Communications in Win32在msdn里搜一下,主要是些文件读写操作,不是很难 用APIZComm::open(char *szPort,int Baud_rate, BOOL overlapped){ int retbuflength=0; if (overlapped) { //异步方式打开串口 memset( &READ_OS, 0, sizeof( OVERLAPPED ) ) ; memset( &WRITE_OS, 0, sizeof( OVERLAPPED ) ) ; READ_OS.hEvent = CreateEvent( NULL, // no security TRUE, // explicit reset req FALSE, // initial event reset NULL ) ; // no name if (READ_OS.hEvent == NULL) return -1 ; WRITE_OS.hEvent = CreateEvent( NULL, // no security TRUE, // explicit reset req FALSE, // initial event reset NULL ) ; // no name if (NULL == WRITE_OS.hEvent) { CloseHandle( READ_OS.hEvent ) ; return -1 ; } idComDev=CreateFile( szPort, GENERIC_READ | GENERIC_WRITE, 0, // exclusive access NULL, // no security attrs OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL| FILE_FLAG_OVERLAPPED, // overlapped I/O NULL ); olap=TRUE; } //同步方式打开串口 else idComDev=CreateFile( szPort, GENERIC_READ | GENERIC_WRITE, 0, // exclusive access NULL, // no security attrs OPEN_EXISTING, 0, //is overlapped or no NULL ); if (idComDev==(HANDLE) -1){ DWORD RR=GetLastError(); CloseHandle(idComDev) ; if (olap){ CloseHandle( READ_OS.hEvent ) ; CloseHandle( WRITE_OS.hEvent ) ; } fCOMMOpened=0; olap=FALSE; return (0); } set_baudrate(Baud_rate); fCOMMOpened=1; SetupComm(idComDev,11520,2048); PurgeComm(idComDev, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ) ; SetCommMask(idComDev, EV_RXFLAG ); //set time out SetTimeOut(10,50,200); return (1);}BOOL ZComm::SetTimeOut(DWORD ReadIntervalTimeout, DWORD ReadTotalTimeoutMultiplier, DWORD ReadTotalTimeoutConstant){ COMMTIMEOUTS timeouts; GetCommTimeouts(idComDev,&timeouts); timeouts.ReadIntervalTimeout=ReadIntervalTimeout; timeouts.ReadTotalTimeoutMultiplier=ReadTotalTimeoutMultiplier; timeouts.ReadTotalTimeoutConstant=ReadTotalTimeoutConstant; return SetCommTimeouts(idComDev,&timeouts);}ZComm::Close(){ if (fCOMMOpened==1) { fCOMMOpened=0; CloseHandle(idComDev) ; olap=FALSE; if (olap){ CloseHandle( READ_OS.hEvent ) ; CloseHandle( WRITE_OS.hEvent ) ; } return 1; } return 0; }int ZComm::set_baudrate(int baud_rate){ DCB dcb; BOOL fsuccess; fsuccess = GetCommState(idComDev, &dcb); if (!fsuccess) return 0; dcb.BaudRate =baud_rate; dcb.ByteSize =8; //number of bits/byte, 4-8 dcb.Parity =NOPARITY; dcb.StopBits =ONESTOPBIT; dcb.EvtChar=0x02; /* dcb.fOutxCtsFlow = 1; dcb.fDtrControl = 1; dcb.fRtsControl = 2; dcb.EofChar = 0; */ dcb.fOutxCtsFlow = 0; dcb.fDtrControl = 0; dcb.fRtsControl = 2; dcb.EofChar = 26; //dcb.fNull=TRUE; fsuccess=SetCommState(idComDev, &dcb); if (!fsuccess) return 0; return 1;}// USE BY READSTREAM()//DWORD ZComm::ReadByte(BYTE * buf){ OVERLAPPED os; BOOL fReadStat; DWORD dwEvtMask; DWORD dwErrorFlags; COMSTAT ComStat; DWORD dwLength; if (fCOMMOpened==0) return 0; //串口未打开 if (olap) // OVERLAPPED { SetCommMask(idComDev, EV_RXCHAR ); memset( &os, 0, sizeof( OVERLAPPED )); os.hEvent = CreateEvent( NULL, // no security TRUE, // explicit reset req FALSE, // initial event nonsignaled. NULL ) ; // no name if (os.hEvent == NULL) { OutputDebugString("\n\r Failed to create event for ReadByte"); CloseHandle(os.hEvent); return 0; } dwEvtMask = 0 ; WaitCommEvent(idComDev,&dwEvtMask,&os); if (WaitForSingleObject(os.hEvent,MAXTIMEOUT)==WAIT_TIMEOUT) { OutputDebugString("\n\r time out for ReadByte"); CloseHandle(os.hEvent); return 0; } if ((dwEvtMask & EV_RXCHAR) == EV_RXCHAR) { ClearCommError(idComDev, &dwErrorFlags, &ComStat); dwLength = max(1,ComStat.cbInQue); //dwLength=1; fReadStat = ReadFile( idComDev,buf,dwLength,&dwLength, &READ_OS); if (!fReadStat) { OutputDebugString("\n\r can not Read Byte"); CloseHandle(os.hEvent); return 0; } else{ CloseHandle(os.hEvent); return dwLength; } } else{ CloseHandle(os.hEvent); return 0; } } else{ //NOT OVERLAPPED dwLength=0; ReadFile(idComDev,buf,1,&dwLength, &READ_OS); return dwLength; }} 完成端口的WSARecv 问个不知道的技术名字 初始化列表中用到this,有什么后果 关于IOCP,Microsoft Win32 SDK里面的例子,有地方不明白,高手指教 可以远程查看别人的注册表吗? 如何实现拖动下载? MDI窗口的问题 为什么不能显示文字 各位高手,你们好,请问如何能得到应用程序中的数据,详细问题如下。 win32窗体程序,一运行一闪而过,是什么原因怎么解决? 请高手指教 请教如何判断USB 是1.0还是2.0?
在msdn里搜一下,主要是些文件读写操作,不是很难
ZComm::open(char *szPort,int Baud_rate, BOOL overlapped)
{
int retbuflength=0;
if (overlapped) { //异步方式打开串口
memset( &READ_OS, 0, sizeof( OVERLAPPED ) ) ;
memset( &WRITE_OS, 0, sizeof( OVERLAPPED ) ) ; READ_OS.hEvent = CreateEvent( NULL, // no security
TRUE, // explicit reset req
FALSE, // initial event reset
NULL ) ; // no name
if (READ_OS.hEvent == NULL) return -1 ;
WRITE_OS.hEvent = CreateEvent( NULL, // no security
TRUE, // explicit reset req
FALSE, // initial event reset
NULL ) ; // no name
if (NULL == WRITE_OS.hEvent)
{
CloseHandle( READ_OS.hEvent ) ;
return -1 ;
}
idComDev=CreateFile( szPort, GENERIC_READ | GENERIC_WRITE,
0, // exclusive access
NULL, // no security attrs
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL|
FILE_FLAG_OVERLAPPED, // overlapped I/O
NULL );
olap=TRUE;
} //同步方式打开串口
else idComDev=CreateFile( szPort, GENERIC_READ | GENERIC_WRITE,
0, // exclusive access
NULL, // no security attrs
OPEN_EXISTING,
0, //is overlapped or no
NULL );
if (idComDev==(HANDLE) -1){
DWORD RR=GetLastError();
CloseHandle(idComDev) ;
if (olap){
CloseHandle( READ_OS.hEvent ) ;
CloseHandle( WRITE_OS.hEvent ) ;
}
fCOMMOpened=0;
olap=FALSE;
return (0);
}
set_baudrate(Baud_rate);
fCOMMOpened=1;
SetupComm(idComDev,11520,2048);
PurgeComm(idComDev, PURGE_TXABORT | PURGE_RXABORT |
PURGE_TXCLEAR | PURGE_RXCLEAR ) ;
SetCommMask(idComDev, EV_RXFLAG );
//set time out
SetTimeOut(10,50,200);
return (1);
}BOOL ZComm::SetTimeOut(DWORD ReadIntervalTimeout,
DWORD ReadTotalTimeoutMultiplier,
DWORD ReadTotalTimeoutConstant)
{
COMMTIMEOUTS timeouts; GetCommTimeouts(idComDev,&timeouts);
timeouts.ReadIntervalTimeout=ReadIntervalTimeout;
timeouts.ReadTotalTimeoutMultiplier=ReadTotalTimeoutMultiplier;
timeouts.ReadTotalTimeoutConstant=ReadTotalTimeoutConstant;
return SetCommTimeouts(idComDev,&timeouts);
}ZComm::Close()
{
if (fCOMMOpened==1) {
fCOMMOpened=0;
CloseHandle(idComDev) ;
olap=FALSE;
if (olap){
CloseHandle( READ_OS.hEvent ) ;
CloseHandle( WRITE_OS.hEvent ) ;
}
return 1;
}
return 0;
}int ZComm::set_baudrate(int baud_rate)
{
DCB dcb;
BOOL fsuccess;
fsuccess = GetCommState(idComDev, &dcb);
if (!fsuccess) return 0;
dcb.BaudRate =baud_rate;
dcb.ByteSize =8; //number of bits/byte, 4-8
dcb.Parity =NOPARITY;
dcb.StopBits =ONESTOPBIT;
dcb.EvtChar=0x02;
/*
dcb.fOutxCtsFlow = 1;
dcb.fDtrControl = 1;
dcb.fRtsControl = 2;
dcb.EofChar = 0;
*/
dcb.fOutxCtsFlow = 0;
dcb.fDtrControl = 0;
dcb.fRtsControl = 2;
dcb.EofChar = 26;
//dcb.fNull=TRUE; fsuccess=SetCommState(idComDev, &dcb);
if (!fsuccess) return 0; return 1;
}// USE BY READSTREAM()
//
DWORD ZComm::ReadByte(BYTE * buf)
{
OVERLAPPED os;
BOOL fReadStat;
DWORD dwEvtMask;
DWORD dwErrorFlags;
COMSTAT ComStat;
DWORD dwLength; if (fCOMMOpened==0) return 0; //串口未打开 if (olap) // OVERLAPPED
{
SetCommMask(idComDev, EV_RXCHAR );
memset( &os, 0, sizeof( OVERLAPPED ));
os.hEvent = CreateEvent( NULL, // no security
TRUE, // explicit reset req
FALSE, // initial event nonsignaled.
NULL ) ; // no name
if (os.hEvent == NULL) {
OutputDebugString("\n\r Failed to create event for ReadByte");
CloseHandle(os.hEvent);
return 0;
}
dwEvtMask = 0 ;
WaitCommEvent(idComDev,&dwEvtMask,&os);
if (WaitForSingleObject(os.hEvent,MAXTIMEOUT)==WAIT_TIMEOUT)
{
OutputDebugString("\n\r time out for ReadByte");
CloseHandle(os.hEvent);
return 0;
}
if ((dwEvtMask & EV_RXCHAR) == EV_RXCHAR)
{
ClearCommError(idComDev, &dwErrorFlags, &ComStat);
dwLength = max(1,ComStat.cbInQue);
//dwLength=1;
fReadStat = ReadFile( idComDev,buf,dwLength,&dwLength, &READ_OS);
if (!fReadStat)
{
OutputDebugString("\n\r can not Read Byte");
CloseHandle(os.hEvent);
return 0;
}
else{
CloseHandle(os.hEvent);
return dwLength;
}
}
else{
CloseHandle(os.hEvent);
return 0;
}
}
else{ //NOT OVERLAPPED
dwLength=0;
ReadFile(idComDev,buf,1,&dwLength, &READ_OS);
return dwLength;
}
}