c8051f340串口通信,只能收不能发?

[复制链接]
4801|8
 楼主| jin1song 发表于 2012-4-21 09:28 | 显示全部楼层 |阅读模式
请教各位,用c8051f340做的rs485串口通信程序,出现的情况是只能收不能发,原理图中485电平转换芯片的RE DE连在一起接到单片机上,485芯片的RE DE不晓得处理的对吗,谢谢各位。程序如下:

  1. void main()
  2. {  char g;
  3. PCA0MD &=~0x40
  4. Init_Device();
  5. while(1)
  6. { DE=0;  
  7.   while(RI0==0);   //接收   
  8.   RI0=0;
  9.   g=SBUF0;
  10.   
  11.    _nop_(); //延时10ms
  12.   _nop_();
  13.   _nop_();
  14.   _nop_();
  15.   _nop_();
  16.   _nop_();
  17.   _nop_();
  18.   _nop_();
  19.   _nop_();
  20.   _nop_();
  21.   _nop_();
  22.   _nop_();
  23.   _nop_();
  24.   _nop_();
  25.   _nop_();
  26.   _nop_();
  27.   _nop_();
  28.   _nop_();
  29.   _nop_();
  30.   _nop_();
  31.   _nop_();
  32.   _nop_();
  33.   _nop_();
  34.   _nop_();
  35.   _nop_();
  36.   _nop_();
  37.   _nop_();
  38.   _nop_();
  39.   _nop_();
  40.   _nop_();
  41.   _nop_();
  42.   _nop_();
  43.   _nop_();
  44.   _nop_();
  45.   _nop_();
  46.   _nop_();
  47.   _nop_();
  48.   _nop_();
  49.   _nop_();
  50.   _nop_();
  51.   _nop_();
  52.   _nop_();
  53.   _nop_();
  54.   _nop_();
  55.   _nop_();
  56.   _nop_();
  57.   _nop_();
  58.   _nop_();
  59.   _nop_();
  60.   _nop_();
  61.   _nop_();
  62.   _nop_();
  63.   _nop_();
  64.   _nop_();
  65.   _nop_();
  66.   _nop_();
  67.   _nop_();
  68.   _nop_();
  69.   _nop_();
  70.   _nop_();
  71.   _nop_();
  72.   _nop_();
  73.   _nop_();
  74.   _nop_();
  75.   _nop_();
  76.   _nop_();
  77.   _nop_();
  78.   _nop_();
  79.   _nop_();
  80.   _nop_();
  81.   _nop_();
  82.   _nop_();
  83.   _nop_();
  84.   _nop_();
  85.   _nop_();
  86.   _nop_();
  87.   _nop_();
  88.   _nop_();
  89.   _nop_();
  90.   _nop_();
  91.   _nop_();
  92.   _nop_();
  93.   _nop_();
  94.   _nop_();
  95.   _nop_();
  96.   _nop_();
  97.   _nop_();
  98.   _nop_();
  99.   _nop_();
  100.   _nop_();
  101.   _nop_();
  102.   
  103.   DE=1;
  104.   if(g!='\0')  
  105.    {
  106.    SBUF0=g;     
  107.     while(TI0==0);  //发送
  108.     TI0=0;
  109.     g='\0';
  110.    }
ningling_21 发表于 2012-4-21 13:00 | 显示全部楼层
本帖最后由 ningling_21 于 2012-4-21 13:03 编辑

改一下:
用中断接收,主程序发送。
void int_uart(void) interrupt 4 // 中断程序
{
  if(RI0)
{
  RI0=0;
  g=SBUF0;
  flag=1;
}
if(TI0)
{
  TI0=0;
}
}
//主程序
while(1)
{
   if(g!='\0'  &&  flag==1)
   {
       flag=0;
       SBUF0=g;
       while(TI0==0);
       tI0=0;
   }
}
 楼主| jin1song 发表于 2012-4-21 14:56 | 显示全部楼层
楼上,用你的程序试了一下,发不出去。我把程序改了一下,可以正常收发,但是在收到数据后延时,就发不出去数据,我怀疑是485芯片的时序问题,但不知道问题出现在哪里,程序如下:

  1. void main()
  2. {       
  3.         int i,j = 0;       
  4.         PCA0MD &=~0x40;
  5.         Init_Device();               
  6.         while(1)
  7.         {        
  8.                 DE=0;               
  9.                 while(RI0==0);   //接收                       
  10.                 RI0=0;
  11.                 g=SBUF0;
  12. //在这里插入延时程序,就发不出去数据????
  13.                 DE=1;        //发送
  14.                   SBUF0=g;             
  15.                         while(TI0==0);  
  16.                    TI0=0;
  17.                              
  18.   }

  19. }

 楼主| jin1song 发表于 2012-4-21 15:36 | 显示全部楼层
求高手。郁闷中。
ningling_21 发表于 2012-4-21 16:05 | 显示全部楼层
通过示波器看看波形,就知道问题在哪里了...
另,如果开串口中断,发送前,需关中断,发送完成再开中断。
 楼主| jin1song 发表于 2012-4-21 17:13 | 显示全部楼层
请问,用示波器看那几个点的波形,怎么样才能知道问题在哪里?
 楼主| jin1song 发表于 2012-4-24 11:57 | 显示全部楼层
串口通信正常了,能发能收,但是在收发之间插入延时,就收不到,是什么问题?
ningling_21 发表于 2012-4-24 15:32 | 显示全部楼层
看你的延时有多久...
 楼主| jin1song 发表于 2012-4-24 15:39 | 显示全部楼层
延时10ms 就出问题了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:在顺境中感恩,在逆境中依旧心存喜乐,认真的活在当下!

1

主题

250

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部