|
Tài trợ cho PIC Vietnam |
Giao tiếp cổng COM và LPT RS232, RS485 và LPT là những giao tiếp cơ bản và kinh điển khi mới học về vi điều khiển... |
|
Ðiều Chỉnh | Xếp Bài |
20-03-2008, 04:33 PM | #1 |
Đệ tử 1 túi
Tham gia ngày: Jan 2007
Bài gửi: 16
: |
Giao tiếp qua COM,RS232 bằng VC++6.0,EVC++4.0...
em đang làm 1 project nhỏ mà chưa biết làm tiếp như nào mong anh em chỉ giáo thêm :
Đây là chương trình mở cổng COM : /Opening and Configuring Serial Ports void CSerialPort::Open() { //Windows CE doesn't support overlapped I/O for devices, so you can't pass the FILE_FLAG_OVERLAPPED flag in the dwFlagsAndAttributes parameter //The handle returned is either the handle to the opened serial port or INVALID_HANDLE_VALUE. Remember that, unlike many of the Windows functions, //CreateFile doesn't return a 0 for a failed open. m_PortHandle = CreateFile (TEXT ("COM1:"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if (m_PortHandle != INVALID_HANDLE_VALUE) { AfxMessageBox(TEXT("Serial port could not be opened. Wrong port number?"), MB_OK); m_PortHandle = NULL; return; // error opening com port } else //example turns off all flow control (such as XON/XOFF, CTS/RTS, and DSR/DTR) and sets the baud rate, data bits, //and parity settings from the m_strBaud command string: { DCB dcb; CString s; dcb.DCBlength = sizeof(dcb); // controlling the serial Port //start a serial stream SetCommState(m_PortHandle, &dcb); //setting dcb.BaudRate = CBR_115200; dcb.Parity = EVENPARITY; dcb.ByteSize = 8; dcb.StopBits = ONESTOPBIT; //The fParity field can be set to TRUE to enable parity checking. dcb.fParity = false; //The fDsrSensitivity field is set to TRUE, and the serial port //ignores any incoming bytes unless the port DSR line is enabled dcb.fDsrSensitivity = false; //The fOutxCtsFlow field should be set to TRUE if the output of the serial port should be //controlled by the port CTS line dcb.fOutxCtsFlow = true; //The fOutxDsrFlow field should be set to TRUE if the output of the serial port should be //controlled by the DSR line of the serial port dcb.fOutxDsrFlow = false; //Setting the fOutX field to TRUE specifies that the XON/XOFF control is used to control the serial output. //Setting the fInX field to TRUE specifies that the XON/XOFF control is used for the input serial stream. dcb.fInX = false; dcb.fOutX = false; //Setting the fTXContinueOnXoff field to TRUE tells the driver to stop transmitting characters if its receive //buffer has reached its limit and the driver has transmitted an XOFF character dcb.fTXContinueOnXoff = false; //The fDtrControl field can be set to one of three values: DTR_CONTROL_DISABLE, //which disables the DTR (Data Terminal Ready) line and leaves it disabled; DTR_CONTROL_ENABLE, //which enables the DTR line; or DTR_CONTROL_HANDSHAKE, which tells the serial driver to toggle //the DTR line in response to how much data is in the receive buffer. dcb.fDtrControl = DTR_CONTROL_DISABLE; //DTR and RTS 0 dcb.fRtsControl = RTS_CONTROL_DISABLE; //stop a serial stream //parameter for both these functions is the handle to the opened COM port //When SetCommBreak is called, the COM port stops transmitting characters //and places the port in a break state. Communication is resumed with the ClearCommBreak function. //dcb.XonChar = EV_RXFLAG; dcb.fAbortOnError = false; dcb.fNull = true; //tells the serial driver to discard null bytes received. GetCommState(m_PortHandle, &dcb); if (SetCommState(m_PortHandle, &dcb) == 0) { AfxMessageBox(TEXT("Serial port could not be initialized. Error while setting communication state."), MB_OK); CloseHandle(m_PortHandle); m_PortHandle = NULL; return; // error opening com port } //////////////////////////////////////// // do tim xac dinh toc do truyen //The configuration functions enable you to configure the serial driver, but with varied implementations //of serial ports you need to know just what features a serial port supports before you configure it. The //function GetCommProperties provides just this service // GetCommProperties (m_PortHandle, LPCOMMPROP lpCommProp); //Setting the Port Timeout Values //ReadFile returns immediately regardless of whether there is data to be read. //Set ReadIntervalTimeout to MAXDWORD. Set ReadTotalTimeoutMultiplier //and ReadTotalTimeoutConstant to 0. COMMTIMEOUTS touts; touts.ReadIntervalTimeout = 100; touts.ReadTotalTimeoutMultiplier = MAXDWORD; touts.ReadTotalTimeoutConstant = 50; touts.ReadIntervalTimeout =MAXDWORD; touts.WriteTotalTimeoutConstant = 100; touts.WriteTotalTimeoutMultiplier = 100; //ReadFile doesn't have a timeout. The function doesn't return until the proper number //of bytes is returned or an error occurs. Set ReadIntervalTimeout, //ReadTotalTimeoutMultiplier, and ReadTotalTimeoutConstant to 0. if (SetCommTimeouts(m_PortHandle, &touts)==0) //Set communication timeouts { AfxMessageBox(TEXT("Serial port could not be initialized. Error while setting communication timeouts."), MB_OK); CloseHandle(m_PortHandle); m_PortHandle = NULL; return; // error opening com port } SetCommMask (m_PortHandle, EV_CTS | EV_DSR | EV_RING | EV_RLSD); //Controlling the Serial Port //You can stop and start a serial stream using the following functions SetCommBreak(m_PortHandle); ClearCommBreak(m_PortHandle); //You can clear out any characters in either the transmit or receive queues internal to //the serial driver using this function: //Since Windows CE doesn't support overlapped I/O, the flags PURGE_TXABORT and PURGE_RXABORT, //used under Windows NT and Windows 98, are ignored. PurgeComm(m_PortHandle, PURGE_TXABORT | PURGE_RXABORT); ///Clearing Errors and Querying Status // ClearCommError (m_PortHandle, CE_OVERRUN ,COMSTAT); // return TRUE; } //else // { // return FALSE; // Use GetLastError() to know the reason // } } // Dong cong void CSerialPort::Close() { if (m_PortHandle != INVALID_HANDLE_VALUE) { CloseHandle(m_PortHandle); m_PortHandle = INVALID_HANDLE_VALUE; } } //// Reading and Writing to a Serial Port DWORD CSerialPort::Read(LPVOID Buffer, DWORD BufferSize) { INT rc; DWORD Res(0); if (m_PortHandle != INVALID_HANDLE_VALUE) { rc = ReadFile(m_PortHandle, Buffer, BufferSize, &Res, NULL); if () { } } return Res; } DWORD CSerialPort::Write(LPVOID Buffer, DWORD BufferSize) { INT rc; DWORD Res(0); if (m_PortHandle != INVALID_HANDLE_VALUE) { rc = WriteFile(m_PortHandle, Buffer, BufferSize, &Res, NULL); } return Res; } //The difference between TransmitCommChar and WriteFile is that TransmitCommChar puts // the character to be transmitted at the front of the transmit queue. When you call WriteFile, //the characters are queued up after any characters that haven't yet been transmitted by the serial //driver. TransmitCommChar allows you to insert control characters quickly in the stream without // having to wait for the queue to empty. DWORD CSerialPort::Transmit(LPVOID Buffer, char cChar) { INT rc; DWORD Res(0); if (m_PortHandle!= INVALID_HANDLE_VALUE) { rc =TransmitCommChar(m_PortHandle,cChar); } return Res; } /////////////////////////////////////// |
|
|