STC单片机串口通信的问题
看了一下手册STC11,12的SBUF是全双工的像这样写没事
void UART_sedata(unsigned char Udata)
{
ES=0;
TI=0;
SBUF=Udata;
while(!TI);
if(TI)
TI=0;
ES=1;
}
void UART_sedata(unsigned char Udata)
{
TI=0;
SBUF=Udata;
while(!TI);
if(TI)
TI=0;
}像这样写,单片机会进入死循环,为什么?想不通啊 有可能在串口中断函数里清0了TI lcw_swust 发表于 2012-8-3 17:00 static/image/common/back.gif
有可能在串口中断函数里清0了TI
voidUART_()interrupt 4
{ unsigned char xdata udata;
ES=0;
if(RI)
{ RI=0;
udata=SBUF;
receiving_process(udata); }
/* TI=1;
printf("采样数1: %u\n",cai);
while(!TI);
TI=0;
ES=1; */
// }
if(TI){TI=0;}
ES=1;
}
中断函数是 这样,大虾帮帮看看,看能不能做到全双工 弄简单些,就不要搞中断了,直接查询吧. 中断里,可不就是TI清0 嘛if(TI){TI=0;}
发送数据时,死在while(!TI)了
俺了解的串口是半双工的,无论什么串口,都是半双工的,STC的。。。不做评论
试试看把ES换成EA你试试 wicy001 发表于 2012-8-3 21:50 static/image/common/back.gif
中断里,可不就是TI清0 嘛if(TI){TI=0;}
发送数据时,死在while(!TI)了
谢谢,是死在这里了, kkk529699480 发表于 2012-8-3 22:45 static/image/common/back.gif
俺了解的串口是半双工的,无论什么串口,都是半双工的,STC的。。。不做评论
试试看把ES换成EA你试试 ...
我做了一下试验,有主循环里隔10MS以送一次,然后用PC机给单片机发送,
以5MS发送一次,结果是,发送了500多次,单片机只接到200多次,其他的300多没了,
看来以后还是得要SPI这才是全双工的啊 tanguicaicai 发表于 2012-8-4 08:55 static/image/common/back.gif
我做了一下试验,有主循环里隔10MS以送一次,然后用PC机给单片机发送,
以5MS发送一次,结果是,发送了50 ...
看了一下stc12的手册,它的串口有两个独立的接收和发送缓冲器,共用一个地址码。它的结构图也明确标了2个buffer,此型号单片机确实可以做成全双工。
你可以设置两个全局变量,在接收和发送中断里,让两个变量加1,看看接收和发送的数据个数是否正确。如果正确,则说明你的主程序编的有问题,将数据漏掉了。 kkk529699480 发表于 2012-8-3 22:45 static/image/common/back.gif
俺了解的串口是半双工的,无论什么串口,都是半双工的,STC的。。。不做评论
试试看把ES换成EA你试试 ...
51单片机的串口就是全双工的啊 tanguicaicai 发表于 2012-8-4 08:55 static/image/common/back.gif
我做了一下试验,有主循环里隔10MS以送一次,然后用PC机给单片机发送,
以5MS发送一次,结果是,发送了50 ...
我假设你的波特率是9600bit/s,串口方式是8位数据位,1位停止位,无校验位,那你发送一个8位数就得花(9/9600)=0.0009375秒,你10毫秒发送的话,你最多只能发送10/0.9375=个8位数。虽然我感觉自己算错了,但是也差不多这道理。 ken_zq 发表于 2012-8-4 20:21 static/image/common/back.gif
我假设你的波特率是9600bit/s,串口方式是8位数据位,1位停止位,无校验位,那你发送一个8位数就得花(9/9 ...
按这么算的话~差不多1MS才以发完一个数据的哦,我看了一下手册,也知道STC像AVR单片机一样。有两个SBUFF,
我在做东西时,发现,两个单片机在通信时,B单片机在发送数据给A时,A单片机在发送数据给B,B有时是接收不到的,按我理解,我把串口的中断
优先最高,但是有时是另一个单片机在发送时接收不到的,发送那个我也把它联上电脑,给另一个发时,电脑也能接收到。
在我发送函数里没有关中断,但是在接收里我关了,也就A给B发送数据是有3ms的时间间隔。
学习了,谢谢 {:smile:}{:smile:} tanguicaicai 发表于 2012-8-5 15:39 static/image/common/back.gif
按这么算的话~差不多1MS才以发完一个数据的哦,我看了一下手册,也知道STC像AVR单片机一样。有两个SBUFF ...
既然是全双工的,肯定是能够在接收的时候发送的,这个没得讨论的,如果是芯片问题那就没办法了。仔细推导自己的程序吧。 学习了,谢谢 初学者,对串口工作原理一点都没搞清,多看看书比在这里问要好,无论是没事的还是死机的,程序都没这样的写法。 你这个程序应该在一直发送
页:
[1]