RS232_c++

来源:互联网 发布:阿里云3306端口 编辑:程序博客网 时间:2024/05/18 02:18

Introduction

The purpose of this article is to describe how to interface toserial port on Win32. The serial port can be implemented by severaltechniques such as ActiveX, access I/O and file operation. This articleexplains the use of serial port on Win32 platform by file operationtechnique. The programmer can use kernel32.lib library thatis provided with the Microsoft Visual C++ Version 6.0. In MicrosoftWindows (2000, Me, XP and 95/98), serial port can be treated as a file.Therefore it's possible to open a serial port by using Windowsfile-creating function.

This article explains not only about serial port communication butalso how to implement multi-tasking that can apply with our project"serial port" application. The reason why the software (serialcommunication) will be implemented with multi-tasking method is thatthe serial communication application has to handle work with more thanone task at the same time. For example data-reading task, data-sendingtask, GUI task etc.

These topics describe the basic operation of interfacing a serial port on Win32:

Initial/Open serial port communication.

  • Creating a port handle
  • Restoring a configuration (DCB)
  • Modifying a configuration
  • Storing a configuration
  • Setting a Time-Out communication

Receive/Send data

  • Sending data
  • Receiving data
  • Closing a serial port

Design approach

Initial/Open serial port

The first step in opening a serial port is initiation or setting aserial port's configuration. The purpose of this is to create theserial port agent. All throughout the article we are going to use afile handle as serial port agent.

Creating a port handle

The serial port's handle is a handle that can be used to access theobject of serial port. The function that is used to create the serialport handle is the CreateFile function. The following code shows the function that is used to create a handle:

Collapse
handlePort_ = CreateFile(portName,  // Specify port device: default "COM1"

GENERIC_READ | GENERIC_WRITE, // Specify mode that open device.

0, // the devide isn't shared.

NULL, // the object gets a default security.

OPEN_EXISTING, // Specify which action to take on file.

0, // default.

NULL); // default.

As figure 2 shows, portName = "COM1": the portName is a variable that is declared by const char*. It is used to specify port name that wants to create a serial port handle.

 

Figure 2: CreateFile function

 

Restoring a configuration

The restoration of serial port configuration is getting currentconfiguration at control device. The configuration of serial portincludes parameters that are used for setting a serial communicationsdevice.

The GetCommState function is used to get the currentdevice-control and then fills to a device-control block (a DBCstructure) with the current control settings for a specifiedcommunications device. The following code shows the function that isused to get the current control device:

Collapse
// Get current configuration of serial communication port.

if (GetCommState(handlePort_,&config_) == 0)
{
AfxMessageBox("Get configuration port has problem.");
return FALSE;
}

Modifying a configuration

When you already have serial port configuration in the DBC format,you have to modify parameters a bit. Following code shows theparameters modified:

Collapse
// Assign user parameter.

config_.BaudRate = dcb.BaudRate; // Specify buad rate of communicaiton.

config_.StopBits = dcb.StopBits; // Specify stopbit of communication.

config_.Parity = dcb.Parity; // Specify parity of communication.

config_.ByteSize = dcb.ByteSize; // Specify byte of size of communication.
  • DWORD BaudRate:

    Current baud rate (default = 9600)

  • BYTE StopBits:

    0,1,2 = 1, 1.5, 2 (default = 0)

  • BYTE Parity:

    0-4= no, odd, even, mark, space (default = 0)

  • BYTE ByteSize:

    Number of bits/byte, 4-8 (default = 8)

Note: Recommend that programmers use default value for typicalcommunication. As shown in figure 3, Watch Dialog Box shows the defaultvalues that are used for typical communication.

 

Figure 3: Serial port configuration

 

Storing a configuration

The next step is the storage of new configuration that is modified already into device control. Call SetCommState API function to store the configuration. The SetCommStatefunction configures a communications device according to thespecifications in a device-control block (a DBC structure). Thefunction reinitializes all hardware and control settings, but it doesnot empty output or input queues. Following code shows storage of a newconfiguration:

Collapse
if (SetCommState(handlePort_,&config_) == 0)
{
AfxMessageBox("Set configuration port has problem.");
return FALSE;
}

Setting a Time-Out communication

The final step in serial port opening is setting communication Time-out by using the COMMTIMEOUTS data-structure and calling SetCommTimeouts function. The code below shows setting time-out of communication:

Collapse
// instance an object of COMMTIMEOUTS.

COMMTIMEOUTS comTimeOut;
// Specify time-out between charactor for receiving.

comTimeOut.ReadIntervalTimeout = 3;
// Specify value that is multiplied

// by the requested number of bytes to be read.

comTimeOut.ReadTotalTimeoutMultiplier = 3;
// Specify value is added to the product of the

// ReadTotalTimeoutMultiplier member

comTimeOut.ReadTotalTimeoutConstant = 2;
// Specify value that is multiplied

// by the requested number of bytes to be sent.

comTimeOut.WriteTotalTimeoutMultiplier = 3;
// Specify value is added to the product of the

// WriteTotalTimeoutMultiplier member

comTimeOut.WriteTotalTimeoutConstant = 2;
// set the time-out parameter into device control.

SetCommTimeouts(handlePort_,&comTimeOut);
ReadIntervalTimeout

Specifies the maximum time, in milliseconds, allowed to elapsebetween the arrival of two characters on the communications line.During a ReadFile operation, the time period begins whenthe first character is received. If the interval between the arrival ofany two characters exceeds this amount, the ReadFile operation is completed and any buffered data is returned. A value of zero indicates that interval time-outs are not used.

A value of MAXDWORD, combined with zero values for both the ReadTotalTimeoutConstant and ReadTotalTimeoutMultipliermembers, specifies that the read operation is to return immediatelywith the characters that have already been received, even if nocharacters have been received.

ReadTotalTimeoutMultiplier

Specifies the multiplier, in milliseconds, used to calculate thetotal time-out period for read operations. For each read operation,this value is multiplied by the requested number of bytes to be read.

ReadTotalTimeoutConstant

Specifies the constant, in milliseconds, used to calculate the totaltime-out period for read operations. For each read operation, thisvalue is added to the product of the ReadTotalTimeoutMultiplier member and the requested number of bytes.

A value of zero for both the ReadTotalTimeoutMultiplier and ReadTotalTimeoutConstant members indicates that total time-outs are not used for read operations.

WriteTotalTimeoutMultiplier

Specifies the multiplier, in milliseconds, used to calculate thetotal time-out period for write operations. For each write operation,this value is multiplied by the number of bytes to be written.

WriteTotalTimeoutConstant

Specifies the constant, in milliseconds, used to calculate the totaltime-out period for write operations. For each write operation, thisvalue is added to the product of the WriteTotalTimeoutMultiplier member and the number of bytes to be written.

A value of zero for both the WriteTotalTimeoutMultiplier and WriteTotalTimeoutConstant members indicates that total time-outs are not used for write operations.

Note: After the user has set the time-out of communication without any error, the serial port has opened already.

Sending data

Most of data transmission of serial port is done as writing a file.Programmer can apply file operation functions for sending data toserial port. The WriteFile function is a function used to send data in serial port communication.

Collapse
if (WriteFile(handlePort_,   // handle to file to write to

outputData, // pointer to data to write to file

sizeBuffer, // number of bytes to write

&length,NULL) == 0) // pointer to number of bytes written

{
AfxMessageBox("Reading of serial communication has problem.");
return FALSE;
}

Note: If the function succeeds, the return value is nonzero.

Receiving data

Most of data reception of serial communication is done as reading afile. Programmer can apply file operation functions for receiving datafrom serial port. The ReadFile function is the function that handles reading data in serial port communication.

Collapse
if (ReadFile(handlePort_,  // handle of file to read

inputData, // handle of file to read

sizeBuffer, // number of bytes to read

&length, // pointer to number of bytes read

NULL) == 0) // pointer to structure for data

{
AfxMessageBox("Reading of serial communication has problem.");
return FALSE;
}

Note: If the function succeeds, the return value is nonzero.

Closing a serial port

The serial port closing calls the CloseHandle API function to close handle of device control.

Collapse
if(CloseHandle(handlePort_) == 0)    // Call this function to close port.

{
AfxMessageBox("Port Closeing isn't successed.");
return FALSE;
}

Note: If the function succeeds, the return value is nonzero.

原创粉丝点击