1

我正在通过串口发送数据..发送部分没问题,我正在另一端获取数据,但我无法完成确认部分......这就是我正在做的......

mySerialPort.Open();
        mySerialPort.Write(databuffer, 0, 19);
        System.Threading.Thread.Sleep(2000);
        if (mySerialPort.BytesToRead > 0)      // this condition not working
        {
            string rdata = mySerialPort.ReadExisting();
            if (rdata.ToUpper().Trim() == "OK")
            {
                lblmsg.Text = "OK";
            }
            else
            {
                lblmsg.Text = "FL";
            }
        }

        mySerialPort.Close();

进一步我的串口设置是这样的......

public void SettingRS232(string port)
    {
        try
        {
            SerialPort mySerialPort = new SerialPort(port);
            mySerialPort.PortName = port;
            mySerialPort.BaudRate = 9600;
            mySerialPort.Parity = Parity.None;
            mySerialPort.StopBits = StopBits.One;
            mySerialPort.DataBits = 8;
            mySerialPort.Handshake = Handshake.None;
            mySerialPort.ReadTimeout = 2000;
            mySerialPort.WriteTimeout = 500;

            mySerialPort.DtrEnable = true;
            mySerialPort.RtsEnable = true;
        }
        catch (Exception ex)
        {
            lblmsg.Text = ex.Message;
        }
    }
4

2 回答 2

1

您需要挂钩到串口的DataReceived事件。有很多很好的资源可以帮助您入门。本质上,挂上一个事件处理程序,在事件处理程序内部,只要有数据就从端口读取(BytesToRead > 0)

于 2012-09-25T11:20:40.307 回答
1

这是非常少的。首先使用另一个程序来测试连接,例如 HyperTerminal 或 Putty。这让您非常了解基础知识、正确的电气连接以及正确的波特率、奇偶校验、停止位和数据位设置。并检查设备是否在您选择的幻数内返回响应,即 2 秒。

到目前为止,最常见的错误是没有注意正确的握手。如果您将其保留为“无”,那么您必须自己打开握手信号。将 RtsEnable 和 DtrEnable 属性设置为 true。当设备看到这些信号关闭时,它不会发送任何内容,它假定您没有通电 (DTR) 并且没有准备好接收数据 (RTS)。

通过避免混合二进制数据和字符串来进一步改进您的代码,摆脱可怕的 Sleep()。调用Read()方法接收字节,注意返回值就知道得到了多少。继续调用 Read() 直到你得到所有你期望收到的。


编辑:您的 SettingRS232() 方法有一个错误:

 SerialPort mySerialPort = new SerialPort(port);

这将创建一个名为 mySerialPort 的局部变量。您正在初始化该局部变量,而不是其余代码正在使用的 mySerialPort 变量。通过这样编写来修复错误:

 mySerialPort = new SerialPort(port);
于 2012-09-25T11:27:50.127 回答