我有一個連接在端口COM4(115200波特,8-N-1)上的設備。基於例子,我發現here我與開埠:在Visual C++中寫入串行(Com)端口
Keyboard_Handle=CreateFile("\\\\.\\COM4",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL); if(GetLastError() !=0 || Keyboard_Handle == INVALID_HANDLE_VALUE) { AfxMessageBox("Error opening connection to Keyboard"); exit(1); } char buffer[100]; strcpy(buffer,"baud=115200 parity=N data=8 stop=1"); BuildCommDCB((char*)&buffer,&dcb)) if(GetCommState(Keyboard_Handle, &dcb)) { dcb.BaudRate = CBR_115200; dcb.ByteSize = 8; dcb.Parity = 0; dcb.StopBits = 1; SetCommState(Keyboard_Handle, &dcb); }
在我的代碼後來我打電話WriteFile的端口上:
LPDWORD bytes_written; LPDWORD bytes_read; LPOVERLAPPED OVERLAP; char write_buf[10]; write_buf[0] = 's'; write_buf[1] = '\0'; if(Keyboard_Handle != NULL) { WriteFile(Keyboard_Handle, (LPCVOID)write_buf , strlen(write_buf), bytes_written, OVERLAP); }我每次運行代碼我得到的時間
而且JIT調試器抱怨未處理的異常(儘管WriteFile位於Try/catch塊內)。
我這樣做有什麼問題嗎?
首先,我提到代碼運行,這意味着它編譯。其次,我添加了一些從最初的帖子中刪除的代碼。第三,感謝鏈接。 – thepocketwade 2009-09-22 23:28:11
現在你已經添加了bytes_written的聲明,我看到了這個問題:它是一個指針,在你使用它之前你還沒有初始化它。同上OVERLAP指針(在使用它之前你還沒有初始化它)。另外,未能打開COM端口將意味着該句柄包含值INVALID_HANDLE_VALUE(而不是0)。 – ChrisW 2009-09-22 23:51:02
對於「寫入的字節數」參數使用指針是不正常的。更常用的方法是將其聲明爲'DWORD'類型(而不是'LPDWORD'類型),並使用'&'來傳遞它。作爲'&dwBytesWritten':這樣你就可以通過指針傳遞一個值,而不是按值傳遞一個指針(在你的情況下是一個未初始化的指針)。 – ChrisW 2009-09-22 23:57:13