c - 如何在运行异步串行通信时等待响应?

标签 c asynchronous

我对这个问题有点不确定,但我经常在我当前的设计中遇到麻烦,如果有人能展示一种不同的方法,我会非常感激。

我的程序通过 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 中解决上述伪代码。

最佳答案

假设写和读操作在不同的线程中执行,使用如下算法:

Write thread.
    Register expected response.
    Send packet to the device
    Wait for Received event with timeout. If event is set, continue. Timeout - 
    report error and exit (or make additional trial).

Read thread.
For every received packet:
    Add it to the input buffer.
    Analyze buffer. If it contains valid response, set "Received" event, 
    releasing the Write thread, clear input buffer, and continue reading. 
    If input buffer contains unrecognized data, report error, clear buffer 
    and continue reading.
    If input buffer contains the beginning of expected response, 
    continue reading.

线程和事件通知是特定于操作系统的。如果您的 C++ 编译器不支持多线程,请使用像 Boost 这样的可移植库,或使用特定于操作系统的 API。请注意,读取线程实现了流解析逻辑,因为串行通信是面向流的。

编辑。

“注册预期的响应”意味着:设置一些程序变量而不是意味着“类型 X 的命令被发送到设备”。根据此变量,读取线程期望接收数据包,该数据包应由设备根据通信协议(protocol)(特定于应用程序)发送。另一个接收到的数据包,通常可能是有效的,应该被视为错误,因为这不是对刚刚发送到设备的命令的响应。

另一种方式:设置预期的响应大小。在这种情况下,一旦 Read 线程接收到预期数量的数据,它就会设置 Received 事件,将数据包识别任务留给发送方。

关于c - 如何在运行异步串行通信时等待响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13587222/

相关文章:

c++ - 导入库如何工作以及为什么 MinGW 不需要它们?

c# - 调用和开始调用

javascript - 如何保持 $.getJSON 响应的顺序?

c - C 与 Unix 环境之间的异步通信

python - Grpc:类型错误: 'UnaryStreamCall' 对象不可迭代

c++ - Alpha 混合说明

c - 如何使用 C 中的 strtok 将 csv 中的后续列分配给数组

c - 在 C 中重新声明静态变量......从来没有发生过?

c - 从文件读取数据到结构体中 (C)

javascript - 在 AngularJS 中加载异步数据