串口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结果也是正确的,说明在返回数据前,数据被干扰了)
下面是测试的程序
串口4的波特率9600,modbus站地址=1 liming3267 发表于 2026-3-13 14:55
串口4的波特率9600,modbus站地址=1
是通讯过程正常,发送前RAM内容被改了?正确内容应是什么?发送固定内容能复现吗?
另外tx rx dma buf 怎么设置的同地址
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.配置的时候寄存器设置成一样的。这个我是参考咱们的官方例子代码。
liming3267 发表于 2026-3-13 15:18
1.发送前RAM内容被修改了,准确的说是通过DMA发送的时候内容的替换了。
返回正确代码: 01 03 18 3F 80 0 ...
回环测试可以这样搞,和外部通讯用两个独立XRAM,并且最好四字节对齐。
可以测试回复固定内容。应不是被干扰了,是RX DMA数据勿入tx buffer?
ercircle 发表于 2026-3-13 15:30
回环测试可以这样搞,和外部通讯用两个独立XRAM,并且最好四字节对齐。
可以测试回复固定内容。应不是被 ...
感觉应该是是ADC DMA数据勿入tx buffer。因为把ADC的DMA停掉,通讯是正常的。
解析的时候把ADC的DMA停掉就会解决通讯数据异常的问题。
还有我的发送和接收是分成两个寄存器的。是放在xdata中的。
这里替换为发送寄存器依然会出现错误的返回码。
页:
[1]