我必须通过串口发送命令并根据命令接收回答,并根据收到的消息做一些事情。我被告知我必须使用回调,因为这是一个异步操作。
我有2个线程,一个可以发送消息,另一个可以接收消息。
示例:
//Thread 1
sendMessage("Initialize");
//Thread 2
while(1)
{
checkForMessages();
}
如何编写为特定消息初始化的函数并处理收到的消息。
示例:
CommHandle(Command,MsgReceived)
{
if(command)
{
if(MsgReceived == ok)
...
if(MsgReceived == error)
...
}
}
答案 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获取缓冲区中的数据。它们需要是线程安全的。一旦你到目前为止,只需编写一个像任何形式的数据一样的解析器,并从那里采取行动