找回密码
 立即注册
查看: 463|回复: 8

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

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:37
  • 最近打卡:2025-04-27 18:22:16

18

主题

30

回帖

476

积分

中级会员

积分
476
发表于 2024-12-10 18:00:56 | 显示全部楼层 |阅读模式

有没有大佬,请教一下。

我用的是STC32做的ADC采样板,一个板子不够,做了四块,当做485子设备采集。

子设备平时不发数据,只有上位机发送MCUid的时候,才发出数据。

现在的情况是这样。一块板子,或者两块板子,传过来的数据都正常。

随便三块,四块连在一起的时候,上位机收到的数据就不完整了。

疑点:

1.我的485串口只连了A,B,没有接地,接地过来的数据乱码。

2.每个板子上都焊接了一块终端电阻,会不会有影响。

3.USB转485线必须接到上位机上,才能烧录MCU,不然就会通讯失败,或者时钟频率有误差。USB线接电脑上正常。
image.png

原理图:

image.png

pcb:

image.png

单片机程序:

for(i=0; i<7; i++)
		{
		printf("%02X",ID_ADDR[i]);
		sprintf (temp_mcuid,"%02X",ID_ADDR[i]);
		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");
			}
		
	}
QT上位机小佬,努力学习嵌入式中,感谢各位大佬指导
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:37
  • 最近打卡:2025-04-27 18:22:16

18

主题

30

回帖

476

积分

中级会员

积分
476
发表于 2024-12-10 18:10:11 | 显示全部楼层

不知道是不是这个问题

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

点评

应该是这个问题。 带2个120欧姆的电阻后,负载太大。会导致数据异常。  详情 回复 发表于 2024-12-10 19:55
QT上位机小佬,努力学习嵌入式中,感谢各位大佬指导
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2024-12-10 19:35:46 | 显示全部楼层
终端电阻只有在线比较长的情况下才需要(15米以上)
线短不需要终端电阻,防止信号反射的
485必须是链形网络,禁止使用星形网络
终端电阻只能接在首尾,中间不许接(一对一通信是接在接收端,如422,但485是多机通信互为主从,数据是双向的,所以两头都接)
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2024-12-10 19:41:20 | 显示全部楼层

485:
截图202412101938417904.jpg

422:
截图202412101941153460.jpg

DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:514
  • 最近打卡:2025-05-02 10:18:47

24

主题

515

回帖

990

积分

荣誉版主

积分
990
发表于 2024-12-10 19:55:15 | 显示全部楼层
houy*** 发表于 2024-12-10 18:10
不知道是不是这个问题
③用万用表测量RS485收发器芯片终端脚AB之间的电阻值是否为120Ω。特别需要注意的是 ...

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

点评

我的每块板子都带了一个120欧电阻,连接一两块数据接收正常,三块板子开始数据就不完整了。我去掉电阻试试  发表于 2024-12-11 08:49
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:37
  • 最近打卡:2025-04-27 18:22:16

18

主题

30

回帖

476

积分

中级会员

积分
476
发表于 2024-12-11 09:39:28 | 显示全部楼层
Debu*** 发表于 2024-12-10 19:35
终端电阻只有在线比较长的情况下才需要(15米以上)
线短不需要终端电阻,防止信号反射的
485必须是链形网 ...

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

点评

终端电阻都拆掉  详情 回复 发表于 2024-12-11 10:43
QT上位机小佬,努力学习嵌入式中,感谢各位大佬指导
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2024-12-11 10:43:21 | 显示全部楼层
houy*** 发表于 2024-12-11 09:39
我的四块板子分布在40*40cm的亚克力板上
每个都焊了终端电阻
现在是一跟根线分出来四根线,应该是星形网 ...

终端电阻都拆掉
DebugLab
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 13:23 , Processed in 0.137387 second(s), 90 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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