Как управлять записью и чтением в последовательном порту, когда запись зависит от прочитанных данных - PullRequest
0 голосов
/ 18 февраля 2010

Я пытаюсь записать данные в последовательный порт, а затем ждать подтверждения. После получения подтверждения я записываю следующий набор данных. Пожалуйста, предложите способ сделать это. Я попробовал приведенный ниже код, но до получения подтверждения запись запускается и завершается.
Когда я запускаю его в режиме отладки, он работает нормально, но при запуске без точек останова он не работает должным образом.

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

Ответы [ 3 ]

0 голосов
/ 18 февраля 2010

Вам нужен шаблон конечного автомата или хотя бы какой-то способ сохранения состояния.Под «государством» я подразумеваю, где вы находитесь в процессе чтения / записи.Конечные автоматы - это базовый шаблон проектирования, обычно используемый для коммуникаций (или любых программ, управляемых событиями), читайте о них немного:

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

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

http://en.wikipedia.org/wiki/State_pattern (мне не нравится образец, который они выбрали здесь)

0 голосов
/ 28 июля 2010

Как-то так получилось,

 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 голосов
/ 18 февраля 2010

Вы пытаетесь использовать Flag в качестве подтверждения? Логика не имеет смысла. Разве вам не нужно делать что-то вроде

while (Flag == false)
    ; //wait for flag to become true after previous write
...write...
Flag = false;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...