//我給妳壹個我自己以前寫的串口操作的函數,包括兩部份,壹部分主CPP文件,壹部分為(頭)H文件.
//以下的代碼在VC++6.0下測試通過.
//將下面的兩部分代碼分別保存在serialport.cpp文件和serialport.h文件中.
//最後面是壹個簡單的使用舉例.
//===========================SerialPort.cpp的開始=========================
#include "SerialPort.h"
HANDLE OpenSerialPort(string & strPort,ULONG ulBaudrate)
{
HANDLE hSerial;
hSerial = CreateFile((strPort.c_str()),
GENERIC_READ|GENERIC_WRITE,
NULL,
NULL,
OPEN_EXISTING,
NULL,
NULL);
if(hSerial == INVALID_HANDLE_VALUE)//Open serial port failed.
{
return hSerial;
}
//Config serial port
DCB PortDCB;
PortDCB.DCBlength = sizeof(DCB);
// Get the default serial parameter.
GetCommState(hSerial, &PortDCB);
PortDCB.BaudRate = ulBaudrate; // baudrate
PortDCB.ByteSize = 8; // Number of bits/byte, 4-8
PortDCB.Parity = NOPARITY;
PortDCB.StopBits = ONESTOPBIT;
if (!SetCommState(hSerial, &PortDCB))
{
//config the serial port failed.
CloseHandle(hSerial);
return (INVALID_HANDLE_VALUE);
}
//Config the serial port timeout property.
COMMTIMEOUTS CommTimeouts;
GetCommTimeouts(hSerial, &CommTimeouts);//Get the serial port default timeout.
CommTimeouts.ReadIntervalTimeout = MAXDWORD;
CommTimeouts.ReadTotalTimeoutMultiplier = 10;
CommTimeouts.ReadTotalTimeoutConstant = 10;
CommTimeouts.WriteTotalTimeoutMultiplier = 50;
CommTimeouts.WriteTotalTimeoutConstant = 100;
if (!SetCommTimeouts(hSerial, &CommTimeouts))
{
//config the serial port timeout failed;
CloseHandle(hSerial);
return (INVALID_HANDLE_VALUE);
}
return (hSerial);
};
void CloseSerialPort(HANDLE hSerial)
{
CloseHandle(hSerial);
};
bool WriteSerial(BYTE *btData,ULONG ulSize,HANDLE hSerial)
{
DWORD dwNumBytes,dwRet;
dwRet=WriteFile (hSerial, //Handle
btData, //Data buffer
ulSize, //Buffer size
&dwNumBytes, //written bytes
NULL); //don't support
return (dwRet!=0);
};
bool ReadSerial(BYTE *btData,ULONG *ulSize,HANDLE hSerial)
{
//SetCommMask (hSerial, EV_RXCHAR);
ULONG ulRdSize=0;
BYTE Byte;
DWORD dwBytes;
bool blRd=false;
DWORD dwMask=EV_RXCHAR;
//WaitCommEvent(hSerial,&dwMask,NULL);
SetCommMask (hSerial, EV_RXCHAR);
while (ReadFile(hSerial, &Byte, 1, &dwBytes, 0)!=0){
if (dwBytes>0){
btData[ulRdSize++]=Byte;
if (ulRdSize==*ulSize){
blRd=true;
break;
}
}else{
blRd=true;
break;
}
}
*ulSize=ulRdSize;
return (blRd);
};
//===========================SerialPort.cpp的結束=========================
//===========================SerialPort.H的開始=========================
#include <windows.h>
#include <string>
using namespace std;
HANDLE OpenSerialPort(string & strPort,ULONG ulBaudrate);
void CloseSerialPort(HANDLE hSerial);
bool WriteSerial(BYTE *btData,ULONG ulSize,HANDLE hSerial);
bool ReadSerial(BYTE *btData,ULONG *ulSize,HANDLE hSerial);
//===========================SerialPort.H的結束=========================
//使用代碼示例:
HANDLE hSerialPort;
hSerialPort = OpenSerialPort("COM1:",115200);//Open serial port com1
if (hSerialPort != INVALID_HANDLE_VALUE)
{
if (!WriteSerial("HELLO!",7,hSerialPort))//Send data hello to com1
MessageBox(0,"ERROR","ERROR",MB_ICONWARNING);//show error message
CloseSerialPort(hSerialPort);
}