找回密码
 立即注册
查看: 116|回复: 5

串口4使用DMA进行MODBUS通讯受到ADC DMA影响。

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:57
  • 最近打卡:2026-03-23 11:48:40

9

主题

12

回帖

281

积分

中级会员

积分
281
发表于 2026-3-13 12:31:55 | 显示全部楼层 |阅读模式
    单片机型号:STC32G12K128
    晶振:33.1776MHZ
    通讯协议:ModbusRTU 485
    通讯端口:串口4
    收发方式:采用中断+DMA
    ADC采集方式:DMA方式

        为了方便解析Modbus功能码,我把Modbus的功能码封装成函数。数据采用结构体的方式来定义。串口收发采用的是中断+DMA的方式来实现。


    但是当ADC同时采用DMA采集数据的时候会对串口4的 Modbus通讯数据造成影响发送的数据有误。(中间的数据位错误,但是CRC结果正确)。
   
    测试功能吗:03功能码 用串口助手监控
    发送代码:        01 03 08 0C 00 0C 87 AC
    返回正确代码: 01 03 18 3F 80 00 00 00 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 20 93
    返回错误代码: 01 03 18 98 7F 27 C7 FF 78 8F 43 48 0A 90 B2 4C 13 5F 22 85 43 4E 3B FD 89 E1 EF 46 5D   (错误的代码最后两位的CRC结果也是正确的,说明在返回数据前,数据被干扰了)
   

这是测试串口助手

这是测试串口助手

下面是测试的程序
MODbus4与ADC测试 2026-3-13.rar (385.51 KB, 下载次数: 5)
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:57
  • 最近打卡:2026-03-23 11:48:40

9

主题

12

回帖

281

积分

中级会员

积分
281
发表于 2026-3-13 14:55:20 | 显示全部楼层
串口4的波特率9600,modbus站地址=1

点评

是通讯过程正常,发送前RAM内容被改了?正确内容应是什么?发送固定内容能复现吗? 另外tx rx dma buf 怎么设置的同地址 [attachimg]133536[/attachimg]  详情 回复 发表于 2026-3-13 15:04
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:493
  • 最近打卡:2026-04-02 08:56:15
已绑定手机

104

主题

4229

回帖

9395

积分

荣誉版主

无情的代码机器

积分
9395
发表于 2026-3-13 15:04:37 | 显示全部楼层
limin*** 发表于 2026-3-13 14:55
串口4的波特率9600,modbus站地址=1


是通讯过程正常,发送前RAM内容被改了?正确内容应是什么?发送固定内容能复现吗?

另外tx rx dma buf 怎么设置的同地址

截图202603131504229651.jpg

三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:57
  • 最近打卡:2026-03-23 11:48:40

9

主题

12

回帖

281

积分

中级会员

积分
281
发表于 2026-3-13 15:18:18 | 显示全部楼层
erci*** 发表于 2026-3-13 15:04
是通讯过程正常,发送前RAM内容被改了?正确内容应是什么?发送固定内容能复现吗?

另外tx rx dma buf  ...

1.发送前RAM内容被修改了,准确的说是通过DMA发送的时候内容的替换了。
返回正确代码: 01 03 18 3F 80 00 00 00 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 20 93


我是在串口助手 每间隔100ms 发送一次查询命令”01 03 08 0C 00 0C 87 AC“
返回的正确代码是:“01 03 18 3F 80 00 00 00 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 20 93”

返回错误代码: “01 03 18 98 7F 27 C7 FF 78 8F 43 48 0A 90 B2 4C 13 5F 22 85 43 4E 3B FD 89 E1 EF 46 5D”
                        “00 03 18 3F 80 00 00 00 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 DE 11”  
出错的内容不限于以上固定码,但是种类大概是这两种。而且CRC的结果是正确的。

2.配置的时候寄存器设置成一样的。这个我是参考咱们的官方例子代码。

截图202603131520049922.jpg

截图202603131521192397.jpg


点评

回环测试可以这样搞,和外部通讯用两个独立XRAM,并且最好四字节对齐。 可以测试回复固定内容。应不是被干扰了,是RX DMA数据勿入tx buffer?  详情 回复 发表于 2026-3-13 15:30
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:493
  • 最近打卡:2026-04-02 08:56:15
已绑定手机

104

主题

4229

回帖

9395

积分

荣誉版主

无情的代码机器

积分
9395
发表于 2026-3-13 15:30:04 | 显示全部楼层
limin*** 发表于 2026-3-13 15:18
1.发送前RAM内容被修改了,准确的说是通过DMA发送的时候内容的替换了。
返回正确代码: 01 03 18 3F 80 0 ...

回环测试可以这样搞,和外部通讯用两个独立XRAM,并且最好四字节对齐。

可以测试回复固定内容。应不是被干扰了,是RX DMA数据勿入tx buffer?
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:57
  • 最近打卡:2026-03-23 11:48:40

9

主题

12

回帖

281

积分

中级会员

积分
281
发表于 2026-3-13 15:33:14 | 显示全部楼层
erci*** 发表于 2026-3-13 15:30
回环测试可以这样搞,和外部通讯用两个独立XRAM,并且最好四字节对齐。

可以测试回复固定内容。应不是被 ...

感觉应该是是ADC DMA数据勿入tx buffer。因为把ADC的DMA停掉,通讯是正常的。
截图202603131534248923.jpg
解析的时候把ADC的DMA停掉就会解决通讯数据异常的问题。

还有我的发送和接收是分成两个寄存器的。是放在xdata中的。
截图202603131538299646.jpg

截图202603131543118324.jpg
这里替换为发送寄存器依然会出现错误的返回码。
截图202603131545224956.jpg


回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-4-3 02:15 , Processed in 0.110891 second(s), 70 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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