tanguicaicai 发表于 2012-8-3 16:18:41

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;
       
}像这样写,单片机会进入死循环,为什么?想不通啊

lcw_swust 发表于 2012-8-3 17:00:58

有可能在串口中断函数里清0了TI

tanguicaicai 发表于 2012-8-3 17:33:28

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;

        }

中断函数是 这样,大虾帮帮看看,看能不能做到全双工

usk5yenj4id04dm 发表于 2012-8-3 20:28:21

弄简单些,就不要搞中断了,直接查询吧.

wicy001 发表于 2012-8-3 21:50:25

中断里,可不就是TI清0 嘛if(TI){TI=0;}

发送数据时,死在while(!TI)了



kkk529699480 发表于 2012-8-3 22:45:29

俺了解的串口是半双工的,无论什么串口,都是半双工的,STC的。。。不做评论

试试看把ES换成EA你试试

tanguicaicai 发表于 2012-8-4 08:52:14

wicy001 发表于 2012-8-3 21:50 static/image/common/back.gif
中断里,可不就是TI清0 嘛if(TI){TI=0;}

发送数据时,死在while(!TI)了

谢谢,是死在这里了,

tanguicaicai 发表于 2012-8-4 08:55:09

kkk529699480 发表于 2012-8-3 22:45 static/image/common/back.gif
俺了解的串口是半双工的,无论什么串口,都是半双工的,STC的。。。不做评论

试试看把ES换成EA你试试 ...

我做了一下试验,有主循环里隔10MS以送一次,然后用PC机给单片机发送,
以5MS发送一次,结果是,发送了500多次,单片机只接到200多次,其他的300多没了,
看来以后还是得要SPI这才是全双工的啊

wicy001 发表于 2012-8-4 15:00:22

tanguicaicai 发表于 2012-8-4 08:55 static/image/common/back.gif
我做了一下试验,有主循环里隔10MS以送一次,然后用PC机给单片机发送,
以5MS发送一次,结果是,发送了50 ...

看了一下stc12的手册,它的串口有两个独立的接收和发送缓冲器,共用一个地址码。它的结构图也明确标了2个buffer,此型号单片机确实可以做成全双工。

你可以设置两个全局变量,在接收和发送中断里,让两个变量加1,看看接收和发送的数据个数是否正确。如果正确,则说明你的主程序编的有问题,将数据漏掉了。

ken_zq 发表于 2012-8-4 20:14:34

kkk529699480 发表于 2012-8-3 22:45 static/image/common/back.gif
俺了解的串口是半双工的,无论什么串口,都是半双工的,STC的。。。不做评论

试试看把ES换成EA你试试 ...

51单片机的串口就是全双工的啊

ken_zq 发表于 2012-8-4 20:21:59

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位数。虽然我感觉自己算错了,但是也差不多这道理。

tanguicaicai 发表于 2012-8-5 15:39:21

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的时间间隔。

hlfqzy 发表于 2012-8-6 11:26:59

学习了,谢谢

william_rain 发表于 2012-8-6 11:40:28

{:smile:}{:smile:}

ken_zq 发表于 2012-8-6 20:31:00

tanguicaicai 发表于 2012-8-5 15:39 static/image/common/back.gif
按这么算的话~差不多1MS才以发完一个数据的哦,我看了一下手册,也知道STC像AVR单片机一样。有两个SBUFF ...

既然是全双工的,肯定是能够在接收的时候发送的,这个没得讨论的,如果是芯片问题那就没办法了。仔细推导自己的程序吧。

wzd 发表于 2012-9-28 15:43:30

学习了,谢谢

BDXing6 发表于 2012-9-28 19:28:15

初学者,对串口工作原理一点都没搞清,多看看书比在这里问要好,无论是没事的还是死机的,程序都没这样的写法。

dtlz 发表于 2012-9-28 20:04:00

你这个程序应该在一直发送
页: [1]
查看完整版本: STC单片机串口通信的问题