OpenEdv-开源电子网

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

485串口2接收数据有误!求助!!!急!!!

[复制链接]

4

主题

73

帖子

0

精华

高级会员

Rank: 4

积分
895
金钱
895
注册时间
2017-7-28
在线时间
139 小时
发表于 2017-12-7 02:12:06 | 显示全部楼层 |阅读模式
60金钱
我用原子哥给的例程,修改了一下,串口2读485信息,再通过串口1发送至PC,观察结果。发现相同的环境和条件,485传感器读到的数据总是会变动(并且总是在两个值之间变动);改变环境,传感器的值会变化(说明能够读到传感器采集到的数据),但是仍然是在两个值之间选一个跳变。        用串口1观察接收数组的时候发现,出现了乱码,第一个字节后出现了空格,后面就不正常了。不知道哪里错了,求助!!!给出主函数如下:    可能是很小的错误,可是就是检查不出来!!很着急,跪求各位大侠帮忙看看!!!


[mw_shl_code=c,true]#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"         
#include "rs485.h"       
void sendconfig_buff(void);
void         read_addr(void);
u8 modbusbuff[8]={0x01,0x03,0x00,0x00,0x00,0x01,0x84,0x0A};
u8 read_buff[4]={0x00,0x20,0x00,0x68};
u32 buff3[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

// rs485buf
int main(void)
{         
        u8 key;

        u8 i=0,t=0,j=0;
        u8 cnt=0;
        u8 len=7;
        u32 rs485buf[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
         
        delay_init();                     //Ñóê±oˉêy3õê¼»ˉ          
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//éèÖÃÖD¶ÏóÅÏè¼¶·Ö×éÎa×é2£o2λÇàÕ¼óÅÏè¼¶£¬2λÏìó|óÅÏè¼¶
        uart_init(9600);                 //′®¿ú3õê¼»ˉÎa115200
        LED_Init();                                  //3õê¼»ˉóëLEDᬽóμÄó2¼t½ó¿ú
        LCD_Init();                                   //3õê¼»ˉLCD        
        KEY_Init();                                //°′¼ü3õê¼»ˉ                          
        RS485_Init(9600);        //3õê¼»ˉRS485
        POINT_COLOR=RED;//éèÖÃ×ÖìåÎaoìé«
        LCD_ShowString(30,130,200,16,16,"KEY0:Send");        //ÏÔê¾ìáê¾DÅÏ¢               

        POINT_COLOR=BLUE;//éèÖÃ×ÖìåÎaà¶é«          
        LCD_ShowString(30,150,200,16,16,"Count:");                        //ÏÔê¾μ±Ç°¼ÆêyÖμ       
        LCD_ShowString(30,170,200,16,16,"Send Data:");                //ìáê¾·¢ËíμÄêy¾Y       
        LCD_ShowString(30,210,200,16,16,"Receive Data:");        //ìáê¾½óêÕμ½μÄêy¾Y               
        delay_ms(200);                                                                  
        while(1)
        {       
                                 
                key=KEY_Scan(0);
                if(key==KEY0_PRES)//KEY0°′ÏÂ,·¢Ëíò»′Îêy¾Y
                {                                      
                        LED0=!LED0;
      sendconfig_buff();       

                  delay_ms(200);
      RS485_Receive_Data(rs485buf,8);
                       
                 for(j=0;j<8;j++)                       
         {          
                                          buff3[j]=rs485buf[j];  
                                          LCD_ShowxNum(100,20*j+10,(rs485buf[j]),10,16,0);       
                                                USART_SendData(USART1, rs485buf[j]);//&#207;ò′&#174;&#191;ú1·¢&#203;íêy&#190;Y
         }                         
                }
               
        }
}


void sendconfig_buff(void)
{
         RS485_Send_Data(modbusbuff,8);
}         
                       
void         read_addr(void)
{
         RS485_Send_Data(read_buff,4);
}       
                       
[/mw_shl_code]

传感器接收到的数据

传感器接收到的数据

485传感器度读数据协议

485传感器度读数据协议

代码

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

使用道具 举报

4

主题

73

帖子

0

精华

高级会员

Rank: 4

积分
895
金钱
895
注册时间
2017-7-28
在线时间
139 小时
 楼主| 发表于 2017-12-7 08:29:33 | 显示全部楼层
ding                              
回复

使用道具 举报

27

主题

118

帖子

0

精华

高级会员

Rank: 4

积分
851
金钱
851
注册时间
2015-12-8
在线时间
176 小时
发表于 2017-12-7 14:06:08 | 显示全部楼层
DEBUG一下,看看你从传感器哪里接收到的数据是怎么样的?还有串口配置和传感器的串口配置一样吗?你是怎么判断串口接收完一帧传感器发过来的数据的?
为自己掌握新的知识感到快乐
回复

使用道具 举报

4

主题

73

帖子

0

精华

高级会员

Rank: 4

积分
895
金钱
895
注册时间
2017-7-28
在线时间
139 小时
 楼主| 发表于 2017-12-7 15:57:16 | 显示全部楼层
Jundodo 发表于 2017-12-7 14:06
DEBUG一下,看看你从传感器哪里接收到的数据是怎么样的?还有串口配置和传感器的串口配置一样吗?你是怎么判 ...

我无法判断接收到的数据是否完整。。。这个光照传感器是485通信的,用单片机的串口2与485芯片通信的,单片机和传感器能够通信了。目前是发送读指令能收到应答,按照协议来看,应该接受到01 03 02 XX XX XX XX七个字节,但是我只接收到前4个有效的(后面的都是00 00 00)  ,在接收到的字节中,有一个字节是有规律的(光照越强,这个字节的数字越大,只是会跳变)
回复

使用道具 举报

4

主题

73

帖子

0

精华

高级会员

Rank: 4

积分
895
金钱
895
注册时间
2017-7-28
在线时间
139 小时
 楼主| 发表于 2017-12-7 16:20:18 | 显示全部楼层
顶              之前用电脑的串口测试传感器,可以完整地按照协议给的格式读出传感器的数据
回复

使用道具 举报

3

主题

19

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2017-12-1
在线时间
13 小时
发表于 2017-12-8 16:49:46 | 显示全部楼层
allaqppq 发表于 2017-12-7 16:20
顶              之前用电脑的串口测试传感器,可以完整地按照协议给的格式读出传感器的数据

我现在也是传感器为485,我可以接受返回的7个字节,但是隔段时间就会有个字节重复读取、手字节没读,导致顺序乱掉,有周期性
回复

使用道具 举报

4

主题

73

帖子

0

精华

高级会员

Rank: 4

积分
895
金钱
895
注册时间
2017-7-28
在线时间
139 小时
 楼主| 发表于 2017-12-8 19:16:55 | 显示全部楼层
顶                    
回复

使用道具 举报

4

主题

73

帖子

0

精华

高级会员

Rank: 4

积分
895
金钱
895
注册时间
2017-7-28
在线时间
139 小时
 楼主| 发表于 2017-12-8 19:26:39 | 显示全部楼层
忠犬八公 发表于 2017-12-8 16:49
我现在也是传感器为485,我可以接受返回的7个字节,但是隔段时间就会有个字节重复读取、手字节没读,导致 ...

能看下你的程序吗,我们的可以对比一下
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-12-9 01:01:35 | 显示全部楼层
485的收发状态切换,可能导致引入错误的数据,一般是多了一个0X00,这种需要自己做处理。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

19

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2017-12-1
在线时间
13 小时
发表于 2017-12-11 13:02:47 | 显示全部楼层
allaqppq 发表于 2017-12-8 19:26
能看下你的程序吗,我们的可以对比一下

        uint16_t i=0;
        uint8_t *pSend;
        pSend = txbuff;
        //debug_print("%s %d LuxTaskMain success\r\n", __func__, __LINE__);
//        debug_print("**********************\r\n");
        HAL_Delay(5000);
        while(i++ < SENSOR_TXBUF_LEN)
        {
            if(HAL_UART_Transmit(&MyDebugUart,(uint8_t *)(pSend++),1,5000) != HAL_OK)
          {
            debug_print("HAL_UART_Transmit fail!");
          }
        }
        //HAL_Delay(10);               //
        
        if((MyDebugUart.Instance->SR) & UART_FLAG_RXNE)
        {
          //HAL_UART_Receive_IT(&MyDebugUart,(uint8_t *)sensorUartBuffer,1);
          if( HAL_UART_Receive_IT(&MyDebugUart,(uint8_t *)sensorUartBuffer,1) != HAL_OK )
          {
            debug_print("HAL_UART_Receive fail!");
          }
        }
        
        /*
        if( HAL_UART_Receive_IT(&MyDebugUart,(uint8_t *)sensorUartBuffer,1) != HAL_OK )
        {
          debug_print("HAL_UART_Receive fail!");
        }
        */
        HAL_Delay(500);
        for(size_t i=0;i<=sizeof(rxbuff)-1;i++)
        {
        debug_print("@%d %x@",rxbuff,rxbuff);
        }
        debug_print("\n\n");

void sensorIRQHandler(void)
{
  uint8_t data;
  uint16_t bytesum = 0;

  if((MyDebugUart.Instance->SR) & UART_FLAG_RXNE)
  {
      CLEAR_BIT(MyDebugUart.Instance->SR,UART_FLAG_RXNE|UART_FLAG_ORE);
      data = MyDebugUart.Instance->DR;
      rxbuff[prxbuff++] = data;
      HAL_UART_Receive_IT(&MyDebugUart,(uint8_t *)sensorUartBuffer,1);
      if(prxbuff >= MAX_SENSOR_BUF_LEN)
      {
        prxbuff = 0;
      }
      
  }
}
回复

使用道具 举报

3

主题

19

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2017-12-1
在线时间
13 小时
发表于 2017-12-11 16:26:56 | 显示全部楼层
allaqppq 发表于 2017-12-8 19:26
能看下你的程序吗,我们的可以对比一下

我在中断处理函数中加了      
if(data == 0x30)
        {
          //继续接受
          prxbuff = 0;
        }
数据稳定了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-24 05:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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