2016-03-01 91 views
0

我在寫一個簡單的用戶界面來與在線串行編程器進行通信。其目的是消除終端用戶通過PuTTY輸入十多條神祕命令的需求,事實上,由於用戶不可避免地戴着鍵盤不友好的手套,因此完全不需要打字。該過程需要與用戶交互,所以一個簡單的批處理腳本是不可行的。串行端口通信 - PuTTY仿真

我可以找到正確的COM端口併成功打開它。我可以發送數據,但迴應只是相當於「未知命令」。

我不會發布整個代碼,因爲沒有人能夠重現我的情況。但是,如有必要,我總是可以添加所有內容。

我打開通信使用CreateFile()並使用WriteFile()ReadFile()進行通信。例如:

if (!WriteFile(hSerial, "r rc.all\r\n", 10, &bytesRead, NULL)) 
    cout << "Error sending message (" << GetLastError() << ")" << endl; 
if (!ReadFile(hSerial, msgBuffer, 15, &bytesRead, NULL)) 
    cout << "No message received" << endl 
else 
{ 
    cout << "Bytes rcvd = " << bytesRead << endl; 
    for (int x=0; x<bytesRead; x++) 
     cout << (unsigned int) msgBuffer[x] << " "; 
} 

無論是什麼消息我送(或 「R rc.all」 或 「FOOBAR」),我總是得到相同的迴應:

Bytes rcvd = 3 
62 13 10 

這是>\r\n。我曾試圖減慢字符發送來模擬他們所鍵入的,但是這將調用來自ICSP同樣的反應:

bool serialSend(LPCSTR MESSAGE, PHANDLE hSERIAL) 
{ 
    DWORD bytesWritten; 
    char writeBuff[2];  

    writeBuff[1] = '\0'; 

    for (UINT x = 0; x <= strnlen(MESSAGE, 64); x++) 
    { 
     cout << MESSAGE[x]; 
     writeBuff[0] = MESSAGE[x]; 
     if (!WriteFile(*hSERIAL, writeBuff, 1, &bytesWritten, NULL)) 
      cout << "\t\tERROR! (character '" << MESSAGE[x] << "', error " << GetLastError() << ")" << endl; 
     Sleep(100); 
    } 

    writeBuff[0] = '\n'; 
    if (!WriteFile(*hSERIAL, writeBuff, 1, &bytesWritten, NULL)) 
     cout << "\t\tERROR! (character 'LF', error " << GetLastError() << ")" << endl; 
    Sleep(100); 
    writeBuff[0] = '\r'; 
    if (!WriteFile(*hSERIAL, writeBuff, 1, &bytesWritten, NULL)) 
     cout << "\t\tERROR! (character 'CR', error " << GetLastError() << ")" << endl; 

    cout << endl; 

    return true; 
} 

我已經設置了串行連接的參數匹配PuTTY中設置 - 字節長度,停止位,奇偶校驗,流量控制等。我得到響應的事實表明連接沒有錯。

出了什麼問題?

+0

這似乎只是Windows,WriteFile()不是C++。請添加[Windows]標籤。 – kebs

+0

@kebs是否有一個串行通信的本地方法? – CharlieHanson

+0

不,C++不提供任何低級硬件訪問,只有I/O流。所以你確實需要使用一個API(你已經在做什麼)......或者寫一個驅動程序,但那會更困難! – kebs

回答

0

問題原來是郵件末尾發送的\r\n組合。

發送只是\r或只是\n不起作用。但是,發送(char) 13的確如此 - 即使這應該與\r相同。

在發送每個字符之間還需要暫停; 1ms就足夠了。