串口发送数据的时间
用430串口发送数据给舵机,我们一个工作周期20ms,给舵机发送数据11个字节,波特率用9600那么传送数据时间=11*8/9600=9.17ms
问题是,430的发送时间也是9.17ms么?在线路上的传送时间是9.17ms没错。
现在我理解的是:数据我是用循环中断的方式发送的。430的TXbuff是一个字节的,所以只能一个字节一个字节的发,在发送这11个字节的9.17ms期间,cpu干不了其他工作,只能串口发送数据吗?
如果是pc机串口发送11字节的话,由于电脑缓存大,11个字节准备好后就可以干其他的事了吗?9.17ms其他时间可以做其他工作。
cmyldd 发表于 2014-10-7 06:55 static/image/common/back.gif
要不要考虑硬件的响应时间呢?
硬件响应时间应该微妙级的 shaoziyang 发表于 2014-10-6 21:43 static/image/common/back.gif
一般是当发送完成后,才会进入中断。发送的这段时间,MCU就可以做其他任务。
有的CPU是缓冲区空就能进中 ...
如果是发送完成才进入中断就可以理解了,给txbuf赋值后,usrt马上进行发送,此时cpu可以进行其他工作;
当发送完成后,在中断里继续赋值,退出中断,uart发送数据,cpu执行其他程序。
感觉豁然开朗:lol 要不要考虑硬件的响应时间呢? menghubei 发表于 2014-10-6 19:17 static/image/common/back.gif
比如我这个中断发送程序:
我想发送一帧数据存在string2数组中;
一般是当发送完成后,才会进入中断。发送的这段时间,MCU就可以做其他任务。
有的CPU是缓冲区空就能进中断,这时一般发送缓冲区是有多字节的。 shower.xu 发表于 2014-10-6 14:50 static/image/common/back.gif
你计算的时间是发送的时间,发送由串口模块硬件完成,不占用cpu时间。你需要做的只是把数据放到发送缓冲区 ...
比如我这个中断发送程序:
我想发送一帧数据存在string2数组中;
#############################
#pragma vector=UART0TX_VECTOR
__interrupt void usart0_tx (void)
{
if(i<9)
TXBUF0 = string2;
}
#############################
执行下面语句后:
TXBUF0=string2;
就进入中断发送了,但是中断里面又给TXBUF0赋值了,也就是继续发送。
程序一直在中断里面啊,没出过中断,cpu如何进行其他工作?
shaoziyang 发表于 2014-10-6 15:40 static/image/common/back.gif
就是这样。
比如我这个中断发送程序:
我想发送一帧数据存在string2数组中;
#############################
#pragma vector=UART0TX_VECTOR
__interrupt void usart0_tx (void)
{
if(i<9)
TXBUF0 = string2;
}
#############################
执行下面语句后:
TXBUF0=string2;
就进入中断发送了,但是中断里面又给TXBUF0赋值了,也就是继续发送。
程序一直在中断里面啊,没出过中断,cpu如何进行其他工作?
menghubei 发表于 2014-10-6 15:16 static/image/common/back.gif
430的发送缓冲区只有一个字节,也就是说在发着一个字节的时间内cpu可以干其他的,
发送完成后,通过中断 ...
就是这样。 shower.xu 发表于 2014-10-6 14:50 static/image/common/back.gif
你计算的时间是发送的时间,发送由串口模块硬件完成,不占用cpu时间。你需要做的只是把数据放到发送缓冲区 ...
430的发送缓冲区只有一个字节,也就是说在发着一个字节的时间内cpu可以干其他的,
发送完成后,通过中断再发送下一个字节码? 你计算的时间是发送的时间,发送由串口模块硬件完成,不占用cpu时间。你需要做的只是把数据放到发送缓冲区。
当你循环发送的时候,你可以打开发送完成中断,来往发送缓冲区填数据。不占用cpu
页:
[1]