找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2179|回复: 1
打印 上一主题 下一主题
收起左侧

单片机+RS485通信程序问题

[复制链接]
跳转到指定楼层
楼主
ID:477505 发表于 2020-1-9 11:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这段代码要改成这样,例如:发送01 06 00 01 00 17  接收01 06 00 01 00 17
有大神帮我改改吗,刚学还有很多不懂

void Uart3_Init(void)
{                                 
        S3CON |= 0x50;                  //串口3选择定时器3为波特率发生器,启动串行接收器
        S3CON &= 0x70;                  //8位数据,可变波特率

        T3H=(65536-(MAIN_Fosc/12/4/BAUD))/256;
        T3L=(65536-(MAIN_Fosc/12/4/BAUD))%256;
        
        T4T3M |= 0x08;       //允许定时器3运行
        IE2 |= 0x08;         // 串口3中断打开
        IE2 &= 0xDF;         // 关闭定时器3中断
        EA = 1;                                        // 总中断打开
}

void SendDataByUart3(uint8 dat)
{
    S3BUF = dat;                 //写数据到UART数据寄存器
        while(!(S3CON&S3TI));        //在停止位没有发送时,S3TI为0即一直等待
    S3CON&=~S3TI;                //清除S3CON寄存器对应S3TI位(该位必须软件清零)
}


void U3SendString(uint8 *s)
{
    IE2 &= 0xF7;                                        // 串口3中断关闭
        while (*s)                       //检测字符串结束标志
    {

                        SendDataByUart3(*s++);         //发送当前字符
    }
    IE2 |= 0x08;                     // 串口3中断打开
}

int main()
{
          P0M1 &= 0xFE;        P0M0 &= 0xFE;                          //设置P0.0为准双向口
        P0M1 &= 0xFD;        P0M0 |= 0x02;                          //设置P0.1为推挽输出
        
        rs485_dr=0;      //控制485接收
        Uart3_Init();
        

        while(1)
        {
                if(temp1==50)   //接收到的数为“2”
                {
                        rs485_dr=1;   //控制485发送
                        U3SendString("Hello World\r\n");        //通过串口2发送字符串“FIYU”
                        uart3_rflage=0;                   //清零串口2接收标识符
                        rs485_dr=0;                       //控制485接收
                        delay_ms(10);                     //初始化后延时
                        temp1=0;                          //清零接收的临时数据
                }
        }
}

void Uart3() interrupt 17 using 1
{
        IE2 &= 0xF7;                                        // 串口3中断关闭
        if (S3CON & S3RI)                //串行接收到停止位的中间时刻时,该位置1
          {
              S3CON &= ~S3RI;              //清除S3CON寄存器对应S3RI位(该位必须软件清零)
                  temp1 = S3BUF;               //把串口3缓存SBUF寄存器数据存放到数组temp1中
                  uart3_rflage = 1;                 
           }
           if (S3CON & S3TI)                //在停止位开始发送时,该位置1
           {
              S3CON &= ~S3TI;                                //清除S3CON寄存器对应S3TI位(该位必须软件清零)
           }
        IE2 |= 0x08;                     // 串口3中断打开
}



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:619594 发表于 2020-1-9 15:41 | 只看该作者
你好!
对于你这段代码来说,要实现你说的功能,基本是要重新写了
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表