1

我目前正在从事一个项目,该项目将通过串行通信从微控制器读取数据。

截至目前,该程序(在我的计算机上)打开一个/dev/tty*文件并能够读取/写入它。微控制器将n随时发送一个字节包。我想知道是否有任何方法可以告诉我何时将所有字节写入文件?

我一直在研究select()andpoll()函数,但它们似乎只能判断一个字节何时准备好,而不是何时写入每个字节。

任何帮助表示赞赏。谢谢!

4

2 回答 2

3

如果你n是硬编码的,你可以这样做(使用伪代码):

received_data = offset_from_last_round
while( received_data < n )
{
    use select() for waiting data to arrive
    read() all data you can, dont forget to check buffer oveflow here
    received_data += how much data was red
}
full_message = buffer[ 0 ... N - 1 ]
offset_to_next_round = buffer[ N .. received_data ]

如果n没有硬编码,您需要执行@Golgauth 建议的操作,或者在您的消息中添加一些“传输结束”序列/字节(如果您有二进制文件/数据要传输,这很棘手)。简而言之:您需要某种协议。

于 2013-06-25T12:12:58.090 回答
2

嗯,这个想法是你的二进制文件应该以一些字节开始,这些字节实际上给出了接下来必须读取的大小。

  • 读取 N 个字节 => 给出 DATASIZE,即剩余多少字节:(FILESIZE - N)
  • 读取 (DATASIZE) 字节 => 给出数据本身(由大小为 n 的块/数据包读取)

这实际上是我们在这里进行的讨论(这是关于如何解释raw PCM wav声音文件,但这是同一点:获取N样本数,以确定接下来要读取多少块以获取关注的文件到完整性)。

于 2013-06-25T02:02:47.030 回答