PIC Vietnam

Go Back   PIC Vietnam > Truyền thông > Giao tiếp cổng COM và LPT

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Tìm Kiếm Bài Trong Ngày Ðánh Dấu Ðã Ðọc Vi điều khiển

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
Prev Previous Post   Next Post Next
Old 20-03-2008, 04:33 PM   #1
vuthuanbkvn
Đệ 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;
}
///////////////////////////////////////
__________________
Vũ Hồng Thuấn
0983122739
http://www.bkcdt1.com/cdt/index.php
vuthuanbkvn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
 

Ðiều Chỉnh
Xếp Bài

Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 08:25 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam