2009-09-22 70 views
1

我有一個連接在端口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塊內)。

我這樣做有什麼問題嗎?

回答

8

bytes_written需要是一個變量的地址;編譯器不會編譯您發佈的語句。

同樣,「OVERLAP」沒有意義。

您是否檢查CreateFile是否成功?

當您撥打strlen時,write_buf上有什麼?

嘗試複製並粘貼您正在使用的實際代碼。

此外,這似乎不是一個非常好/翔實的示例,你正在使用。嘗試使用Windows Serial Port Programminghttp://msdn.microsoft.com/en-us/library/ms810467.aspx

也從Microsoft站點的示例程序開始,在修改它之前對其進行測試(以檢查它是否在您的計算機上運行),然後對其進行修改。

+0

首先,我提到代碼運行,這意味着它編譯。其次,我添加了一些從最初的帖子中刪除的代碼。第三,感謝鏈接。 – thepocketwade 2009-09-22 23:28:11

+0

現在你已經添加了bytes_written的聲明,我看到了這個問題:它是一個指針,在你使用它之前你還沒有初始化它。同上OVERLAP指針(在使用它之前你還沒有初始化它)。另外,未能打開COM端口將意味着該句柄包含值INVALID_HANDLE_VALUE(而不是0)。 – ChrisW 2009-09-22 23:51:02

+1

對於「寫入的字節數」參數使用指針是不正常的。更常用的方法是將其聲明爲'DWORD'類型(而不是'LPDWORD'類型),並使用'&'來傳遞它。作爲'&dwBytesWritten':這樣你就可以通過指針傳遞一個值,而不是按值傳遞一個指針(在你的情況下是一個未初始化的指針)。 – ChrisW 2009-09-22 23:57:13

0

當您致電SetCommState是返回值0嗎?這可能會導致更多的問題出錯。

此外,你是否逐行逐步確定WriteFile調用是否會崩潰?

最後,你可能會有一些防病毒或其他軟件掛在你的應用程序導致這些問題(查找未知的dll的加載到你的模塊列表中)。

+0

返回值爲0.第二次看,我用ReadFile調用替換了WriteFile行,並且它也崩潰了,但是沒有代碼運行正常。 – thepocketwade 2009-09-22 23:30:35

+0

我是新來的Visual Studio,我還沒有弄清楚模塊列表在哪裏。 – thepocketwade 2009-09-22 23:32:53

+0

當你在調試時,點擊Debug菜單,Windows - > Modules(如果你使用的是默認快捷方式,則按Ctrl + D,M) – Joshua 2009-09-22 23:38:57