Windows 驱动开发

windows驱动开发疑问,有一个小的需求,有意者私型,相关需求会告知

具体?

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7603142
  • 这篇博客你也可以参考下:Windows 中断异常管理
  • 除此之外, 这篇博客: windows下实现同时收发的串口通信类设计中的 串口接收线程 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • Data_Receive_Pre是协议解析函数,每次传输一个字节进去。
    因为线程函数必须是类的静态成员,所以需要把类自身指针传进去,在协议解析函数中给类中的属性赋值。
    Data_Receive_Pre函数需要根据自身协议实现,可以参考mavlink和匿名的协议解析。

    UINT WINAPI CSerialPort::ListenThread(void* pParam)
    {
    	CSerialPort *pSerialPort = reinterpret_cast<CSerialPort*>(pParam);
    	cout << "串口监听线程启动成功" << endl;
    	char szBuff[2] = { 0 };
    	DWORD dwBytesRead = 0;
    	DWORD dwRes;
    	BOOL fWaitingOnRead = FALSE;
    	OVERLAPPED osReader = { 0 };
    
    	osReader.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    
    	while (!pSerialPort->s_bExit)
    	{
    		if (!fWaitingOnRead)
    		{
    			// Issue read operation.
    			if (!ReadFile(pSerialPort->hSerial, szBuff, 1, &dwBytesRead, &osReader))
    			{
    				if (GetLastError() != ERROR_IO_PENDING)     // read not delayed?
    					printf("Serial port Reading error!\n");
    				else
    				{
    					fWaitingOnRead = TRUE;
    					// printf("Serial port is waiting for data!\n");
    				}
    			}
    			else
    			{
    				//cout << "0" << (int)szBuff[0] << endl;
    				Data_Receive_Pre(szBuff[0], pSerialPort);
    			}
    		}
    		else
    		{
    			dwRes = WaitForSingleObject(osReader.hEvent, INFINITE);
    			switch (dwRes)
    			{
    				// Read completed.
    			case WAIT_OBJECT_0:
    				if (!GetOverlappedResult(pSerialPort->hSerial, &osReader, &dwBytesRead, FALSE))
    					// Error in communications; report it.
    					printf("Serial port Reading error after Overlapped!\n ");
    				else
    				{
    					if (dwBytesRead>0)
    					{
    						Data_Receive_Pre(szBuff[0], pSerialPort);
    					}
    					//  Reset flag so that another opertion can be issued.
    					fWaitingOnRead = FALSE;
    					// printf("%d Byte Data received after Overlapped!\n", (int)dwBytesRead);
    				}
    				break;
    			case WAIT_TIMEOUT:
    				printf("STILL Serial port is waiting for data!\n ");
    				break;
    
    			default:
    				break;
    			}
    		}
    	}
    	return 0;
    }
    

    以上就能做到串口收发同时。

  • 您还可以看一下 梅会东老师的Windows驱动开发系列之一:小白入门经典课程中的 欢迎进入Windows的驱动编程世界小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    对于Windows驱动开发的需求,我需要更多关于具体需求细节的信息。以下是我对问题的理解和可能的解决方案,希望能帮到你:

    根据参考资料提到的内容,我假设你需要解决的问题是关于串口的枚举和通信。下面是可能的解决方案:

    1. 串口枚举:根据参考资料中的段落2所述,可以使用Windows API来获取和枚举系统中的串口。以下是一个示例代码:
    #include <iostream>
    #include <Windows.h>
    
    int main() {
        // 打开串口
        HANDLE hSerial = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        if (hSerial == INVALID_HANDLE_VALUE) {
            std::cout << "Failed to open serial port!" << std::endl;
            return 1;
        }
    
        // 枚举可用的串口
        char buffer[10];
        DWORD bytesRead;
        if (GetCommState(hSerial, buffer, sizeof(buffer), &bytesRead)) {
            std::cout << "Serial ports found: " << buffer << std::endl;
        }
        else {
            std::cout << "Error enumerating serial ports!" << std::endl;
        }
    
        // 关闭串口
        CloseHandle(hSerial);
    
        return 0;
    }
    

    这段代码可以打开COM1串口并枚举可用的串口。

    1. 串口通信:根据参考资料中的段落5所述,可以使用Windows API来进行串口通信。以下是一个示例代码:
    #include <iostream>
    #include <Windows.h>
    
    int main() {
        // 打开串口
        HANDLE hSerial = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        if (hSerial == INVALID_HANDLE_VALUE) {
            std::cout << "Failed to open serial port!" << std::endl;
            return 1;
        }
    
        // 配置串口
        DCB dcbSerialParams = { 0 };
        dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
        if (!GetCommState(hSerial, &dcbSerialParams)) {
            std::cout << "Error getting serial port state!" << std::endl;
            CloseHandle(hSerial);
            return 1;
        }
        dcbSerialParams.BaudRate = CBR_9600;
        dcbSerialParams.ByteSize = 8;
        dcbSerialParams.StopBits = ONESTOPBIT;
        dcbSerialParams.Parity = NOPARITY;
        if (!SetCommState(hSerial, &dcbSerialParams)) {
            std::cout << "Error setting serial port state!" << std::endl;
            CloseHandle(hSerial);
            return 1;
        }
    
        // 发送数据
        char data[] = "Hello, World!";
        DWORD bytesWritten;
        if (!WriteFile(hSerial, data, sizeof(data), &bytesWritten, NULL)) {
            std::cout << "Error writing to serial port!" << std::endl;
            CloseHandle(hSerial);
            return 1;
        }
    
        // 关闭串口
        CloseHandle(hSerial);
    
        return 0;
    }
    

    这段代码可以打开COM1串口并发送数据。

    请注意,以上代码仅为示例,具体的解决方案可能会根据你的需求和具体环境而有所不同。尽管我提供了一些参考,但如果你有更具体的问题或需求,请提供更多细节以便我更好地帮助你。