本帖最后由 GZLJZ 于 2012-4-20 00:30 编辑
大家好,我之前把波特率设为115200,这样接收发送多个字节都直接在中断里了,
看到大家做485通信都经常波特率设为9600,接收一个字节就要约1MS,做485程序发送接收切换都要加入延时,这样如果发送接收20字节就要20MS多了,
这样单这个串口中断就占80MS,如果主循环里需要80MS以内处理的事情就做不了,
大家是这样处理这个问题的呢?
编辑原因:特率设为9600,接收一个字节好像是约1MS,我写4MS了
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
接收数据时,使用“中断方式”,清除 RI 后,用一个变量通知主函数,收到新数据。
下面程序是不是上面两行的意思,我就相这样做,可惜我看不懂C语言,有好心人转成汇编就好了
#include <REG52.H>
sbit LED = P1^0;
unsigned char UART_buff;
bit New_rec = 0, Send_ed = 1, Money = 0;
//----------------------------------------------
void main (void)
{
SCON = 0x50; //串口方式1, 8-n-1, 允许接收.
TMOD = 0x20; //T1方式2
TH1 = 0xFD; //9600bps@11.0592MHz
TL1 = 0xFD;
TR1 = 1;
ES = 1; //开中断.
EA = 1;
while(Money == 0); //等着交费,呵呵,等着接收$.
while(1) {
if ((New_rec == 1) && (Send_ed == 1)) { //如果收到新数据及发送完毕
SBUF = UART_buff; //那就发送.
New_rec = 0;
Send_ed = 0;
} }
}
//----------------------------------------------
void ser_int (void) interrupt 4
{
if(RI == 1) { //如果收到.
RI = 0; //清除标志.
New_rec = 1;
UART_buff = SBUF; //接收.
if(UART_buff == '1') LED = 1;
if(UART_buff == '0') LED = 0;
if(UART_buff == '$') Money = 1;
}
else { //如果送毕.
TI = 0; //清除标志.
Send_ed = 1;
}
}
一周热门 更多>