0

我必须通过串行发送命令并根据命令接收答案,并根据收到的消息做一些事情。有人告诉我必须使用回调,因为这是一个异步操作。

我有 2 个线程,一个可以发送消息,一个可以接收消息。

例子:

//Thread 1
sendMessage("Initialize");

//Thread 2 
while(1)
{
    checkForMessages();
}

如何编写为特定消息初始化并处理收到的消息的函数。

例子:

CommHandle(Command,MsgReceived)
{
  if(command)
  {
    if(MsgReceived == ok)
    ...
    if(MsgReceived == error)
    ...
  }

}

4

1 回答 1

1

有人告诉我必须使用回调,因为这是一个异步操作。

不必要。Windows中有一个东西叫做“异步I/O”,这算是Windows内部的一个术语,是“重叠I/O”的同义词(解释here)。当您使用重叠 I/O 时,您将在传输完成时收到回调。这很好,因为它减少了 CPU 负载,但如果您的程序在等待时没有更好的事情可做,那么它并不是真正需要的。因此,这取决于您的应用程序的性质。

但无论你的应用程序的性质如何,你确实应该通过线程处理所有串行通信,这样你就不会导致主 GUI 线程以令人尴尬的方式冻结。

但是,拥有一个 rx 和一个 tx 线程会给您带来两难境地:它们使用相同的端口句柄,并且无法自由访问它,因为这不是线程安全的。解决方案是要么让一个超级线程处理所有传输,要么通过互斥锁保护端口句柄。

我不确定哪种方法最好,我没有建议。我自己只使用过“超级线程”:一个明显的优势是我可以将“杀死线程”、“端口打开”、“端口关闭”等 WaitFor 指令集中在一个地方。但与此同时,代码变得相当复杂。

如何编写为特定消息初始化并处理收到的消息的函数。

让您的线程将其接收到的数据铲到一些缓冲区中。一个 tx 缓冲区和一个 rx 缓冲区。根据您的串行协议和性能,您可能必须使用双缓冲区:一个用于当前传输,一个包含最近接收的数据。

然后从 main 中,从缓冲区中获取数据。它们需要是线程安全的。一旦你做到了这一点,只需像使用任何形式的数据一样编写一个解析器,然后从那里采取行动

于 2012-10-23T09:56:54.523 回答