打印
[STC单片机]

求助, 485通讯问题

[复制链接]
1967|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
luckyfeng0501|  楼主 | 2014-1-14 16:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用usb转232发送和接收都成功,但是用usb转485不管发什么接收都是00,MAX485的使能已经设置了
// 测试主文件
#include <intrins.h>
#include <math.h>
#include <STC12C5616AD.H>
sbit v2=P1^2;
sbit v1=P1^3;
sbit P32 = P3^2;
        #ifndef uchar
          #define uchar unsigned char       
        #endif
        #ifndef uint
          #define uint unsigned int
        #endif
        #ifndef ulong
          #define ulong unsigned long
        #endif
typedef  struct
{        uchar    ProType;    // 协议类型
        uchar    PCReFlag;   // 串口接收到数据有标志
        uint     PCReLen;    // PC接收长度
        uint     PCSeLen;    // PC发送的数据长度
        uchar    *PSend;     // 发送指针
}PCSerialCfgStruct;
PCSerialCfgStruct          PCSerialCfg1;    // PC串口1通信用的变量
uchar FullData[100];    //完整命令缓存
uchar SendBuf[100];     //发送缓存

void Inint_Port()
{         
SCON=0x50;;
PCON=0x80;
AUXR |= 0x40;                //定时器1时钟为Fosc,即1T
AUXR &= 0xfe;                //串口1选择定时器1为波特率发生器
TMOD &= 0x0f;                //清除定时器1模式位
TMOD=0x20;
TH1=0xD9;
TL1=0xD9;
TR1=1;
EA=1;
ES=1;
}


/****************串行口1发送****************/
void UART_1Send()
{   
        uint i;
        P32=1;
        PCSerialCfg1.PCSeLen = PCSerialCfg1.PCReLen;       //发送总长度
        PCSerialCfg1.PSend = &SendBuf[0];  //   发送指针
        for(i=0;i<PCSerialCfg1.PCSeLen;i++)
        {
                SendBuf[i] =  FullData[i];
        }
        if(SendBuf[3]==0xA0)
        {
                 if(v1==0)
                 {
                        SendBuf[4] = 0x01;
                 }
        }
        else if(SendBuf[3]==0xA1)
        {
                  if(v2==0)
                 {
                        SendBuf[4] = 0x01;
                 }
        }
        P32=1;       
        SBUF = *PCSerialCfg1.PSend++;
        PCSerialCfg1.PCSeLen--;

}
void InitPCSer()
{
        PCSerialCfg1.PCReFlag = 0;
        PCSerialCfg1.PCSeLen = 0;
        PCSerialCfg1.PCReLen = 0;
}
uchar temp1 ,flag1;
void   main()
{       
        Inint_Port();  // 硬件初始化函数
        InitPCSer();
        P32=1;
        flag1 = 0;
                while(1)
        {       
               
                if(PCSerialCfg1.PCReFlag==1)
                {
                        PCSerialCfg1.PCReFlag = 0;
                        UART_1Send();
                        PCSerialCfg1.PCReLen = 0;
                }
                if(flag1==1)
                {
                        P32=1;                                 
                        flag1=0;
                        SBUF=temp1;
                }
        }
}


void RevicePCCommand()
{
        uchar Ta;
        Ta = SBUF;

        if(Ta==0x03)
        {
                FullData[PCSerialCfg1.PCReLen++] = Ta;
                PCSerialCfg1.PCReFlag = 2;
        }
        else if(PCSerialCfg1.PCReFlag==2)
        {
                FullData[PCSerialCfg1.PCReLen++] = Ta;
                if(PCSerialCfg1.PCReLen>5)      //PC发送的命令 大于一定长度
                {
                        if(Ta==0x01)
                        {
                                PCSerialCfg1.PCReFlag = 1;
                        }
                }
        }
}

void SendPCCommand()
{
        if(PCSerialCfg1.PCSeLen>0)
        {       
                P32=1;               
                SBUF = *PCSerialCfg1.PSend++;
                PCSerialCfg1.PCSeLen--;
        }
        else
        {
        P32=0;
        }
}
void serial_0(void)interrupt 4   /* S0 */
{
    if(_testbit_(RI))
    {        P32=0;
           //        flag1=1;
        //        temp1=SBUF;
               
                RevicePCCommand();
    }
    if(_testbit_(TI))   // 对PC发送
    {       
                P32=0;
                SendPCCommand();
    }
}

相关帖子

沙发
yuanquan12345| | 2014-1-14 16:47 | 只看该作者
正在学习通信。

使用特权

评论回复
板凳
iambenq| | 2014-1-17 12:59 | 只看该作者
485对端连的是什么?怎么连接的?能给个示意图吗?
usb转232能成功,至少说明程序功能上是好的。

使用特权

评论回复
地板
iambenq| | 2014-1-17 13:00 | 只看该作者
485对端连的是什么?怎么连接的?能给个示意图吗?
usb转232能成功,至少说明程序功能上是好的。

使用特权

评论回复
5
delin17| | 2014-1-17 13:57 | 只看该作者
你是怎么测试485的?
把AB短路?和测232一样?

使用特权

评论回复
6
ningling_21| | 2014-1-17 13:58 | 只看该作者
转485电路图有没有问题?

使用特权

评论回复
7
guangbiao| | 2014-1-17 14:34 | 只看该作者
你用示波器测一下2根通讯线路,数据在线路上是差分信号的。。。
如果一条线没反应,485靠其中一条线也是勉强能通讯的,具体是A线还是B线,我不记得了,但单独靠另外一条线是通不了的。
485做长距离通讯的时候,比如50米以上的通讯时,注意添加一些接口保护器件,不然接口芯片容易坏掉。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝