WriteFile()和ReadFile()异步不写入或读取
WriteFile() and ReadFile() asynchronously not writing or reading
我正在尝试使用writefile
和readfile
函数通过串行端口连接发送和接收字符串。我必须异步地这样做,因为要读取的字节数总是不同的,而readfile
只会挂起或阻塞,直到它得到正确的字节数。现在我正尝试异步执行此操作,我的writefile
函数不会发送任何数据,而我的readfile
函数似乎被跳过了,因为下一行开始执行它的操作,而没有读取任何字符。不确定是重叠结构有问题还是超时。但我此刻陷入了困境。
超时
void Serial::OpenPortRead()
{
HANDLE sSerial = CreateFile(L"COM3",GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
//Timeout Settings
COMMTIMEOUTS CommTimeouts;
GetCommTimeouts(sSerial, &CommTimeouts);
CommTimeouts.ReadIntervalTimeout = 5000;
CommTimeouts.ReadTotalTimeoutMultiplier = 2;
CommTimeouts.ReadTotalTimeoutConstant = 10;
CommTimeouts.WriteTotalTimeoutMultiplier = 50;
CommTimeouts.WriteTotalTimeoutConstant = 500;
//Port Settings
DCB dcbSerialParams = {0};
dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
dcbSerialParams.BaudRate=CBR_19200;
dcbSerialParams.ByteSize=8;
dcbSerialParams.StopBits=ONESTOPBIT;
dcbSerialParams.Parity=NOPARITY;
SetCommState(sSerial,&dcbSerialParams);//Apply Settings to Handle
}
写入文件功能
void Serial::WritePort(CString buffer)
{
DWORD bytes;//pointer to hold number of bytes written
USES_CONVERSION;
CW2A buf((LPCWSTR)buffer);//Convert unicode to ascii
OpenPortRead();
OVERLAPPED overlapped_structure;
memset(&overlapped_structure, 0, sizeof(overlapped_structure));
overlapped_structure.Offset = 0;
overlapped_structure.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
WriteFile(sSerial, buf,strlen(buf),&bytes,&overlapped_structure);//Send string
}
读取文件功能
int Serial::ReadPort(CString buf){
OpenPortRead();// Open Serial Communication for reading
const int buffer_size = 10;
char buffer[10];//buffer to hold recieved string
memset (buffer, 0, buffer_size * sizeof (char));
int n, num,iTemp,i=0;
OVERLAPPED overlapped_structure;
memset(&overlapped_structure, 0, sizeof(overlapped_structure));
overlapped_structure.Offset = 0;
overlapped_structure.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
DWORD bytesRead;//pointer to number bytes read
ReadFile(sSerial,&buffer,buffer_size,&bytesRead,&overlapped_structure);// begin read
//Used this function because return would be filled with extra raw data characters
buffer[n] = StringLength(buffer, &n);//find length of string returned
num = n;
MSDN包含有关如何使用串行端口通信的重叠I/O的详细信息:
串行通信
相关文章:
- 带有 Boost.Beast 的异步读取标头
- TCP 服务器的异步读取使用 boost::asio 打印客户端套接字发送的数据
- 增强 ASIO 和串行端口异步读取
- 如何使用软化工具包从 OPC UA 服务器异步读取操作回调中的数据值响应中获取 NodeId 详细信息
- 异步提升从stdin读取的asio
- 如何使用 GRPC c++ 读取异步服务器端流
- C++ / RS232C 串口 / 事件回调异步读取缓冲区 / 不使用线程
- XAudio2 教程 - 单独的线程和异步读取?
- 如何在读取/写入文件的同时异步读取/写入Beast websocket
- C# Tcp 异步套接字数据读取逻辑
- 为什么在读取非HTTP服务器的套接字时需要异步IO
- 如何阻止 boost::asio 异步读取混淆
- 使用Qt从stdin异步读取
- 如何在linux上获得异步套接字上可读取的字节数
- 异步提升读取串行端口
- 异步读取完成,但缓冲区没有包含预期的结果
- 如何在Windows中使用boost asio从命令行异步读取输入
- 从Poco异步读取HTTPClientSession
- 我怎样才能得到异步读取上传输的字节量
- 内存尖峰-提高ASIO异步读取