c中的异步通信

时间:2012-10-23 08:45:35

标签: c asynchronous serial-communication

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

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

示例:

//Thread 1
sendMessage("Initialize");

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

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

示例:

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

}

1 个答案:

答案 0 :(得分:1)

  

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

不一定。 Windows中有一些称为“异步I / O”的东西,它被视为内部Windows术语,与“重叠I / O”(explanation here)同义。当您使用重叠I / O时,您将在传输完成时收到回调。这很好,因为它减少了CPU负载,但如果你的程序在等待时没有更好的事情,那就没有必要了。所以这取决于你的应用程序的性质。

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

有一个rx和一个tx线程让你陷入两难境地:他们使用相同的端口句柄,他们无法自由访问它,因为这不是线程安全的。解决方案是使一个单线程处理所有传输,或通过互斥锁保护端口句柄。

我不确定哪种方法最好,我没有推荐。我自己只使用了“超线程”:一个明显的优点是我可以在一个地方集中WaitFor指令,如“kill thread”,“port is open”,“port is closed”。但与此同时,代码变得相当复杂。

  

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

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

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