我正在尝试将数据写入serialport,然后等待确认。收到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;
}
答案 0 :(得分:0)
您是否尝试使用Flag
作为确认?逻辑没有意义。你不需要做像
while (Flag == false)
; //wait for flag to become true after previous write
...write...
Flag = false;
答案 1 :(得分:0)
您需要状态机模式,或至少某种存储状态的方式。 “状态”是指您在阅读/写作过程中的位置。状态机是通常用于通信(或任何事件驱动程序)的基本设计模式,稍微阅读它们:
http://www.codeproject.com/KB/architecture/statepatterncsharp.aspx
http://www.dofactory.com/Patterns/PatternState.aspx
http://en.wikipedia.org/wiki/State_pattern(我不喜欢他们在这里选择的样本)
答案 2 :(得分: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.