视频上说的老师骗人的话。当做成实际产品时,接收肯定要使用“接收中断”数据,改送要使用“发送中断”发送数据。
下面是改送中断实例:
1、串口配置
UCSR1B = (1 << RXEN1) | (1 << RXCIE1) | (1 << TXEN1) | (1 << TXCIE1);
2、启动发送中断
事先把数据放到发送缓冲区 USART1_send_buffer[],同时在主程序中发送“发送缓冲区 USART1_send_buffer”中的第1个字节。
void USART1_Begin_Send(void)
{
RS485_SEND_enable();
NOP(); // --------|
NOP(); // |
NOP(); // |-----------等待总线释放
NOP(); // |
NOP(); // --------|
USART1_sendPosi = 0;
UDR1 = USART1_send_buffer;
}
3、在发送中断中发送剩余字节
#pragma interrupt_handler USART1_TX_ISR:iv_USART1_TX
void USART1_TX_ISR(void)
{
if (USART1_sendPosi < USART1_sendCount)
UDR1 = USART1_send_buffer;
else
RS485_RECIVE_enable();
} 如果想进一步提高发送速度,对于RS485还可以 “发送空中断”和“发送完成中断”配合使用。 回复【楼主位】taocongrong 从戎
请问马老师:怎么理解发送中断 我看过很多的资料中 一般发送中断很少 因为发送的时间很短,并且在写上位机与下位机通讯的程序中 一般都是接受中断,很多程序功能是在接受中断处理的,我看了马老师的410页的例子,对这个发送中断还是有点疑惑,比如我一个di电平触发信号,该信号传送给单片机,然后单片机其实就直接通过发送程序发送给电脑主机 就可以了,还要发送中断干什么,接受了就立即发送,这样来采集信号啊,难道还有很多信号接受后还要等一段时间,才可以处理吗?不是很明白 请马老师讲解一下 ,我看了很多的视频啊 上面都是说这个发送中断很少用,不是很明白呀 。
-----------------------------------------------------------------------
首先你需要明白硬件串口发送的过程和时间。
MCU的UART发送是硬件完成的,从软件角度看,只要把发送数据写入发送数据寄存器就可以了,硬件将自动完成将并行的8位数据一位一位的串出(加上必要的起始位、停止位等)。串出一个8位数据的时间则与设置使用的BPS有关,假如使用9600bps,可以进行简单的估算;每秒可串出 9600/10 = 960个字节,此时串出一个字节需要1ms多一点的时间。
1ms对于人的反应可能是非常短了,但对于工作在几十M的MCU讲,1ms则可以几千到上万条指令了!
如果你的应用中,只是间断的发送一个字节数据,当然可以不用发送中断的,程序把数据写入发送数据寄存器就可以了,发送的事情由硬件完成,软件可以继续做后面的事情。
但是你如果一次需要发送一个数据包,比如10个字节,你不使用发送中断的话,就只能采用轮询等待的方式:写完一个字节,就需要轮询更待1ms,然后才能写第2个字节。。。。发送10个字节需要11ms,此时MCU其它的事情都不能做,时间白白浪费,效率就被拉下来了。 实际的产品肯定要合理应用中断来提高软件效率 taocongrong 发表于 2012-10-6 11:16
马老师节日快乐:
马老师您好:我最近做了一个关于发送中断的工程,关于串口发送中断有一些疑问,我的部 ...
看来你单片机编程完全没有入门。搜索我的帖子,从单片机初学者迈向单片机工程师里面有讲到如何释放cpu. 就你的问题来说,如果是查询发送,cpu一直在等待发送完成,在这期间其它事情都处理不了。如果用中断发送,则将数据扔到缓冲区之后马上就可以做其它事了。效率肯定高几个数量级。 machao mcu_lover 两位高人什么感觉?
我突然想起大学时实验室的同学。他有疑惑,你给讲了半天,最后也不知道他真明白还是不知所以然能用就行。
还有,我很讨厌你跟他讲一个问题时,他总是在关注另一个问题,就像你给他讲中断,外部模块,释放CPU,最后他说,哈,波特率一样示波器上看到的就一样嘛。
我不是针对人,而只是想表达,这种感觉不大好。
希望有问题的,最后能给答复你的人一个积极的反馈,我懂了,我哪哪还没懂,甚至我没懂,但我不想再去研究了。懂了最好也用自己的语言简单描述一下,征得别人的肯定,万一你理解的是错的呢,说出来,错了有人会给你指正。
对于第二个问题,我认为你是还没理解,否则不会这么逻辑混乱了。
--------------
打完我觉得这样发出去可能有些不妥,或许是我想的太多了。 taocongrong 发表于 2012-10-7 18:09 static/image/common/back.gif
这个问题傻孩子老师已经给我解答了,很详细,你说的也对,要真正的明白,我提出的问题那个mcu love没有直 ...
先说声对不起。后来想了想,这个场合说出这个话实在不应该,如果另发个帖子作为一个建议的话要好些。
当时我是突然联想起一些事,很想说些话,也考虑过是不是不妥,不过头脑一热就发出去了。很容易产生针对人的误解,而且是没有经过调查妄加评判。
抱歉了各位。 本帖最后由 jimmy_xt 于 2012-10-8 09:12 编辑
taocongrong 发表于 2012-10-7 18:09 static/image/common/back.gif
这个问题傻孩子老师已经给我解答了,很详细,你说的也对,要真正的明白,我提出的问题那个mcu love没有直 ...
mcu love当然也回答了这个问题。不能因为说的没有傻孩子精彩,就说他答非所问吧。
如果是查询发送,cpu一直在等待发送完成,在这期间其它事情都处理不了。如果用中断发送,则将数据扔到缓冲区之后马上就可以做其它事了。效率肯定高几个数量级。
这句话,虽然说的没有傻孩子那么专业(毕竟傻孩子-其实叫王老师比较好-是软件专业的),但基本上是同样意思。
PS:其实马老师说的就已经很清楚了。
PS:个人不建议一个项目中开过多中断,尤其是一些实时性要求高的项目。
如果USART发送数据量非常大的话,建议参考这个帖子
http://www.amobbs.com/forum.php?mod=viewthread&tid=5098399&highlight=avr%2Busart
以保证缓冲区最大化。 mcu_lover 发表于 2012-10-6 15:06 static/image/common/back.gif
看来你单片机编程完全没有入门。搜索我的帖子,从单片机初学者迈向单片机工程师里面有讲到如何释放cpu....
阁下难道是传说中的红金龙吸味? machao 发表于 2012-1-13 11:16 static/image/common/back.gif
回复【楼主位】taocongrong 从戎
请问马老师:怎么理解发送中断 我看过很多的资料中 一般发送中断很少 因为 ...
现在像stm32这种高端的控制器已经具备了DMA功能的USART接口,据说效率要比中断加环形队列还高,马老师能否写一篇教程呢?最好是485通信的 sbk100 发表于 2012-10-8 15:31 static/image/common/back.gif
阁下难道是传说中的红金龙吸味?
呵呵,是的。换马甲了。 taocongrong 发表于 2012-10-7 18:09 static/image/common/back.gif
这个问题傻孩子老师已经给我解答了,很详细,你说的也对,要真正的明白,我提出的问题那个mcu love没有直 ...
之前手机回帖不方便,现在在电脑上面回你。
好像你有个问题没有搞清楚。不管是中断+缓冲方式还是直接等待发送这种方式,这个效率不是你用示波器测波特率能够测出来的。
对于指定的波特率,难道你能够测出来两种波形???
好了,下面重点讲讲效率的问题。
假设系统中有一个主机, N个从机,通信方式为主机主动发起,从机应答。每个命令包长度为10个字节。
假定波特率9600 bps
则一个命令包长度发送完毕耗时约为 11 ms
采用查询方式发送:
//伪代码,下面函数发送指定 字节, 采用等待方式发送
SendCmdPacket(uint8 * pBuffer, uint8 u8Length)
//伪代码,下面函数发送指定 字节, 采用中断+缓冲方式
SendCmdPacketToBuffer(uint8 * pBuffer, uint8 u8Length)
则调用SendCmdPacket()发送时候,该函数会阻塞 11ms 直到发送完毕
相反,调用SendCmdPacketToBuffer()发送时候,该函数将数据包复制到缓冲区后,立即返回,耗时可能只有不到 0.1 ms 时间
加上中断处理时间 整个数据包发送完毕消耗CPU时间约为 1ms
相比查询方式,中断方式可以多出10ms 时间用来处理其它任务,这10 ms 就是效率!!!
而且通信数据包长度越长,优势越明显。
你的主机系统不可能只有通信任务,如果还有按键,显示等等其它任务,则用中断+缓冲能够提高整个系统的实时性!
明白否? mcu_lover 发表于 2012-10-8 20:26 static/image/common/back.gif
之前手机回帖不方便,现在在电脑上面回你。
好像你有个问题没有搞清楚。不管是中断+缓冲方式还是直接 ...
解释非常好,现在市面充斥非常多的“名人”的教科书,按键消抖用软件延时(前天我上研究生课,一个学生拿出书,还是“实战应用”),我劝他说:丢掉垃圾箱吧。
页:
[1]