liming3267 发表于 2026-3-13 12:31:55

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

    单片机型号: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结果也是正确的,说明在返回数据前,数据被干扰了)
   
下面是测试的程序

liming3267 发表于 2026-3-13 14:55:20

串口4的波特率9600,modbus站地址=1

ercircle 发表于 2026-3-13 15:04:37

liming3267 发表于 2026-3-13 14:55
串口4的波特率9600,modbus站地址=1


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

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



liming3267 发表于 2026-3-13 15:18:18

ercircle 发表于 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.配置的时候寄存器设置成一样的。这个我是参考咱们的官方例子代码。






ercircle 发表于 2026-3-13 15:30:04

liming3267 发表于 2026-3-13 15:18
1.发送前RAM内容被修改了,准确的说是通过DMA发送的时候内容的替换了。
返回正确代码: 01 03 18 3F 80 0 ...

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

可以测试回复固定内容。应不是被干扰了,是RX DMA数据勿入tx buffer?

liming3267 发表于 2026-3-13 15:33:14

ercircle 发表于 2026-3-13 15:30
回环测试可以这样搞,和外部通讯用两个独立XRAM,并且最好四字节对齐。

可以测试回复固定内容。应不是被 ...
感觉应该是是ADC DMA数据勿入tx buffer。因为把ADC的DMA停掉,通讯是正常的。

解析的时候把ADC的DMA停掉就会解决通讯数据异常的问题。

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



这里替换为发送寄存器依然会出现错误的返回码。



页: [1]
查看完整版本: 串口4使用DMA进行MODBUS通讯受到ADC DMA影响。