6221|9

219

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

485通讯问题(C语言) [复制链接]

我写了一个485通讯程序,实现单片机(PIC16F877A)收发数据(上位机),用串口调试助手(232)调试不通,哪位大侠帮我看看程序,谢谢!

#include <pic.h>
__CONFIG(0x3531);
#define nop  asm("NOP") 
bank1 unsigned char count[8]={0x01,0x01,0x01,0x01,0x03,0x03,0x03,0x03}; //串口发送缓存,可以改变缓存个数
unsigned char flag=0;
unsigned char  reveive[8];
//=========================延时1MS函数=======================================
void delay(unsigned int n)
 {
   unsigned int i,j;
   for(i=0;i<n;i++)
      for(j=0;j<110;j++);
 }

//==========================串口设置===============================
void instuart(void) 
{
     TRISB = 0xC0;
     TRISC = 0x80;
     TXSTA=0x04;    //B100  SYNC=0;BRGH=1 异步高速方式传输8bit数据
  RCSTA=0x80;    //SPEN=1;允许同步串行口工
  SPBRG=0x25;    //将传输的波特率设置为9600
  PIR1=0x00;
     RCIF=0;
     PIE1=PIE1|0x20; 
     CREN=1;        //允许接收数据
     TXEN=1;        //允许发送数据
     INTCON=0xC0;
}
//======================485接收中断=============================
void interrupt LOW_ISR()
{
   unsigned int i=0;
  if(RCIF==1)
  {
   reveive=RCREG;
   i++;
   if(i==8)
    {
     flag=1;    //可以放数据的解析函数在里面
    }
  }
}

//=======================接收主函数===================================
main()
{
  unsigned int j;
  instuart();
  RB1=1;
  while(1)
   {
   if(flag==1)
      {
        flag=0; 
        RB1=0;       
        delay(1);        
        for(j=0;j<8;j++)
         {
           TXREG=count[j];
           delay(1);
         }
       // while(TXIF!=1);
        RB1=1;
        delay(1);
      }
   }
}

此帖出自编程基础论坛

最新回复

从最基本的查起,先检查单片机的TX端是否有数据出来,如果数据有,那在检查485总线上有没有数据,如果没有有两种情况了:1 有可能是DE和RE端的控制信号错了。2 就要检查485芯片是否完好。  详情 回复 发表于 2011-7-8 14:53
点赞 关注
 

回复
举报

219

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
唉,又沉了
此帖出自编程基础论坛
 
 
 

回复

219

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
唉,又沉了
此帖出自编程基础论坛
 
 
 

回复

3404

帖子

6

TA的资源

裸片初长成(初级)

4
 
485和普通串口没什么区别,只不过485是半双工的而已。先别用485看看能通不。能通的话再看看485控制方向的管脚是否正确
此帖出自编程基础论坛
 
 
 

回复

1027

帖子

0

TA的资源

五彩晶圆(中级)

5
 
楼上正解
485为半双工
即收发是单向的
一条总线上 只有一个处于发送状态 其他的都为接收状态
485有控制换向端
先检测换向端的控制是否正确
此帖出自编程基础论坛
 
 
 

回复

1027

帖子

0

TA的资源

五彩晶圆(中级)

6
 
你的 程序中 没有控制换向端嘛
此帖出自编程基础论坛
 
 
 

回复

537

帖子

0

TA的资源

五彩晶圆(初级)

7
 
这个还要看硬件的情况,如果有自动流控的话,可以这样做,如果没有,就得按照上面的兄弟说的那样处理了。建议先调试232通讯,调通后,在这个基础上做485。
此帖出自编程基础论坛
 
 
 

回复

219

帖子

0

TA的资源

一粒金砂(中级)

8
 
#include __CONFIG(0x3531); #define uchar unsigned char #define uint unsigned int uint i=0; uchar tran[8]; //SCI部件初始化子程序 void sciint() { TRISB = 0xc0; TRISC = 0x80; INTCON=0x00; SPBRG=0x19; //将传输的波特率设置为9600 TXSTA=0x04;//B100 SYNC=0;BRGH=1 异步高速方式传输8bit数据 RCSTA=0x80;//SPEN=1;允许同步串行口工作 RCIE = 1 ; TXIE = 0 ; PEIE=1; } void main () { sciint();//SCI部件初始化子程序 while(1) { RB1=1; CREN=1; //允许数据接收 while(1) { if(RCIF==1) break; } tran=RCREG; i++; if(i==8) RB1=0; TXEN=1; TXREG=tran[0]; while(1) { if(TXIF==1) break; } } } 我把程序改了可是能接收到就是发不出去,控制端是RB1口,还有我想接收发送十位怎么样处理好呢? [ 本帖最后由 烟雨 于 2011-7-8 11:32 编辑 ]
此帖出自编程基础论坛
 
 
 

回复

406

帖子

0

TA的资源

纯净的硅(中级)

9
 
从最基本的查起,先检查单片机的TX端是否有数据出来,如果数据有,那在检查485总线上有没有数据,如果没有有两种情况了:1 有可能是DE和RE端的控制信号错了。2 就要检查485芯片是否完好。
此帖出自编程基础论坛
 
个人签名STM32 开发板  带CAN  RS485 接口
http://shop66177872.taobao.com
 
 

回复

219

帖子

0

TA的资源

一粒金砂(中级)

10
 
现在我在线调试时为啥到RCSTA=0x80这一步TX脚总是高电平?
此帖出自编程基础论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表