2010-02-04 68 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检查外它不要求工作,但提供了一些证据表明,这可能是问题的根源...。)