WriteFile 源代码
时间: 2024-05-07 17:18:47 浏览: 10
以下是 WriteFile 函数的源代码:
```
BOOL WriteFile(
HANDLE hFile,
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped
);
```
该函数用于将指定的数据写入文件或输入/输出(I/O)设备。它的参数如下:
- `hFile`: 文件句柄或设备句柄。
- `lpBuffer`: 指向要写入的数据的指针。
- `nNumberOfBytesToWrite`: 要写入的字节数。
- `lpNumberOfBytesWritten`: 实际写入的字节数将被存储在此指针所指向的变量中。
- `lpOverlapped`: 可选的指向 OVERLAPPED 结构体的指针,用于指定异步 I/O 操作。
该函数返回一个 BOOL 类型的值,表示函数执行成功或失败。如果成功,返回值为非零值,否则返回值为零。
相关问题
cserialport类源代码
cserialport类是用于在计算机与串行端口之间进行数据通信的一个类。以下是该类的源代码:
```cpp
class CSerialPort {
public:
CSerialPort();
~CSerialPort();
BOOL OpenPort(int portNum, int baudRate);
void ClosePort();
BOOL WriteData(const unsigned char* pData, int dataSize);
BOOL ReadData(unsigned char* pData, int bufferSize, int& bytesRead);
private:
HANDLE m_hSerialPort;
BOOL m_isOpen;
};
CSerialPort::CSerialPort()
{
m_hSerialPort = NULL;
m_isOpen = FALSE;
}
CSerialPort::~CSerialPort()
{
ClosePort();
}
BOOL CSerialPort::OpenPort(int portNum, int baudRate)
{
if (m_isOpen)
return FALSE;
char portName[10];
sprintf(portName, "COM%d", portNum);
m_hSerialPort = CreateFile(portName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (m_hSerialPort == INVALID_HANDLE_VALUE)
return FALSE;
DCB dcb;
memset(&dcb, 0, sizeof(DCB));
dcb.DCBlength = sizeof(DCB);
dcb.BaudRate = baudRate;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
if (!SetCommState(m_hSerialPort, &dcb))
return FALSE;
m_isOpen = TRUE;
return TRUE;
}
void CSerialPort::ClosePort()
{
if (m_isOpen)
{
CloseHandle(m_hSerialPort);
m_isOpen = FALSE;
}
}
BOOL CSerialPort::WriteData(const unsigned char* pData, int dataSize)
{
if (!m_isOpen)
return FALSE;
DWORD bytesWritten;
if (!WriteFile(m_hSerialPort, pData, dataSize, &bytesWritten, NULL))
return FALSE;
return TRUE;
}
BOOL CSerialPort::ReadData(unsigned char* pData, int bufferSize, int& bytesRead)
{
if (!m_isOpen)
return FALSE;
DWORD bytesToRead;
if (!PeekNamedPipe(m_hSerialPort, NULL, 0, NULL, &bytesToRead, NULL))
return FALSE;
if (bytesToRead > 0)
{
if (!ReadFile(m_hSerialPort, pData, bufferSize, (LPDWORD)&bytesRead, NULL))
return FALSE;
return TRUE;
}
bytesRead = 0;
return TRUE;
}
```
以上是CSerialPort类的源代码。此类提供了打开和关闭串行端口的功能,并可以通过WriteData和ReadData函数分别写入和读取数据。OpenPort函数用于打开指定端口号和波特率的串行端口。ClosePort函数用于关闭串行端口。WriteData函数用于向串行端口写入数据,并返回是否写入成功。ReadData函数用于从串行端口读取数据,并返回是否读取成功,并将读取的字节数存储在bytesRead参数中。
Windows 10串口通信源代码
下面是使用C++编写的Windows 10串口通信源代码示例:
```
#include <Windows.h>
#include <iostream>
#include <string>
using namespace std;
int main()
{
HANDLE hSerial;
DCB dcbSerialParams = { 0 };
COMMTIMEOUTS timeouts = { 0 };
DWORD dwBytesWritten;
DWORD dwBytesRead;
bool success;
// 打开串口
hSerial = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hSerial == INVALID_HANDLE_VALUE)
{
cout << "Error opening serial port" << endl;
return 1;
}
// 配置串口参数
dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
success = GetCommState(hSerial, &dcbSerialParams);
if (!success)
{
cout << "Error getting serial port state" << endl;
CloseHandle(hSerial);
return 1;
}
dcbSerialParams.BaudRate = CBR_9600;
dcbSerialParams.ByteSize = 8;
dcbSerialParams.StopBits = ONESTOPBIT;
dcbSerialParams.Parity = NOPARITY;
success = SetCommState(hSerial, &dcbSerialParams);
if (!success)
{
cout << "Error setting serial port state" << endl;
CloseHandle(hSerial);
return 1;
}
// 配置串口超时时间
timeouts.ReadIntervalTimeout = 50;
timeouts.ReadTotalTimeoutConstant = 50;
timeouts.ReadTotalTimeoutMultiplier = 10;
timeouts.WriteTotalTimeoutConstant = 50;
timeouts.WriteTotalTimeoutMultiplier = 10;
success = SetCommTimeouts(hSerial, &timeouts);
if (!success)
{
cout << "Error setting serial port timeouts" << endl;
CloseHandle(hSerial);
return 1;
}
// 发送数据
string dataToSend = "Hello, world!";
success = WriteFile(hSerial, dataToSend.c_str(), dataToSend.size(), &dwBytesWritten, NULL);
if (!success)
{
cout << "Error writing to serial port" << endl;
CloseHandle(hSerial);
return 1;
}
// 接收数据
char buffer[1024] = { 0 };
success = ReadFile(hSerial, buffer, sizeof(buffer), &dwBytesRead, NULL);
if (!success)
{
cout << "Error reading from serial port" << endl;
CloseHandle(hSerial);
return 1;
}
else
{
cout << "Received data: " << buffer << endl;
}
// 关闭串口
CloseHandle(hSerial);
return 0;
}
```
注意,上述代码中使用的串口号是COM1,如果你需要使用其他串口号,需要根据实际情况进行修改。另外,代码中使用的波特率是9600,数据位是8位,停止位是1位,无校验位,如果你需要使用其他参数,也需要进行相应的修改。