我有一个想要实现的 USB 协议,但我对实现它的最佳方式有点迷茫。
USB 协议涉及来回交换数据和确认数据包,如下所示:
Device: data
Host: ACK
Host: reply
Device: ACK
但有时,数据包可能会像这样异步传入:
Device: data #1
Device: data #2
Host: ACK #1
...
我希望有一个 API 可以抽象出 USB 的所有细节,让程序只处理实际数据,而不必担心数据包标头或确认数据包或类似的事情。理想情况下,会有一个write_to_device
函数在设备确认数据包之前阻塞,一个函数read_from_device
会阻塞直到接收到数据包,以及一个is_data_available
函数会立即返回队列中是否有任何数据。
我正在考虑运行一个单独的线程来处理 USB 事件。该线程将处理所有数据封装和确认。
当数据包进来时,处理线程将发送一个 ACK 数据包,然后提取原始数据并将其写入管道。该read_from_device
函数(从主线程调用)将简单地从此管道读取并自然阻塞,直到有数据。但是如果我使用这个方案,我将没有一种干净的方式来实现一个is_data_available
函数——没有办法在不读取管道的情况下检查管道中是否有数据。
像这样的东西:
[ Main thread ][ Processing thread ]
| Read from pipe || |
| || USB packet comes in |
| || Send ACK packet |
| || Extract data |
| || Write data to pipe |
| Read succeeds || |
| Return data || |
真正的问题是实现一个write_to_device
功能。
[ Main thread ][ Processing thread ]
| Somehow signal write || |
| Wait for write to complete || |
| || Send the data |
| || Wait for ACK packet |
| || Somehow signal that write completed
| Return || |
我怎样才能干净地实现一种发送数据包的方法,等待确认数据包然后返回?