串行通讯问题糟糕,我手头没有WIN3.2下的串口程序。倒是可以随便在什么杂志上抄下来给你,OPENCOM,CLOSECOM之类。可是毕竟没有亲自试过...要不,你把你的历经磨炼的程序MAIL给我,让我填满这个空格? 在95下,BC与VC稍有不同了。下面这个BC下的程序是 老狐狸的: int main() { HANDLE HdComm; DWORD DwError; DCB Dcb; unsigned char Msg[128], Data; int RealNum; // Open the COMM port. HdComm = CreateFile( "COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL ); if ( HdComm == (COMMPORT)0xFFFFFFFF ) // If COMM port can't be opened, then ... { DwError = GetLastError(); // Display error code, and abort. FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM, 0, DwError, 0, Msg, 124, 0 ); printf( "Cannot Open Port COM1 !\nError Code: %d, - %s.\n", DwError, Msg ); return; } // Initialize COMM port. SetupComm( HdComm, 1024, 1024 ); GetCommState( HdComm, &Dcb ); Dcb.BaudRate = BAUD_115200; Dcb.Parity = NOPARITY; Dcb.ByteSize = 8; Dcb.StopBits = ONESTOPBIT; SetCommState( HdComm, &Dcb ); do { ReadFile( HdComm, &Data, 1, &RealNum, NULL ); // Recieve the char from COM1 WriteFile( HdComm, &Data, 1, &RealNum, NULL ); // Write the recieved data to COM1 printf( "%02x ", Data ); // Display the data } while( Data != 0x1b ); // Loop until the data is ESC CloseHandle( HdComm ); return 0; }这个程序段的作用是调用CreateFile()打开串口1,用SetCommState()设置通讯参数 (115200bps,无校验,8-bit字长,1-bit停止位),然后循环读/写串行口,接收数据采用ReadFile(),发送数据采用WriteFile(),当接收到的数据为ESC字符(ASCII码为0x1b)时,退出循环,最后调用CloseHandle()关闭串行口。 注意本程序作为Win32 Console程序编译(因其使用了printf这样的控制台函数)。 运行本程序之后,在另一台计算机上运行WIN95的“超级终端”,设置通讯参数为115200bps,无校验,8-bit字长,1-bit停止位,并关闭 “终端仿真参数”中的“本地回显”。在超级终端中键入字符,终端窗口中会显示键入的字符,同时运行演示程序的计算机屏幕上显示键入字符的ASCII代码。 下面是比较完整的VC 下的某个类的成员,你一看就知道应该如何把它加到你程序中。 /*-------------------------Private function.----------------*/ // Function name : TEMP::InitComm // Description : Initial Comm Port. // Return type : BOOL :TRUE if success // Argument : LPVOID lpInitData:a point to COMM_CONFIG structure. // COMM_CONFIG: deviceName="COM2",stopBits=1,BaundRates="9600",dataBits=7,parity=2 BOOL TEMP::InitComm(LPVOID lpInitData) { char szPort[8]; ComDevice *pCommConfig = (ComDevice *)lpInitData; m_nTimeOut = pCommConfig->timeOut; strcpy(szPort,pCommConfig->deviceName);//"COM2" HANDLE hComm = CreateFile( szPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL /*| FILE_FLAG_OVERLAPPED*/, NULL ); if ( INVALID_HANDLE_VALUE==hComm ) return FALSE; int errorCode = SetupComm( hComm, RX_QUEU, TX_QUEU ); DWORD temp; if( errorCode == 0 ) temp=GetLastError(); BYTE stopbits; switch ( pCommConfig->stopBits ) { // 0=1stopbit, 1=1.5stopbits, 2=2stopbits. case 1: stopbits = 0; break; case 2: stopbits = 2; break; default: stopbits = 0; } DCB dcb; GetCommState( hComm, &dcb ); dcb.BaudRate = (DWORD)pCommConfig->baudRate; dcb.ByteSize = (BYTE)pCommConfig->dataBits; dcb.StopBits = stopbits;// dcb.fParity=!(pCommConfig->parity == 0); dcb.Parity = (BYTE)pCommConfig->parity; // dcb.ExChar = FALSE; if ( !SetCommState(hComm, &dcb ) ) { temp = GetLastError(); //6 The handle isinvalid. ERROR_INVALID_HANDLE CloseHandle( hComm ); TRACE( "Error in SetCommDcb.\n" ); ASSERT( FALSE); m_nLastErrorCode = USER_VAR_DCB_ERROR; return FALSE; } DWORD flag; flag = EV_RXCHAR; SetCommMask( hComm, flag|EV_BREAK ); VERIFY(PurgeComm(hComm, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR)); COMMTIMEOUTS CommTimeOuts; CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF; CommTimeOuts.ReadTotalTimeoutMultiplier= 0 ; CommTimeOuts.ReadTotalTimeoutConstant = 0 ; CommTimeOuts.WriteTotalTimeoutMultiplier = 10; //2*CBR_9600/BAUDRATE( npTTYInfo ) ; CommTimeOuts.WriteTotalTimeoutConstant = 0 ; if(SetCommTimeouts( hComm, &CommTimeOuts ) = = 0) {//FAILS! TRACE("SetCommTimeouts Fail!\n"); m_nLastErrorCode = GetLastError(); return FALSE; } m_hComm = hComm; return TRUE; } // /* Function name : TEMP::PhysicalSend // Description : Send from Comm Port // Return type : int : how many bytes has been send(in byte) // -1 if failed. Argument : char * buf:Buffer for send date. // Argument : int nLen:Lengh of data in Buffer. int */ TEMP::PhysicalSend(char * buf, int nLen) { if ( nLen < =0 ) return 1; char *pData="new" char[nLen+2]; memcpy( pData, buf, nLen ); pData[nLen]="0;"; ULONG nSend="0;"; if(!WriteFile(m_hComm, pData, nLen, &nSend, NULL)) { delete[] pData; m_nLastErrorCode="GetLastError();" return 1; //1121 A serial I/O operation completed because //the time-out period expired. //(The IOCTL_SERIAL_XOFF_COUNTER did not reach zero.) } #ifdef _DEBUG pData[nLen]="0;" #endif delete[] pData; return (int)nSend; } // Function name : TEMP::PhysicalReceive // Description : Check if there's data in Serial Port. If yes, receive. // Return type : BOOL :TRUE:received. // FALSE:No data, or error. // Argument : char * pReceive:Point to Receive Buffer. // Argument : int & nLen:Lengh (return) BOOL TEMP::PhysicalReceive(char * pReceive, int & nLen) { DWORD dwError; COMSTAT cs; ULONG nByteRead="0;" ClearCommError( m_hComm, &dwError, &cs ); int errorcode; if ( cs.cbInQue ) { BOOL bReadSuc= "ReadFile(m_hComm," pReceive, cs.cbInQue, &nByteRead, NULL); if ( bReadSuc &&nByteRead>0 ) { nLen = (int) nByteRead; return TRUE; } } errorcode=GetLastError();//debug // TRACE("PhysicalReceive ERROR!\n"); return FALSE; }至于关闭串口只是OpenHandle(hComm)一句而已。 |
Copyright 1998-2002 Fadshop.net, Inc. All rights reserved. jhj123@163.net |