c# - 串口问题
问题描述
我正在使用以 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;
}
}
解决方案
您的活动代码在哪里DataReceived
?你需要一个状态机来完成你想要做的事情。看到这个链接,我有一篇关于如何做到这一点的好文章。
你基本上会在 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;
推荐阅读
- python - 如何为每个句子(行)创建标记词(列)的数据框?
- ios - 我的应用程序是否使用 UIApplication.shared.openURL 调用 HTTPS?
- python - 如何让轮廓第一个坐标始终位于左上角?
- c++ - ThreadSanitizer 检测到数据竞争,问题出在哪里?
- javascript - 检测公司名称的正则表达式
- java - 错误错误:方法没有覆盖或实现超类型中的方法
- python - 将 pandas DataFrame 中的行与另一个文本连接起来
- json - XML 解析错误:格式不正确,尝试加载 GeoJSON 时出错
- javascript - 为什么 slick 在 SweetAlert 2 弹出内容中不起作用?
- python - 如何获取服务器所有者的用户名和 Discord 标签 - Python