我必须通过串口发送一个命令,并根据该命令接收回一个应答,然后根据收到的消息执行一些操作。我被告知我必须使用回调,因为这是一个异步操作。
我有两个线程,一个可以发送消息,一个接收消息。
示例:
//Thread 1
sendMessage("Initialize");
//Thread 2
while(1)
{
checkForMessages();
}
如何编写为特定消息初始化并处理接收到的消息的函数。
示例:
CommHandle(Command,MsgReceived)
{
if(command)
{
if(MsgReceived == ok)
...
if(MsgReceived == error)
...
}
}
发布于 2012-10-23 17:56:55
我被告知必须使用回调,因为这是一个异步操作。
不一定。在Windows中有一个叫做“异步I/O”的东西,它被看作是Windows内部的一个术语,它与“重叠I/O”(explanation here)是同义词。当您使用重叠I/O时,传输完成后会收到回调。这很好,因为它减少了CPU负载,但如果您的程序在等待期间没有更好的事情可做,那么这并不是真正必要的。所以这取决于你的应用程序的性质。
但是,无论您的应用程序的性质如何,您确实应该通过线程来处理所有串行通信,这样您就不会导致主GUI线程以令人尴尬的方式冻结。
然而,拥有一个rx和一个tx线程会让你进退两难:它们使用相同的端口句柄,并且不能自由地访问它,因为这不是线程安全的。解决方案是让单个超线程处理所有传输,或者通过互斥保护端口句柄。
我不确定哪种方法是最好的,我没有推荐。我自己只使用了“超级线程”:一个明显的优点是我可以将诸如“杀死线程”、“端口打开”、“端口关闭”之类的WaitFor指令集中在一个地方。但与此同时,代码变得相当复杂。
如何编写为特定消息初始化并处理接收到的消息的函数。
让你的线程将它们接收到的数据放入一些缓冲区中。tx缓冲器和rx缓冲器。根据串行协议和性能的不同,您可能必须使用双缓冲区:一个用于当前传输,另一个包含最近接收的数据。
然后从main中,从缓冲区中提取数据。它们需要是线程安全的。一旦您做到了这一点,只需像处理任何形式的数据一样编写一个解析器,并从那里执行操作
https://stackoverflow.com/questions/13026615
复制相似问题