2012-09-05 129 views
1

我写了一个简单的winform应用程序来读取从微控制器接收到RS232 DE9串行端口的数据。我需要控制何时发送数据,所以我控制RtsEnable属性。程序结构与此类似。rtsenable不能正常工作

byte[] data = new byte[serialPort1.BytesToRead]; 
serialport1.RtsEnable = true; 

private void serialPort1_DataReceived(object sender, 
System.IO.Ports.SerialDataReceivedEventArgs e) 
{ 
    serialPort1.Read(data, 0, data.Length); 
    serialport1.RtsEnable = false; 
    this.Invoke(new EventHandler(ProcessData)); 
    serialport1.RtsEnable = true; 
} 

现在,问题很简单。当RtsEnable首先设置为true时,它实际上并未设置为true。当我调试时,它显示为RtsEnable = true。但是当我检查电路中的电压时,RT仍然不高。

我不认为这是我的电路有问题,因为我手动检查了在电缆端口的电压输出。所以,我认为这与我的代码有关。

任何想法,为什么这是? 在此先感谢

+0

如果您编写的程序只是循环启用和禁用RTS,您是否看到任何行切换?通常人们会在RTS和CTS之间产生混淆,因为您将RTS从一侧交叉连接到另一台设备上的CTS。另外,您确定启用应该是高电压还是信号可以低电平有效? – TJD

+0

对于q1,我没有发送任何数据就做了测试。因此,data_received事件尚未触发,并且RtsEnable必须为true。所以,还没有切换。对于q2,根据我读到的有关串口的信息,RTS在端口打开时变高。因此,它必须输出高电压 – Lihini

回答

-1

RtsEnable不设置RTS,它只启用它设置。 要设置(拉低)RTS(以及类似的DTR),您需要将握手设置为XonXoff。

例子:

private void btnReset_Click(object sender, EventArgs e) 
    { 
     comm.MycomPort.RtsEnable = true; 
     comm.MycomPort.Handshake = System.IO.Ports.Handshake.XOnXOff; 
     comm.MycomPort.RtsEnable = false; 
    } 

这会瞬间拉RTS低(或DTR如果使用MycomPort.DtrEnable) 将保持在低水平,直到禁用的,所以你可以添加一个计时器,以保持较低的任何持续时间。

+0

如果端口已经打开,则切换'DtrEnable'或'RtsEnable' *会导致引脚立即改变。 –