我使用的硬件工作2波特率,我可以设置这个波特率与我的rs 232命令。
问题是我不想手动设置波特率,我希望软件设置一个波特率并发送一个命令,如果我得到一个答案,继续这个波特率,或者将它更改为第二个波特率并发送一个命令,如果回答了,继续这个波特率。
步骤:
我编写了一个代码,但是命令没有发送到硬件,如果我给Thread.sleep(),那么我的接口就会冻结。我怎样才能做到这一点?
以下是我的代码:
if (!SCP.IsOpen) {
SCP.PortName = cBoxComPort.Text;
SCP.BaudRate = 38400;
SCP.Parity = Parity.None;
SCP.DataBits = 8;
SCP.StopBits = StopBits.One;
SCP.DataReceived += SerialPort1DataReceived;
SCP.ReceivedBytesThreshold = 1;
SCP.Open();
dataout = "get rs232"; // test command
SCP.Write(dataout + "\r");
progressBar1.Value = 100;
fnLogFile = new StreamWriter("Logfile_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".log", true);
//string valueofdatain = datain;
string stringvalue = "command syntax error at cursor position 000";
if (stringvalue.CompareTo(datain) == 0 ) {
SCP.Close();
fnLogFile.Close();
SCP.PortName = cBoxComPort.Text;
SCP.BaudRate = 9600;
SCP.Parity = Parity.Even;
SCP.DataBits = 8;
SCP.StopBits = StopBits.One;
SCP.Open();
SCP.DataReceived += SerialPort1DataReceived;
SCP.ReceivedBytesThreshold = 1;
dataout = "get rs232";
SCP.Write(dataout + "\r");
progressBar1.Value = 100;
fnLogFile = new StreamWriter("Logfile_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".log", true);
} else {
SCP.Close();
fnLogFile.Close();
progressBar1.Value = 0;
}
}
发布于 2018-10-24 18:26:53
DataReceived
事件的代码在哪里?你需要一个状态机来完成你想要做的事情。请看this link,我写了一篇很好的文章,介绍了如何做到这一点。
你基本上会在38400发送命令1,如果你得到一个响应,很好,移动到你的下一个状态,在那里你做你需要做的。否则,如果您没有得到响应,超时,将波特率设置为9600并返回命令1状态(请注意,您可以在端口打开时切换波特率,我相信)。
使用链接中的示例,下面是添加超时的方法:
Stopwatch sw = new Stopwatch();
case StateMachine.SendCmd1:
sw.Reset();
sw.Start();
CallbackResponse = Cmd1Response; //set our delegate to the first response
sp.Write("Send first command1"); //send our command through the serial port
currentState = StateMachine.Cmd1Response; //change to cmd1 response state
break;
case StateMachine.Cmd1Response:
//waiting for a response....you can put a timeout here
if (sw.ElapsedMilliseconds > (5000) && sw.ElapsedMilliseconds != 0)
{
//set the baud rate
//set current state back to SendCmd1
}
break;
https://stackoverflow.com/questions/52965347
复制相似问题