OpenEdv-开源电子网

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

stm32字符串拼接u32类型数组,拼接u8类型的字符串没问题,但是字符一多就到u8上限了

[复制链接]

30

主题

171

帖子

0

精华

高级会员

Rank: 4

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

说的有点乱,我重新再说一次。我的目的是通过dma发送串口数据。图片显示不出来啊,怎么回事,只能打字了/////服了,上传的图片还删不了算了进这里吧DMA串口发送显示不合理,直接给发送数据缓冲区写数据结果与放进中转数组里再传给数据缓冲区结果不一样-OpenEdv-开源电子网
  我遇到的现象是如果直接给发送数据缓冲区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\...显示合理正确

如果把数据放到一个中转数组里,也就是原子的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.png
但这样的话我认为不会发挥出DMA的实力,就靠的while循环,因此不是好的解决办法。



1.jpg
1.jpg

最佳答案

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

http://www.openedv.com/thread-340316-1-1.html问题在这里
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

30

主题

171

帖子

0

精华

高级会员

Rank: 4

积分
987
金钱
987
注册时间
2021-7-26
在线时间
194 小时
 楼主| 发表于 2022-11-3 16:34:06 | 显示全部楼层
回复

使用道具 举报

16

主题

426

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2765
金钱
2765
注册时间
2018-11-8
在线时间
438 小时
发表于 2022-11-3 16:42:01 | 显示全部楼层
把什么东西拼成u32啊 u8字符串?数组改大一些不就行了
如果要拼接就读取数组长度 然后每四位一组 分别移24位 16位 8位 0位再或运算一下不就行了
循环操作直到操作次数*4大于等于数组长度就行了
回复

使用道具 举报

5

主题

134

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1389
金钱
1389
注册时间
2019-5-29
在线时间
163 小时
发表于 2022-11-3 18:50:02 | 显示全部楼层
拼接的话都是unsigned char(u8) 字符型 ,int 类型不适用,要么你就把unsigned int(32)数据拆分一下就好了,注意大小端;
偷偷摸鱼
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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