|
串口(UART)速度深度分析!!欢迎大家指正 (^_^) --(乞讨裤子)
//*************************[ 1 ]*************************
基础知识
什么是波特率?
就是每秒钟内发送的位(BIT)数
假设波特率(Baud)=9600, 无校验, 1位停止位/起始位
主站发送10个字节数据,从站CPU响应(发送)80个字节
先不管主站的速度,从站的各个时间如下:
接收/发送一个字节时间=10/波特率 (秒)
TB=10/BAUD=10/9600=1/960
理论(主站-->从站)接收10个字节时间=10*TB=(1/96) (秒)
理论(从站-->主站)发送80个字节时间=80*TB=(8/96) (秒)
理论的总处理时间
= CPU处理时间(T) + (接收字节数+发送字节数)*(10/BAUD)
= CPU处理时间(T) + (9/96)
约等于 (T+0.094) (秒)
//******************************************************
[CPU"定律"] :
单个CPU是不能实现全双工的, 原因很简单:
同一时间只能执行一个指令
同一时间只能操作一个内存空间
中断处理也遵循上述规定动作
(这个问题欢迎大家提出自己的见解)
//******************************************************
也就是说CPU在同一时间UART要么是收数据要么是发数据
到这里前面计算出来的(T+0.094)就很有意思了
//*************************[ 2 ]*************************
时间T和CPU的型号是直接对应的
有人说为什么不是CPU速度? 现在是型号代表速度...
(AVR,AT91,STM的速度相信大家都如雷灌耳了...呵呵)
就拿AVR的MEGA64,16MH来说.
程序架构:中断收发,双缓冲 (参考马老师的程序)
PC程序:comdebug.exe (小飞机图标那个)
发现总处理时间在250ms以上,只要comdebug发送时间一小就开始出现丢包
CPU的执行时间 T=0.25-0.094 约等于 0.15 秒
//-----------------------------------------------------
有耐心看到这里的人会说:怎么这么慢?!
//-----------------------------------------------------
其实我个人分析是:
中断处理和其他代码的执行时间开销是比较大的
可根据前面说的[CPU"定律"]解释
(开始砸东西过来了...)
好!现在用comdebug,在PC的两个串口上收发测试,发送时间1ms
结果是没有丢包,这说明了一点:只要CPU速度够快,CPU的执行时间可忽略不计
如果AVR要达到PC的水平(假设响应时间=0.0001秒),那频率应该是?
可以这样算: 0.0001*F=0.15*16 F=(0.15*16)/0.0001=24000
那AVR要超频到2.4G, (-_-)!
//-----------------------------------------------------
有耐心看到这里的人会说:为什么这样算?!
//-----------------------------------------------------
好!顺便讲一下:
假设代码量为N
0.15=N/16
那如果同样的代码量要求缩短时间
那新时间 = N/F
这样一来不就是: N=0.15*16=0.0001*F
呵呵
//======================================================
// 现在可以得出第一个结论: 只要CPU够快,神马都不是问题!
//======================================================
//*************************[ 3 ]*************************
时间0.094是直接和波特率对应的
波特率越高
在同一时间内数据的收发量越大
主从站之间数据的响应时间越短
(谁都知道了,还用你说...)
好还是拿AVR的MEGA64,16MH来说
先测试115200, 不试不知道,这一试...
就算comdebug发送时间是一秒钟,也会丢包
唉...速度啊
57600,38400,19200...
最后发现38400是上限了,超过后容易造成丢包
//-----------------------------------------------------
有耐心看到这里的人会说:怎么老拿MEGA64来测试?!
//-----------------------------------------------------
AVR天下皆知嘛...
还有就要说一下AT91的PDC,网上有人说怎么怎么快,
可是我实际测试时发现速度是一样的
AT91的代码:
AT91F_US_SendFrame((AT91PS_USART) AT91C_BASE_DBGU, (char *)PDC_header,sizeof(PDC_header),0,0);
while (AT91F_PDC_IsTxEmpty (AT91C_BASE_PDC_DBGU)==0){}
就是这里,再怎么快也要等,既然如此,还不如:
while (!AT91F_US_TxReady((AT91PS_USART) AT91C_BASE_DBGU)){}
AT91F_US_PutChar((AT91PS_USART) AT91C_BASE_DBGU,Data);
小的不才, 测试情况发现速度的确没多大的差别
如有冒犯请多多谅解...
//-----------------------------------------------------
有耐心看到这里的人会说:你想说什么?!
//-----------------------------------------------------
理论上讲:
如果在主从模式的网络中提高波特率来提高数据的响应速度,是不合理的
换句话说我就那点运算速度,你看着办吧 (-_-)!
其实网上早有大侠写过这个问题的文章
"基于VxWorks的多路高速串口的通信方法设计"
http://www.donews.com/tele/201009/217624.shtm
//******************************************************
由于代码都是在FLASH内,但是FLASH的操作速度基本在40MH以内
所以AVR,AT91SAM7的运行效率也就在40MH的速度内
当然在SRAM内运行除外
(这个问题欢迎大家提出自己的见解)
//******************************************************
//======================================================
// 现在可以得出第二个结论: 只要波特率过快,神马都是问题!
//======================================================
就写这么点了,欢迎大家指出错误!
总结:
(1)关于波特率=115200的问题在程序的处理方式上,参考程序在 【15楼】 ccstc 已给出 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|