C# 当写入依赖于读取数据时,如何在serialport中管理写入和读取

C# 当写入依赖于读取数据时,如何在serialport中管理写入和读取,c#,serial-port,C#,Serial Port,我正在尝试将数据写入serialport,然后等待确认。收到ack后,我写入下一组数据。 请建议一种方法。我尝试了下面的代码,但在收到ack之前,写入操作启动并完成执行。 当我在调试模式下运行它时,它工作得很好,但当在没有断点的情况下运行时,它无法正常运行 // some data for writing byte[] data = "xxx"; byte[] data1 = "yyy"; byte[] data2 = "zzz"; // loop to write the a

我正在尝试将数据写入serialport,然后等待确认。收到ack后,我写入下一组数据。 请建议一种方法。我尝试了下面的代码,但在收到ack之前,写入操作启动并完成执行。
当我在调试模式下运行它时,它工作得很好,但当在没有断点的情况下运行时,它无法正常运行

// some data for writing  
byte[] data = "xxx";  
byte[] data1 = "yyy";  
byte[] data2 = "zzz";  

// loop to write the above 5 times  
int times = 1;  
for (int i = 0; i < 20; i++)  
            {  
                if (Flag == true)  
                {  
                    Flag = false;  
                    if (times <= 5)  
                    {  
                        serialPort.Write(data, 0, data.Length);  
                        serialPort.Write(data1, 0, data1.Length);  
                        serialPort.Write(data2, 0, data2.Length);  
                        times = times + 1;  
                    }  
                }  
                else  
                {  
                    MessageBox.Show("Some problem in ack...");  
                }  
            }  
            Flag = true;    

 private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)  
        {  
            //char[] buffer = new char[4];  
            //serialPort.Read(buffer, 0, 4);  
            Flag = true;  
        }
//一些用于写入的数据
字节[]数据=“xxx”;
字节[]数据1=“yyy”;
字节[]数据2=“zzz”;
//循环写入上述5次
整数倍=1;
对于(int i=0;i<20;i++)
{  
如果(标志==真)
{  
Flag=false;

如果(times您正在尝试使用
标志
作为确认?逻辑没有意义。您不需要执行类似的操作吗

while (Flag == false)
    ; //wait for flag to become true after previous write
...write...
Flag = false;

您需要一种状态机模式,或者至少是某种存储状态的方式。所谓“状态”,我指的是您在读/写过程中所处的位置。状态机是一种基本的设计模式,通常用于通信(或任何事件驱动的程序),请仔细阅读:


(我不喜欢他们在这里选择的样本)

不知怎的,这是可行的

 byte[] data = "Your message to be sent on serial port";
    serialPort.Write(data, 0, data.Length);

    byte[] buffer = new byte[16];
    int vintctr = 0;
                    while (vintctr < 16)
                        vintctr  += serialPort.Read(buffer, 0, 16);

Debug this and you you can get the reply from the port.
byte[]data=“您要在串行端口上发送的消息”;
serialPort.Write(数据,0,数据长度);
字节[]缓冲区=新字节[16];
int-vintctr=0;
而(vintctr<16)
vintctr+=serialPort.Read(缓冲区,0,16);
调试它,您就可以从端口获得回复。

谢谢Addys。我正在尝试了解如何在我的案例中实现此模式。一旦我得到答案,我肯定会回复。我尝试过这种简单的方法来保持循环运行,直到\u从\u端口收到的数据不再将标志设为true。当我使用断点运行程序时,它会起作用。但是如果我直接运行它如果没有停止,它将不工作。收到确认(由我使用MessageBox检查)但同步可能没有发生。您认为设备没有正确发送ACK吗?问题可能是在时间上。您无法控制何时收到数据-可能是在收到1个字节后,也可能是在多个字节后。如果是在收到1个字节后,然后您立即发送下一个数据包,则可能会混淆设备当你把MessageBox放进去的时候,你会大大改变时间。如果你用你迄今为止所做的任何改变来更新你上面的代码,那会很有帮助。