OpenEdv-开源电子网

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

modbus rtu 接收的数据第1-2位出错,其他位正常!!

[复制链接]

1

主题

6

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2020-12-19
在线时间
9 小时
发表于 2020-12-25 01:10:31 | 显示全部楼层 |阅读模式
1金钱
#采用STM32F103C8T6加485模块!
#串口发送8位数据,CPU中只能收到7位,第1-2位乱码只能收到1位,3-8位都正常!!!!!
#代码测试的是原子哥的modbus rtu 案例程序!
#求大神指导,最近测试这个测试蒙圈了-----------------------
微信图片_20201225010233.png

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

使用道具 举报

18

主题

151

帖子

0

精华

高级会员

Rank: 4

积分
508
金钱
508
注册时间
2020-4-22
在线时间
241 小时
发表于 2020-12-25 10:54:37 | 显示全部楼层
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2020-12-19
在线时间
9 小时
 楼主| 发表于 2020-12-25 11:34:50 | 显示全部楼层

应该不是硬件问题,--- 换了3块新的485扩展板 都是一样的问题----
如果发送的时候 多发送2位 00 00 就正常,后面8位就是我发的8位,
就是说 程序接收的第1-2位乱套了 后面位就正常---
搞晕了 ----
回复

使用道具 举报

12

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
581
金钱
581
注册时间
2019-8-6
在线时间
132 小时
发表于 2020-12-25 17:04:38 | 显示全部楼层
串口中断是怎么写的
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2020-12-25 17:11:42 | 显示全部楼层
原因可能是你程序有BUG
一分耕耘一分收获。
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2020-12-19
在线时间
9 小时
 楼主| 发表于 2020-12-25 19:48:52 | 显示全部楼层
lyy26655 发表于 2020-12-25 17:04
串口中断是怎么写的

有空帮忙看下吗 万分感谢
代码放在网盘----
链接:https://pan.baidu.com/s/1vnELP2MghHFSw11mmb-tSQ
提取码:0uqe
复制这段内容后打开百度网盘手机App,操作更方便哦
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2020-12-19
在线时间
9 小时
 楼主| 发表于 2020-12-25 19:51:48 | 显示全部楼层
yklstudent 发表于 2020-12-25 17:11
原因可能是你程序有BUG

回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2020-12-19
在线时间
9 小时
 楼主| 发表于 2020-12-26 00:30:35 | 显示全部楼层
lyy26655 发表于 2020-12-25 17:04
串口中断是怎么写的

/*
******************************************************************************************
*/
//应该是这段程序有bug,但是没找到具体是哪里的问题
static void UsartIRQ(USART_FIFO_Typedef *_pUsart)
{
       
        if (USART_GetITStatus(_pUsart->usart, USART_IT_RXNE) != RESET)
        {
               
                uint8_t ch;

                ch = USART_ReceiveData(_pUsart->usart);
                _pUsart->pRxBuf[_pUsart->usRxWrite] = ch;
                if (++_pUsart->usRxWrite >= _pUsart->usRxBufSize)
                {
                        _pUsart->usRxWrite = 0;
                }
                if (_pUsart->usRxCount < _pUsart->usRxBufSize)
                {
                        _pUsart->usRxCount++;
                }
               
    if (_pUsart->ReciveNew)
    {
      _pUsart->ReciveNew(ch);
    }
        }

       
        if (USART_GetITStatus(_pUsart->usart, USART_IT_TXE) != RESET)
        {
                if (_pUsart->usTxCount == 0)
                {
                       
                        USART_ITConfig(_pUsart->usart, USART_IT_TXE, DISABLE);

                       
                        USART_ITConfig(_pUsart->usart, USART_IT_TC, ENABLE);
                }
                else
                {
                       
                        USART_SendData(_pUsart->usart, _pUsart->pTxBuf[_pUsart->usTxRead]);
                        if (++_pUsart->usTxRead >= _pUsart->usTxBufSize)
                        {
                                _pUsart->usTxRead = 0;
                        }
                        _pUsart->usTxCount--;
                }

        }
       
        else if (USART_GetITStatus(_pUsart->usart, USART_IT_TC) != RESET)
        {
                if (_pUsart->usTxCount == 0)
                {
                       
                        USART_ITConfig(_pUsart->usart, USART_IT_TC, DISABLE);

                        &acute;
                        if (_pUsart->SendOver)
                        {
                                _pUsart->SendOver();
                        }
                }
                else
                {
                       
                        USART_SendData(_pUsart->usart, _pUsart->pTxBuf[_pUsart->usTxRead]);
                        if (++_pUsart->usTxRead >= _pUsart->usTxBufSize)
                        {
                                _pUsart->usTxRead = 0;
                        }
                        _pUsart->usTxCount--;
                }
        }
}
回复

使用道具 举报

3

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2019-11-6
在线时间
74 小时
发表于 2020-12-26 10:51:33 | 显示全部楼层
vader2020 发表于 2020-12-26 00:30
/*
******************************************************************************************
*/ ...

感觉中断还是放在中断函数里面写吧,你接收里面,要不把++_pUsart->usRxWrite 换成_pUsart->usRxWrite++试试
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2020-12-19
在线时间
9 小时
 楼主| 发表于 2020-12-26 12:03:37 | 显示全部楼层
T932401514 发表于 2020-12-26 10:51
感觉中断还是放在中断函数里面写吧,你接收里面,要不把++_pUsart->usRxWrite 换成_pUsart->usRxWrite++ ...

这个没有效果
现在主要是前2个字节有问题,其他位没有问题,我查了也没有其他中断打断串口中断的-----囧了 爬楼很久 都没解决好----
回复

使用道具 举报

3

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2019-11-6
在线时间
74 小时
发表于 2020-12-30 14:04:34 | 显示全部楼层
vader2020 发表于 2020-12-26 12:03
这个没有效果
现在主要是前2个字节有问题,其他位没有问题,我查了也没有其他中断打断串口中断的- ...

你进中断是不是都没有清中断标志
回复

使用道具 举报

1

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2020-9-29
在线时间
36 小时
发表于 2021-1-11 09:53:52 | 显示全部楼层
请问楼主原子哥的modbus rtu 案例程序在哪里找的
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-15 03:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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