2020-02-11 10:00发布
snail_dongbin 发表于 2016-3-16 19:06 发送放中断里还9600 ,不等才怪 串口发送一般可以用发送中断,高级点的可以用dma
落叶知秋 发表于 2016-4-8 15:23 最近工作在用K6X系列的芯片,也用到了UART和DMA,看到楼主的目的有点描述不清楚, 所以进行以下猜测: 1. ...
zjipc 发表于 2016-4-12 15:35 非常感谢您,这么认真的分析以及给与合理的建议,上位机我用的是网上的,上位机发送的数据包长度我不能修 ...
最多设置5个标签!
这几天一直在研究这个问题,用DMA接收数据,由于数据长度是变化的,不知道怎么解决,如果用用UART中断接收数据,又出来问题是数据每次接收不完全,因为中断不能嵌套,1、如果中断设置嵌套该怎么设置,数据手册里面没有讲到;2、如果用DMA数据不定长怎么办,因为是K60的芯片,网上都找不到例子
非常感谢您,这么认真的分析以及给与合理的建议,上位机我用的是网上的,上位机发送的数据包长度我不能修改,比如数据包发送来AAAF02(n字节),我可以通过AAAF02这6个字节指令语句来判断这个数据包的长度,我如果用DMA先接收6个字节,然后根据这6个字节判断后面n是多大,然后从新初始化DMA接收N字节,不知道会不会导致串口数据丢失的。
楼主考虑的这种做法也不是不可以,只要你查询和处理DMA状态的速度比UART的发送速率块,不导致数据到了没人管就行了。
另外,也可以考虑我上面提及的【乒乓缓冲】的方法。即:
1. 开辟2块内存缓冲区A和B;
2. 让DMA将收到的UART数据先存到A;
3. 主程序可以查询DMA已经搬运了多少,如果够6个字节,就开始解析;
4. 等到DMA收完解析出来的长度后,就进行n个字节的读取解析;
5. DMA把A区填满了,就指定DMA开始把B区开始“填埋”;
6. 主程序处理完A区,跟着处理B区;
7. 然后就是A->B->A->B……这样了。
其实只要遵循一个原则就行了:数据到了就尽快取走存起来,免得丢了,然后再根据协议做出处理,处理完的数据就丢掉。
一周热门 更多>