houyawei 发表于 2024-12-10 18:00:56

用485通讯,收到的数据不完整是什么情况

<p>有没有大佬,请教一下。</p>
<p>我用的是STC32做的ADC采样板,一个板子不够,做了四块,当做485子设备采集。</p>
<p>子设备平时不发数据,只有上位机发送MCUid的时候,才发出数据。</p>
<p>现在的情况是这样。一块板子,或者两块板子,传过来的数据都正常。</p>
<p>随便三块,四块连在一起的时候,上位机收到的数据就不完整了。</p>
<p>疑点:</p>
<p>1.我的485串口只连了A,B,没有接地,接地过来的数据乱码。</p>
<p>2.每个板子上都焊接了一块终端电阻,会不会有影响。</p>
<p>3.USB转485线必须接到上位机上,才能烧录MCU,不然就会通讯失败,或者时钟频率有误差。USB线接电脑上正常。<br />
<img src="data/attachment/forum/202412/10/180640u867bzc0wpw9zr6l.png" alt="image.png" title="image.png" /></p>
<p>原理图:</p>
<p><img src="data/attachment/forum/202412/10/175739f8v58josfamjz7uw.png" alt="image.png" title="image.png" /></p>
<p>pcb:</p>
<p><img src="data/attachment/forum/202412/10/175818q8f29q1m261l2q22.png" alt="image.png" title="image.png" /></p>
<p>单片机程序:</p>
<pre><code>for(i=0; i&lt;7; i++)
                {
                printf(&quot;%02X&quot;,ID_ADDR);
                sprintf (temp_mcuid,&quot;%02X&quot;,ID_ADDR);
                strcat(mcuid,temp_mcuid);
                }
                mcuid='\0';
                printf(&quot;MCUID:%s \r\n&quot;,mcuid);
        while (1)
        {
                if(TX1_Cnt != RX1_Cnt) P32 = 1;
                else
                {
                        rec_buffer='\0';
                        P32 = 0;
                }
                adc_result = '\0';

                delay_ms(10);
               if((TX1_Cnt != RX1_Cnt) &amp;&amp; (!B_TX1_Busy))   //收到数据, 发送空闲
      {
                                                P32 = 1;
                                          sprintf (temp_buffer,&quot;%c&quot;,RX1_Buffer);
                                          strcat(rec_buffer,temp_buffer);
//            SBUF = RX1_Buffer;
//            B_TX1_Busy = 1;
            if(++TX1_Cnt &gt;= UART1_BUF_LENGTH)   TX1_Cnt = 0;
                               
      }
               
                                if(strcmp(rec_buffer,mcuid)==0)
                                {
                                                for(i=0; i&lt;15; i++)
                                        {
                                                delay_ms(10);
                                                ADC_convert(i);                //发送轮询通道AD值
                                        }
                                                printf(&quot;MCUID;%s;&quot;,mcuid);
                                                printf(&quot;adc_result;%s&quot;,adc_result);
                                                printf(&quot;\r\n&quot;);
                        }
               
        }
</code></pre>

houyawei 发表于 2024-12-10 18:10:11

<p>不知道是不是这个问题</p>
<p>③用万用表测量RS485收发器芯片终端脚AB之间的电阻值是否为120Ω。特别需要注意的是有些USB转RS485模块的终端脚已经加上了120Ω的电阻,若在后面的RS485收发器芯片终端AB脚加120Ω电阻,会使阻抗失配导致数据异常,这时需要取掉一个120Ω电阻。</p>

DebugLab 发表于 2024-12-10 19:35:46

终端电阻只有在线比较长的情况下才需要(15米以上)
线短不需要终端电阻,防止信号反射的
485必须是链形网络,禁止使用星形网络
终端电阻只能接在首尾,中间不许接(一对一通信是接在接收端,如422,但485是多机通信互为主从,数据是双向的,所以两头都接)

DebugLab 发表于 2024-12-10 19:41:20


485:


422:


社区闲人 发表于 2024-12-10 19:55:15

houyawei 发表于 2024-12-10 18:10
不知道是不是这个问题
③用万用表测量RS485收发器芯片终端脚AB之间的电阻值是否为120Ω。特别需要注意的是 ...

应该是这个问题。
带2个120欧姆的电阻后,负载太大。会导致数据异常。

houyawei 发表于 2024-12-11 09:39:28

DebugLab 发表于 2024-12-10 19:35
终端电阻只有在线比较长的情况下才需要(15米以上)
线短不需要终端电阻,防止信号反射的
485必须是链形网 ...

我的四块板子分布在40*40cm的亚克力板上
每个都焊了终端电阻
现在是一跟根线分出来四根线,应该是星形网络
我一个个排查吧

DebugLab 发表于 2024-12-11 10:43:21

houyawei 发表于 2024-12-11 09:39
我的四块板子分布在40*40cm的亚克力板上
每个都焊了终端电阻
现在是一跟根线分出来四根线,应该是星形网 ...

终端电阻都拆掉
页: [1]
查看完整版本: 用485通讯,收到的数据不完整是什么情况