C# 使用C从串行端口通信器接收缓冲区数据时出现问题#

C# 使用C从串行端口通信器接收缓冲区数据时出现问题#,c#,serial-port,serial-communication,C#,Serial Port,Serial Communication,我通过RS232电缆连接的串行端口与机器通信。在传递凭证后,如果机器的缓冲存储器为空(干净),我可以作为客户端从机器获取数据。当我关闭应用程序时,数据就会进入机器的缓冲存储器,因为机器处于连续运行模式。在此之后,如果我尝试通过启动应用程序并传递凭据以相同的方式获取数据,则不会从计算机获取缓冲区和实时数据 现在,当我尝试通过将凭据传递到superterminal.exe登录时,以及在我能够获取缓冲区和实时数据之后 所以我的问题是,当数据在缓冲区中时,为什么我不能从程序中获取缓冲区数据,就像我们从H

我通过RS232电缆连接的串行端口与机器通信。在传递凭证后,如果机器的缓冲存储器为空(干净),我可以作为客户端从机器获取数据。当我关闭应用程序时,数据就会进入机器的缓冲存储器,因为机器处于连续运行模式。在此之后,如果我尝试通过启动应用程序并传递凭据以相同的方式获取数据,则不会从计算机获取缓冲区和实时数据

现在,当我尝试通过将凭据传递到
superterminal.exe
登录时,以及在我能够获取缓冲区和实时数据之后

所以我的问题是,当数据在缓冲区中时,为什么我不能从程序中获取缓冲区数据,就像我们从
Hyperterminal.exe

我一直在努力寻找解决这个问题的办法,但没有运气

我请求你在这方面给我指点迷津。。对我来说,任何建议都将是人生的救星

这是我正在使用的代码

        port1.RtsEnable = true;
        port1.DtrEnable = true;
        port1.PortName = "COM1";
        port1.BaudRate = 9600;
        port1.DataBits = 8;
        port1.Parity = System.IO.Ports.Parity.None;
        port1.StopBits = System.IO.Ports.StopBits.One;
        port1.Handshake = Handshake.RequestToSend;
        port1.Handshake = Handshake.RequestToSendXOnXOff;
        port1.Handshake = Handshake.None;
        port1.Handshake = Handshake.XOnXOff;
        port1.Open();

        port1.Write("Username\r\n");
        port1.Write("Password\r\n");
        port1.Write("Command\r\n");
        port1.DataReceived += new SerialDataReceivedEventHandler(port1_DataReceived);

    }
    public void port1_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {

        Thread.Sleep(500);
        while (port1.IsOpen)
        {
            //string s = port1.ReadExisting();
            string s = port1.ReadLine();
        }
        }
我使用了
ReadLine()
以及
ReadExisting()
,但运气不好

I/O代码

        public void getData() {

        byte[] buffersize = new byte[port1.ReadBufferSize];

        int bytesRead = port1.Read(buffersize, 0, buffersize.Length);

        byte[] buffer = new byte[bytesRead];

        File.AppendAllText(text, "Inside 1\r\n");

        Action kickoffRead = delegate
        {
            port1.BaseStream.BeginRead(buffer, 0, buffer.Length, delegate(IAsyncResult ar)
            {
                try
                {
                    File.AppendAllText(text, "Inside 2\r\n");

                    int actualLength = port1.BaseStream.EndRead(ar);
                    byte[] received = new byte[actualLength];
                    Buffer.BlockCopy(buffer, 0, received, 0, actualLength);

                    string mybuffer = "";
                    //ASCII data. 
                    mybuffer += Encoding.ASCII.GetString(received, 0, bytesRead);
                 }
我在登录凭证之后调用了这个方法…仍然没有收到数据

public void port1_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    //Initialize a buffer to hold the received data 
    byte[] buffer = new byte[port1.ReadBufferSize]; 

    //get the number of bytes read 
    int bytesRead = port1.Read(buffer, 0, buffer.Length); 

    //ASCII data. 
    mybuffer += Encoding.ASCII.GetString(buffer, 0, bytesRead);

    if(mybuffer.IndexOf('\r') > -1)
    {
        //Found a carriage return, do something with buffer?
    }
}

您将获得比特和片段,因此您可能希望将其全部缓冲起来,并查找返回字符(或从另一端获得的任何终止符)以提取数据包。

为什么不从IO流中读取?类似于读取套接字或文件..我必须猜测“登录”要求。我在这段代码中没有看到太多与登录相关的代码。@tmckown如何读取IO流。如果你给我一个想法,我会尝试。@HansPassant如何更正我的登录代码段以及其中的错误???@tmckown根据你的建议,也尝试读取IO流,但没有成功。。请帮助…一个查询,我是否需要在
port1\u DataReceived
之前或之后编写代码,因为根据我的理解,一旦任何实时数据出现,就会调用
port1\u DataReceived
。我通过在两者之前和之后进行测试。如果是在通过凭据之后,它会进入内部,但不会读取任何数据不只是因为数据在机器的缓冲区中才进入内部..如果我试图通过执行以下操作将缓冲区详细信息保存到文本中
byte[]buffer=new byte[port1.ReadBufferSize];File.AppendAllText(text,buffer.ToString())。然后我得到的是
System.Byte[]
,因为文本输出和程序流只在这里停止。。