用485通讯,收到的数据不完整是什么情况
2024-12-10 18:00 来自 houyawei 发布 @ 综合讨论
<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<7; i++)
{
printf("%02X",ID_ADDR);
sprintf (temp_mcuid,"%02X",ID_ADDR);
strcat(mcuid,temp_mcuid);
}
mcuid[15]='\0';
printf("MCUID:%s \r\n",mcuid);
while (1)
{
if(TX1_Cnt != RX1_Cnt) P32 = 1;
else
{
rec_buffer[0]='\0';
P32 = 0;
}
adc_result[0] = '\0';
delay_ms(10);
if((TX1_Cnt != RX1_Cnt) && (!B_TX1_Busy)) //收到数据, 发送空闲
{
P32 = 1;
sprintf (temp_buffer,"%c",RX1_Buffer[TX1_Cnt]);
strcat(rec_buffer,temp_buffer);
// SBUF = RX1_Buffer[TX1_Cnt];
// B_TX1_Busy = 1;
if(++TX1_Cnt >= UART1_BUF_LENGTH) TX1_Cnt = 0;
}
if(strcmp(rec_buffer,mcuid)==0)
{
for(i=0; i<15; i++)
{
delay_ms(10);
ADC_convert(i); //发送轮询通道AD值
}
printf("MCUID;%s;",mcuid);
printf("adc_result;%s",adc_result);
printf("\r\n");
}
}
</code></pre>
<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<7; i++)
{
printf("%02X",ID_ADDR);
sprintf (temp_mcuid,"%02X",ID_ADDR);
strcat(mcuid,temp_mcuid);
}
mcuid[15]='\0';
printf("MCUID:%s \r\n",mcuid);
while (1)
{
if(TX1_Cnt != RX1_Cnt) P32 = 1;
else
{
rec_buffer[0]='\0';
P32 = 0;
}
adc_result[0] = '\0';
delay_ms(10);
if((TX1_Cnt != RX1_Cnt) && (!B_TX1_Busy)) //收到数据, 发送空闲
{
P32 = 1;
sprintf (temp_buffer,"%c",RX1_Buffer[TX1_Cnt]);
strcat(rec_buffer,temp_buffer);
// SBUF = RX1_Buffer[TX1_Cnt];
// B_TX1_Busy = 1;
if(++TX1_Cnt >= UART1_BUF_LENGTH) TX1_Cnt = 0;
}
if(strcmp(rec_buffer,mcuid)==0)
{
for(i=0; i<15; i++)
{
delay_ms(10);
ADC_convert(i); //发送轮询通道AD值
}
printf("MCUID;%s;",mcuid);
printf("adc_result;%s",adc_result);
printf("\r\n");
}
}
</code></pre>
- 最近查阅:
免责声明:
本平台旨在开源共享精神,请勿发布敏感信息,任何违法信息我们将移交公安机关;
上一篇: AI8051U芯片到了
下一篇: 求结构体讲解视频