2010-02-04 74 views
4

給出的代碼有什麼問題?爲什麼它沒有顯示rs232的輸出,當我們用d-9連接器連接它時,它的針腳編號爲2 & 3?C++下的RS-232混淆問題

#include <bios.h> 
#include <conio.h> 
#define COM1  0 
#define DATA_READY 0x100 
#define SETTINGS (0x80 | 0x02 | 0x00 | 0x00) 
int main(void) 
{ 
    int in, out, status; 
    bioscom(0, SETTINGS, COM1); /*initialize the port*/ 
    cprintf("Data sent to you: "); 
    while (1) 
    { 
     status = bioscom(3, 0, COM1); /*wait until get a data*/ 
     if (status & DATA_READY) 
      if ((out = bioscom(2, 0, COM1) & 0x7F) != 0) /*input a data*/ 
       putch(out); 
      if (kbhit()) 
      { 
       if ((in = getch()) == 27) /* ASCII of Esc*/ 
       break; 
       bioscom(1, in, COM1); /*output a data*/ 
      } 
    } 
    return 0; 
} 
+2

歡迎 - 你需要縮進代碼以使其正確顯示,或使用編輯器中的101010按鈕。我爲你做了這個。 – 2010-02-04 09:03:39

+0

請在正確的標籤下以及 – 2010-02-04 09:05:18

+0

爲什麼標記它c#? – Benny 2010-02-04 09:06:02

回答

1

那麼,代碼看起來沒問題。您是否真的將其餘引腳正確連接在插頭上,請參閱serialpin connections

0

從您的代碼中沒有任何明顯突出的原因。在處理硬件/軟件時檢查所有的基礎。下面的Microsoft文章使用_bios_serialcom(來自bios.h)有不同的實現,這可能是一個很好的參考點。

http://support.microsoft.com/kb/39501

建議從這裏到去:使用常數

  1. 我也建議更換文字(例如0x08的)預定義的波特率,奇偶校驗(例如_COM_NOPARITY),使代碼在你的問題中更具可讀性。

  2. 檢查Com端口是否實際打開,因爲它在上面的代碼示例中沒有選中。

  3. 還要檢查DB9的引腳連接。要連接兩臺計算機/設備,您需要將它調制解調器,例如在另一端的引腳2到引腳3以及信號接地。確保你禁用/不尋找DTR。

  4. 如果安裝了其他電腦/設備,我會建議先運行超級終端(程序 - >附件 - >通信)並連接到您的COM 1並檢查您是否可以看到其他設備的字符。如果不是最可能與您的電纜有關。

希望有所幫助。

0

在檢查您的代碼之前,請務必檢查您的串行通訊與終端程序。我對Windows環境沒有多少經驗,但在Linux中,您可以使用像cutecom或gtkterm這樣的程序,您可以從串行端口發送/接收數據。我們在Linux中廣泛使用這些程序進行串行通信,它們非常適合用於調試串行端口接口(也是h/w & s/w)的潛在問題。因此,在懷疑您的代碼與終端仿真程序檢查之前。

0

嘿,我不是在Win32專家,但它似乎更容易使用的另一篇文章作爲源(之前這裏提到的一個看起來過時):

http://msdn.microsoft.com/en-us/library/ms810467

這是老了,約在1995年左右,但看起來仍然有效。 NT體系結構在授予硬件訪問權時非常受限制,例如,將字節發送到PC並行端口,需要依賴開源開發人員編寫的解決方法。

0

我從你的評論中假設你已經連接了一條迴路電纜,因此你期望看到你鍵入的任何內容出現在屏幕上(並且當你斷開連接時停止這樣做電纜)。

我認爲在代碼中有一個錯誤:if (kbhit())裏面if (status & DATA_READY)

這意味着你只檢查鍵盤是否有一些輸入準備從串口接收 - 它不會有,因爲你沒有送它什麼呢!試着移動測試,看看它是否改善了問題。

(下面是一些similar serial port code,它將在if (kbhit())測試DATA_READY檢查外它不要求工作,但提供了一些證據表明,這可能是問題的根源...。)