标题: 单片机+RS485连接4个从机,必须同时连接四个才能工作,主机的EA和ES都是关闭状态 [打印本页]

作者: kill2007    时间: 2022-5-6 13:38
标题: 单片机+RS485连接4个从机,必须同时连接四个才能工作,主机的EA和ES都是关闭状态
    while (1)
    {



        delay_1ms(5);
        SEND_data(0x01);    //获取主机一的数据
        delay_1ms(5);
        DISplay_RT_1();              //显示获取的数据


        delay_1ms(5);
        SEND_data(0x02);    //获取主机二的数据
        delay_1ms(5);
        DISplay_RT_2();              //显示获取的数据
//
//
        delay_1ms(5);
        SEND_data(0x03);    //获取主机三的数据
        delay_1ms(5);
        DISplay_RT_3();              //显示获取的数据


        delay_1ms(5);
        SEND_data(0x04);    //获取主机四的数据
        delay_1ms(5);
        DISplay_RT_4();              //显示获取的数据

    }



作者: Hephaestus    时间: 2022-5-7 00:49
多半是没有上下拉导致空闲时总线状态不确定导致的。用示波器看过波形了吗?
作者: xuyaqi    时间: 2022-5-7 10:35
程序编制应加上,任何一路长时间没应答信号,应跳过进行下一路操作,否则会死在没连接那路。
作者: Hephaestus    时间: 2022-5-7 10:49
xuyaqi 发表于 2022-5-7 10:35
程序编制应加上,任何一路长时间没应答信号,应跳过进行下一路操作,否则会死在没连接那路。

EA、ES都关闭了,那就只能是查询式,死在没应答信号的可能性基本没有。
作者: kill2007    时间: 2022-5-9 13:25
Hephaestus 发表于 2022-5-7 00:49
多半是没有上下拉导致空闲时总线状态不确定导致的。用示波器看过波形了吗?

有上下拉电阻,用proteus仿真也是必须四个同时在线才能正常工作
作者: kill2007    时间: 2022-5-9 13:38
Hephaestus 发表于 2022-5-7 10:49
EA、ES都关闭了,那就只能是查询式,死在没应答信号的可能性基本没有。

那该怎么改呢,我不知道它是卡在那个地方,是卡在读不到下位机传输的数据上还是卡在将数据显示在显示屏上
作者: kill2007    时间: 2022-5-9 13:48
xuyaqi 发表于 2022-5-7 10:35
程序编制应加上,任何一路长时间没应答信号,应跳过进行下一路操作,否则会死在没连接那路。

对,我想了一下就是发送地址读数据超时然后就一直死在那个程序了,这是我读数据程序,该怎么解决呢?
  1. unsigned char SEND_data(unsigned char addr)
  2. {
  3.     unsigned char i = 0;

  4.     Rs485_die = 1;
  5.     TB8 = 1;
  6.     TI = 0;
  7.     SBUF = addr;
  8.     while (!TI);
  9.     TI = 0;

  10.     Rs485_die = 0;
  11.     for (i = 0; i < 4; i++)
  12.     {
  13.         RI = 0;
  14.         while (!RI);
  15.         RH_TP[i] [i]= SBUF;
  16.         RI = 0;

  17.     }



  18.     Rs485_die = 1;
  19. }
复制代码


作者: xuyaqi    时间: 2022-5-9 16:09
kill2007 发表于 2022-5-9 13:48
对,我想了一下就是发送地址读数据超时然后就一直死在那个程序了,这是我读数据程序,该怎么解决呢?

for (i = 0; i < 4; i++)
{
        unsigned int m;
       
        RI = 0;
        m=0;
        while(!RI)
        {
         m=m+1;
         if(m>10000){i=5;break;}
        }
        RH_TP = SBUF;
        RI = 0;
}
作者: kill2007    时间: 2022-5-10 22:57
xuyaqi 发表于 2022-5-9 16:09
for (i = 0; i < 4; i++)
{
        unsigned int m;

okok,非常感谢大佬




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1