高级会员

- 积分
- 977
- 金钱
- 977
- 注册时间
- 2016-3-8
- 在线时间
- 267 小时
|
平常单片机间做有协议通信,用环型对列来接收数据是很常用的。但是却很少看到发送有用队列的。基本都是while判断发送标志等着,直到数据全部发完。这样如果用9600波特率,发100byte,就要停100ms左右。。这里思考下发送用缓冲队列存在的局限。
想了想,可能原因有下:
1.单片机产生数据是很快的。而且是密集的。但是接收是比较均匀的。比如9600波特率串口最快也1ms接收一个数据。但发送时单片机会单次产生大量数据。比如一个协议是100byte,单片机是一次性就计算好这100byte数据,计算这100byte数据耗时也很短。如果采用环冲区,那环冲区的大小必须大于单次产生的数据才行。相比接收缓冲。要占用更多资源做缓冲区。
2.想要保证发送缓冲正常工作,那要满足 单次数据量/数据发送间隔<发送速率。比如单次数据是100byte,那就要控制数据产生的间隔要大于发送100byte的时间,不然再大的缓冲区也会溢出。如果用额外的程序控制数据的产生和发送间隔也是麻烦事。一次性计算完,一次性发送完会很清爽。
3.细想下,无论怎样处理,发100byte,就是需要这么多时间,用缓冲区再快也就是把计算时间匀到发送等待时间里。结合上一点,上次没有发完前,不可能一次把本次计算的数据放入缓冲。那就算数据在发送空闲时间里已经计算好了,也只能等着。再者计算数据本身就很快。产生100byte的发送数据的时间对于发送100byte的时间可能都可以忽略不计。发完前一笔数据再计算后一笔花费的时间也不多。。花大量代码去控制数据产生来配合发送缓冲区和发送速率,做好了也收效甚微。
|
|