我对这个问题有点不确定,但我经常在我目前的设计中遇到麻烦,如果有人能展示出一种不同的方法,那真的很棒。
我的程序通过 rs232 将异步命令写入设备,同时不断读取接收到的数据并做出反应。
这一切都很好,很整洁,但是在我的初始化阶段,我必须发送一堆命令,这些命令必须等待响应,然后才能让程序开始计数。
现在,这部分我必须用纯 C 语言完成,而我所能想到的就是使用全局变量和 while 循环。但我觉得这真的不漂亮。
以此作为伪代码示例:
OnReceive(data){
switch determineCommand(data)
case CMD1:
config.value1 = data.value1
case CMD2:
config.value2 = data.value2
default:
print data
}
DoCommandChain(){
Send(CMD1)
If("Send(CMD1)" got its response){
Send(CMD2)
}
}
现在,问题是“如果 XY 得到它的响应”——因为我不想使用一些变量来检测这一点,而且我不能依赖 Send(CMD1) 的返回值,因为这只是一个指标,即CMD1 已发送 - 没有收到相应的内容。
我在这里问,因为我想知道我可以搜索/阅读什么,以一种很好的方式解决这个烂摊子。
现在,我最好的想法是设置一个计时器保护功能来监控,如果收到特定的响应。然后,根据此响应的状态,转到下一个Send
或重试上一个。
像这样:
Instead of `Send(CMD1)` -> `DoUntilResponse(Send(CMD1),Timeout,NumberOfRetries)`
DoUntilResponse(function,Timeout,NumberOfRetries){
registerExpectedResponse(CMD1, gotResponse) //awaiting some response for CMD1
for(i=0 ; i!=Numberofretries; i++){
if (Send(CMD1) == successfulSend ){
while(not timeout){
if gotResponse then break;
}
if gotResponse then break;
}
}
}
编辑:
澄清一下:我不担心串行连接,也不担心如何触发该OnReceive
功能 - 这一切都已经开始工作了。我不清楚的是,如何在不使用轮询的情况下解决上述伪代码,最好在纯 C 中解决。