OpenEdv-开源电子网

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

DMA串口发送显示不合理,直接给发送数据缓冲区写数据结果与放进中转数组里再传给数据缓冲区结果不一样

[复制链接]

30

主题

171

帖子

0

精华

高级会员

Rank: 4

积分
987
金钱
987
注册时间
2021-7-26
在线时间
194 小时
发表于 2022-11-4 12:18:08 | 显示全部楼层 |阅读模式
50金钱
本帖最后由 精英板 于 2022-11-4 13:18 编辑

应要求放个代码在附件,代码执行是  2. 的内容,原子这俩不能放图片,很难受,里面有一些杂文件是我底层配置的以后可能用的上的,暂时在这个问题没用。
1.我遇到的现象是如果直接给发送数据缓冲区SendBuffer[SEND_BUF_SIZE]里写入非常多数据(不超过65532),然后直接开启DMA传输,那么结果是正确的。结果如下串口助手显示:
     程序:u8 SendBuff[SEND_BUF_SIZE]={“33,-119,225,..............-12248,-11669,44,1125};
     串口助手显示:33,-119,225,-2873,.............-12248,-11669,44,1125\0\0\...显示合理正确

2.如果把数据放到一个中转数组里,也就是原子的DMA例程里的TEXT_TO_SEND数组里(例程里这个数组放的内容是"ALIENTEK Elite STM32F1 DMA 串口实验),然后数组复制到发送数据缓冲区SendBuffer里,结果就不对,发送到-11669后就重新从头的33开始发送了.我查字符发现到了"-11669,"这里正好是256个字节。经过测试也发现像这样经过中转数组赋值到发送数据缓冲区必须要中转数组长度小于256才能发送的正确。串口助手显示结果如下:

     程序:u8 TEXT_TO_SEND[280]={“33,-119,225,..............-12248,-11669,44,1125};
     串口助手显示:33,-119,225,-2873,.............-12248,-11669,33,-119,225 显示不对开始循环了

以上是我出问题疑惑的现象

我不太明白也不太知道怎么解决,我不能把数据直接就像第一幅图一样写在sendbuff里,一是我记着我要传输非常多的数据但dma一次传输数据不超过65532,二是我要传的数据不是像这样{"33,-119"}字符串形式,而是数组形式{33,-119},我感觉必须要通过中转数组经过一次转换给sendbuff。

所以我想解决我的目的,有俩问题:
一是 我上述说的现象咋解决啊
二是 要是我能不能使用双串口,printf重映射到串口2上,然后串口1只通过DMA发送,然后串口2通过printf发送,这样双线同时发送数据传输速率会高一点。但是会相互占据资源吗或产生冲突么

现在我有一个解决办法就是加个逻辑让TEXT_TO_SEND中转数组一旦检测到长度高于250(因为我的数据并不整齐,未必每次都能卡到256那个点上),就产生一个标志量并记录此时的数组索引位置,在下一个while循环中memset清空TEXT_TO_SEND数组并从这个索引位置开始从头再给TEXT_TO_SEND发不超过250个数据长度。这样虽然会产生尾接头的效果,就当校验位了,也算是勉强解决,效果如下:

1.jpg
但这样的话我认为不会发挥出DMA的实力,就靠的while循环,因此不是好的解决办法。

Keil5_CH32F103C8T6.zip

6.17 MB, 下载次数: 3

最佳答案

查看完整内容[请看2#楼]

很明显,是变量t的位数不足: u8 t=0, SendBuff = TEXT_TO_SEND [ t ]; t++; u8变量255+1=0;
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8463
金钱
8463
注册时间
2020-5-11
在线时间
3904 小时
发表于 2022-11-4 12:18:09 | 显示全部楼层
本帖最后由 LcwSwust 于 2022-11-4 14:12 编辑

很明显,是变量t的位数不足:
u8 t=0,
SendBuff = TEXT_TO_SEND [ t ];
t++;
u8变量255+1=0;
专治疑难杂症
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2022-11-4 12:22:46 | 显示全部楼层
本帖最后由 nashui_sx 于 2022-11-4 12:25 编辑

SendBuffer[SEND_BUF_SIZE]正确 TEXT_TO_SEND不正确 给串口就没问题了  感觉是拷贝或者哪里出错了
至于拼接u16 估计还是你数据拷贝出错了   不讲数据是u8  u16 都按照u8 拷贝

回复

使用道具 举报

30

主题

171

帖子

0

精华

高级会员

Rank: 4

积分
987
金钱
987
注册时间
2021-7-26
在线时间
194 小时
 楼主| 发表于 2022-11-4 12:33:02 | 显示全部楼层
本帖最后由 精英板 于 2022-11-4 12:38 编辑
nashui_sx 发表于 2022-11-4 12:22
SendBuffer[SEND_BUF_SIZE]正确 TEXT_TO_SEND不正确 给串口就没问题了  感觉是拷贝或者哪里出错了
至于拼 ...
服了,打不出来显示不出来【i】
SendBuff【i】=TEXT_TO_SEND[t];//这里就是索引对索引传输呀,这俩都u8的类型
while(1)
        {
                printf("\r\n %d \r\n",sizeof(SD_data));         

                j=sizeof(TEXT_TO_SEND);
                //memset(TEXT_TO_SEND,0,sizeof(TEXT_TO_SEND));
                        for(i=0;i<SEND_BUF_SIZE;i++)
    {
                if(t>=j)
                {
                        if(mask)
                        {
                                SendBuff=0x0a;
                                t=0;
                        }else
                        {
                                SendBuff=0x0d;
                                mask++;
                        }        
                }
                else
                {

                        mask=0;
                        SendBuff=TEXT_TO_SEND[t];///这里就是索引对索引传输呀,这俩都u8的类型
                        t++;
                }               
    }        
                                uart_go();
uart_go就是打开dma传输的那些话
void uart_go()
{
                USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);     
                MYDMA_Enable(DMA1_Channel4);
                        while(1)
                    {
                                if(DMA_GetFlagStatus(DMA1_FLAG_TC4)!=RESET)     
                                {
                                        DMA_ClearFlag(DMA1_FLAG_TC4);
                                        break;
                    }
                    }        
}
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2022-11-4 12:53:38 | 显示全部楼层
精英板 发表于 2022-11-4 12:33
服了,打不出来显示不出来【i】
SendBuff【i】=TEXT_TO_SEND[t];//这里就是索引对索引传输呀,这俩都u8的 ...

{33,-119} 这样的数据你的代码就不对了吧 你要格式化一下吧  280个数据格式化以后会很长

不过你问的问题 问题不明确 思路不清晰 一般人没法解答

还不如一句话  把...数据数组通过dma发送到串口 串口要显示如下...的样子  如何解决
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8463
金钱
8463
注册时间
2020-5-11
在线时间
3904 小时
发表于 2022-11-4 13:05:40 | 显示全部楼层
这问题看不太明白,要不把你的工程传上来?
专治疑难杂症
回复

使用道具 举报

30

主题

171

帖子

0

精华

高级会员

Rank: 4

积分
987
金钱
987
注册时间
2021-7-26
在线时间
194 小时
 楼主| 发表于 2022-11-4 13:07:19 | 显示全部楼层
本帖最后由 精英板 于 2022-11-4 13:19 编辑
nashui_sx 发表于 2022-11-4 12:53
{33,-119} 这样的数据你的代码就不对了吧 你要格式化一下吧  280个数据格式化以后会很长

不过你问的问 ...

没办法啊,原子这论坛和那啥一样,发不了图片,我这就应该放代码图片的现在传了
回复

使用道具 举报

30

主题

171

帖子

0

精华

高级会员

Rank: 4

积分
987
金钱
987
注册时间
2021-7-26
在线时间
194 小时
 楼主| 发表于 2022-11-4 13:18:51 | 显示全部楼层
LcwSwust 发表于 2022-11-4 13:05
这问题看不太明白,要不把你的工程传上来?

OKOK传了哥
回复

使用道具 举报

30

主题

171

帖子

0

精华

高级会员

Rank: 4

积分
987
金钱
987
注册时间
2021-7-26
在线时间
194 小时
 楼主| 发表于 2022-11-4 15:22:45 | 显示全部楼层
LcwSwust 发表于 2022-11-4 14:10
很明显,是变量t的位数不足:
u8 t=0,
SendBuff = TEXT_TO_SEND [ t ];

我去,u8 t,mask这个就是我直接移过来的,DMA其他看了这个变量赋值没看,真没注意,确实是这里的问题,谢谢哥,这个错误比较低级
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 22:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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