首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++中的异步通信

C++中的异步通信
EN

Stack Overflow用户
提问于 2012-10-23 16:45:35
回答 1查看 1.1K关注 0票数 0

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

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

示例:

代码语言:javascript
运行
复制
//Thread 1
sendMessage("Initialize");

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

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

示例:

代码语言:javascript
运行
复制
CommHandle(Command,MsgReceived)
{
  if(command)
  {
    if(MsgReceived == ok)
    ...
    if(MsgReceived == error)
    ...
  }

}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-23 17:56:55

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

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

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

然而,拥有一个rx和一个tx线程会让你进退两难:它们使用相同的端口句柄,并且不能自由地访问它,因为这不是线程安全的。解决方案是让单个超线程处理所有传输,或者通过互斥保护端口句柄。

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

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

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

然后从main中,从缓冲区中提取数据。它们需要是线程安全的。一旦您做到了这一点,只需像处理任何形式的数据一样编写一个解析器,并从那里执行操作

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13026615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档