我有一个通过串行接口连接到 BeagleBone 计算机的设备。我以简单的二进制格式进行通信,例如
|MessagID (1 Byte) | Data (n Bytes) | checksum (2 bytes) |
每个命令的消息长度是固定的,这意味着在接收到命令的第一个字节后知道要读取多少字节。在一些初始设置通信之后,它每 20 毫秒发送一次数据包。
我的方法是使用 termios 或类似串行库的东西,然后开始一个循环这样做(a:
while(keepRunning)
{
char* buffer[256];
serial.read(buffer, 1)
switch(buffer[0])
{
case COMMAND1:
serial.read(&buffer[1], sizeof(MessageHello)+2); //Read data + checksum
if (calculateChecksum(buffer, sizeof(MessageHello)+3) )
{
extractDatafromCommand(buffer);
}
else
{
doSomeErrorHandling(buffer[0]);
}
break;
case COMMAND2:
serial.read(&buffer[1], sizeof(MessageFoo)+2);
[...]
}
}
然后 extractDatafromCommand 将创建一些结构,例如:
struct MessageHello
{
char name[20];
int version;
}
将所有内容放在自己的读取线程中,并使用信号量(或简单标志)向程序的其他部分发出新数据包的可用性信号。
这是一个可行的解决方案还是有更好的改进(我假设是这样)?
也许制作一个抽象类 Message 并派生其他消息?