2010-02-18 88 views
0

我正在尝试将数据写入串行端口,然后等待确认。收到确认后,我写下一组数据。 请建议一种做法。我尝试了下面的代码,但在收到答案之前,写作触发并完成执行。
当我在调试模式下运行它时,它工作正常,但运行没有断点时,它无法正常运行。如何在写入时管理写入和读取串行端口取决于读取数据

// 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; 
     } 

回答

0

不知怎的,这已经制定出来,

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. 
0

您是否尝试使用Flag作为ack?逻辑没有意义。难道你需要做的是这样

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

我试图坚持着这个简单的方法g循环运行,直到data_received_from_port不再将标志设置为真。它在我使用断点运行程序时起作用。但是如果我直接运行它,它不会工作。已收到确认(由我使用消息框进行检查),但可能不会发生同步。你认为设备不能正确发送消息吗? – subho 2010-02-26 06:38:16

+0

问题可能出在时间上。您无法控制DataReceived何时发生 - 它可能在接收到1个字节后发生,或者很多。如果它在收到1个字节后发生,然后您立即发送下一个数据包,则可能会使设备混淆。当您将MessageBox放入时,您可以大大改变时间。如果您更新了上面的代码,并且您迄今为止所做的任何更改将会很有帮助。 – mtrw 2010-02-26 07:24:49

0

你需要一个状态机模式,或至少一些储存状态的方式。 “国家”是指你在阅读/写作过程中所处的位置。状态机通常用于通信的基本设计模式(或任何事件驱动程序),在他们读了一下:

http://www.codeproject.com/KB/architecture/statepatterncsharp.aspx

http://www.dofactory.com/Patterns/PatternState.aspx

http://en.wikipedia.org/wiki/State_pattern(我不喜欢他们的样品选择这里)

+0

感谢Addys。我想了解如何在我的情况下实现这种模式。一旦我得到答案,我一定会回复我的答复。 – subho 2010-02-26 06:35:14