OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2544|回复: 5

求问:485通讯异常,咋解决啊?

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2019-8-31
在线时间
4 小时
发表于 2019-10-18 20:16:58 | 显示全部楼层 |阅读模式
3金钱
485通讯采集两块传感器数据。环境:stm32f103c8t6开发板和一块传感器安装在变压器附近,485接口用普通线连接并连接Lora模块。另一块传感器挂在远端变频控制柜附近,485接口与Lora模块相连,即两者采用Lora模块进行无线通讯,完成数据采集与分析。问题是变压器端传感器模块数据采集出现通讯异常,采用串口监听看不到控制板发送和接收的指令,问题在哪呢?如何解决?


另:如果采用工频控制柜上,则上述两块传感器与控制板间通讯正常,难道是瞎猫碰成功的?咨询了一些专家:说近端采用屏蔽双绞线,屏蔽层接地,能解决吗?跪求高手指导!!!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2019-10-19 02:15:39 | 显示全部楼层
找个能用的485模块或者工具,测试下先。
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2019-8-31
在线时间
4 小时
 楼主| 发表于 2019-10-19 11:30:21 | 显示全部楼层
现场用笔记本电脑串口监听,只能看到一个传感器的接收和发送数据,一个没有。并且程序里做了相应判断,如果收发不成功应该连发3次,但均没显示,并且最后的信息应该还是收发成功了,郁闷死
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2019-8-31
在线时间
4 小时
 楼主| 发表于 2019-10-19 11:40:24 | 显示全部楼层
void communication_analysis(void)//这函数只负责处理串口2接收的数据
{
        uint8_t i;
        if(hardware_collection_JGT.flag_USART2_Receive_Data==0x01)
        {
                if((USART2_RX_BUF[0]==0x01) && (USART2_RX_BUF[1]==0x04))//设备号1回复
                {
                        memset(receive_analysis_RS1, 0, sizeof(receive_analysis_RS1));
                        for(i=0;i<9;i++)
                        {
                                receive_analysis_RS1[i]=USART2_RX_BUF[i];
                        }
                        crc16=0x00;
                        crc16=ArithCRC16(receive_analysis_RS1, 7);//CRC16校验低字节在前,高字节在后
                        if((crc16%256==receive_analysis_RS1[7]) && (crc16/256==receive_analysis_RS1[8]))//校验通过
                        {
                                receive_success_RS1=1;//从机1接收成功标志
                                timer_variable_JGT.RS485_time_out_timer=0;//关闭RS485超时监测
                                timer_variable_JGT.flag_RS485_time_out=0;//RS485超时标志清零
                                timer_variable_JGT.RS485_time_CNT=0;//超时计数清零
                                hardware_collection_JGT.error_CNT=0;//通信错误计数清零
                               
                                Addr1Data = receive_analysis_RS1[3]*16777216 + receive_analysis_RS1[4]*65536 + receive_analysis_RS1[5]*256 + receive_analysis_RS1[6];           //1号机数据
//                                Addr1Data =Addr1Data /800;
//                                memset(receive_analysis_RS1, 0, sizeof(receive_analysis_RS1));
                                delay_ms(300);
                        }
                }
                else if ((USART2_RX_BUF[0]==0x02) && (USART2_RX_BUF[1]==0x04))//设备号2回复
                {
                        memset(receive_analysis_RS2, 0, sizeof(receive_analysis_RS2));
                        for(i=0;i<9;i++)
                        {
                                receive_analysis_RS2[i]=USART2_RX_BUF[i];
                        }
                        crc16=0x00;
                        crc16=ArithCRC16(receive_analysis_RS2, 7);//CRC16校验低字节在前,高字节在后
                        if((crc16%256==receive_analysis_RS2[7]) && (crc16/256==receive_analysis_RS2[8]))//校验通过
                        {
                                receive_success_RS2=1;//从机2接收成功标志
                                timer_variable_JGT.RS485_time_out_timer=0;//关闭RS485超时监测
                                timer_variable_JGT.flag_RS485_time_out=0;//RS485超时标志清零
                                timer_variable_JGT.RS485_time_CNT=0;//超时计数清零
                                hardware_collection_JGT.error_CNT=0;//通信错误计数清零
                                Addr2Data = receive_analysis_RS2[3]*16777216 + receive_analysis_RS2[4]*65536 + receive_analysis_RS2[5]*256 + receive_analysis_RS2[6];//2号机数据
//                                Addr2Data =Addr2Data /800;
                        }
                }
                if ( (receive_success_RS2==1) && (receive_success_RS1==1))//开机读取表的数值,便于作差
                {
                        if(FIRSTASK==0)    //第一次开机取值
                        {
                                addr1temp = Addr1Data;
                                addr2temp = Addr2Data;
                        }
                        FIRSTASK++;
                        if(FIRSTASK>2) FIRSTASK=2;                       
                }
                //清转存缓存
                //相关标识清零
                hardware_collection_JGT.flag_USART2_Receive_Data=0x00;
                //清接收缓存
                memset(USART2_RX_BUF, 0, sizeof(USART2_RX_BUF));
                //清接收计数
                USART2_RX_CNT=0;
        }
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2019-8-31
在线时间
4 小时
 楼主| 发表于 2019-10-19 14:40:47 | 显示全部楼层
没人遇到啊
回复

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2019-10-22 09:11:06 | 显示全部楼层
先要确定是485在有线传输过程中被干扰,还是无线模块在传输时被干扰。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-2 20:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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