【发布时间】:2018-10-25 02:26:53
【问题描述】:
我正在使用以 2 波特率工作的硬件,我可以使用我的 rs 232 命令设置此波特率。
问题是我不想手动设置波特率,我希望软件设置一个波特率并发送命令,如果我得到答案继续使用这个波特率或者将其更改为第二个波特率并发送命令,如果得到答复,则继续使用此波特率。
步骤:
- 以波特率打开端口 - 38400
- 发送命令 - 如果收到回复,则没有变化
- 如果没有答案,那么 - 关闭端口
- 以波特率打开端口 - 9600
- 发送命令 - 如果收到答复,则继续使用此波特率
- 如果没有答案 - 错误消息
我写了一个代码,但命令没有发送到硬件,如果我给 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;
}
}
【问题讨论】:
-
我不明白整个问题。我的目光停在了一个 Thread.Sleep 上;你可以使用一个任务让这个方法在后台运行吗?这样你的界面就不会死机了。
-
忘记 Thread.sleep .. 看看我添加的步骤
-
我无法回答您的问题,但我记得我的一位同事前段时间在 .NET 串行端口类上苦苦挣扎,并且骂了很多 ;) 他最终使用了 ZylSerialPort.NET组件,这最终让他取得了一些进展。可能值得一试。我自己不做通讯,不要问我细节。
标签: c# serial-port