高级会员

- 积分
- 987
- 金钱
- 987
- 注册时间
- 2021-7-26
- 在线时间
- 194 小时
|
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个数据长度。这样虽然会产生尾接头的效果,就当校验位了,也算是勉强解决,效果如下:

但这样的话我认为不会发挥出DMA的实力,就靠的while循环,因此不是好的解决办法。
|
最佳答案
查看完整内容[请看2#楼]
很明显,是变量t的位数不足:
u8 t=0,
SendBuff = TEXT_TO_SEND [ t ];
t++;
u8变量255+1=0;
|