搜索
bottom↓
回复: 112

总结了各种方法stm32 串口接收都太麻烦! 并且不稳定 !

  [复制链接]

出10入12汤圆

发表于 2018-11-4 16:37:49 | 显示全部楼层 |阅读模式
常用方法1:串口接收中断内部循环接收,设定超时!    占CPU不行
方法2:DMA定长中断接收, DMA设定长度,如果丢了一个数据,每次中断 后面的数据全错位。  自己把自己玩死!
方法3:DMA不定长接收, DMA长度设成最大, 在定时器中扫描接收数量!   不停进定时器等问题。。。。。。。
方法4:串口空闲中断,  stm32 不能设置串口空闲时间长度!!总线有干扰或者100K 1M时就搞死! 坑爹。

要啥 小轿车!我只要自行车!!!
我只要稳定可靠的定长接收就可以!!  

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2018-11-4 16:40:28 | 显示全部楼层
方法4结合定时器,能自己设置空闲时间,3.5T

出0入104汤圆

发表于 2018-11-4 16:46:56 | 显示全部楼层
5 状态机接收

出0入8汤圆

发表于 2018-11-4 17:19:36 来自手机 | 显示全部楼层
标记一下,大家把稳定的用法说出来交流交流

出0入0汤圆

发表于 2018-11-4 17:23:08 | 显示全部楼层
定长就简单多了。如果自己定协议,还可以更灵活。

不要希望每一次都发正确,否则要CRC8,CRC16校验有何用?

出10入12汤圆

 楼主| 发表于 2018-11-4 17:26:46 | 显示全部楼层
starting 发表于 2018-11-4 16:40
方法4结合定时器,能自己设置空闲时间,3.5T

自古真相出2楼!!!! 另外请问如何定时检测空闲?  记录空闲中断和定时器中断是DMA缓冲区大小是否一致吗?  另外DMA发送完成后 串口还剩几个字节没有发送?

出10入12汤圆

 楼主| 发表于 2018-11-4 17:28:13 | 显示全部楼层
Excellence 发表于 2018-11-4 17:23
定长就简单多了。如果自己定协议,还可以更灵活。

不要希望每一次都发正确,否则要CRC8,CRC16校验有何用? ...

错误不怕,  输出丢了一个 就哭了!! 后面DMA缓存全错位。。。。。。。。。。。。。。。。。一个都收不到

出0入0汤圆

发表于 2018-11-4 17:43:54 | 显示全部楼层
中断接收存数组,占用cpu这点时间都不能接受?

出10入12汤圆

 楼主| 发表于 2018-11-4 17:45:42 | 显示全部楼层
要是9600的话 这个10个字节 10ms  连续发送  就死掉了!!!!!!!

出10入12汤圆

 楼主| 发表于 2018-11-4 17:46:00 | 显示全部楼层
stm32这么强大的  时间绝对不能浪费!!!!!

出0入59汤圆

发表于 2018-11-4 17:57:41 | 显示全部楼层
目前发现做好用的还是ATMEL 的串口, 硬件DMA + 可设置长度超时中断; 还没有发现那家比他做得好;

就是TM 贵,TM的不好买; 作死

出0入442汤圆

发表于 2018-11-4 17:57:47 来自手机 | 显示全部楼层
wowangru 发表于 2018-11-4 17:28
错误不怕,  输出丢了一个 就哭了!! 后面DMA缓存全错位。。。。。。。。。。。。。。。。。一个都收不 ...

指望它那个dma肯定是不行的,我记得是可以设半满中断的,比如dma开16,中断可以设到12这类,这样中断时把你的数据往程序里的buffer搬。不要在中断里处理数据!

出0入0汤圆

发表于 2018-11-4 18:10:40 来自手机 | 显示全部楼层
接收中断里把数据到数组里,间隔一定时间后还没新数据过来就当收到一帧数据

出0入0汤圆

发表于 2018-11-4 18:23:04 | 显示全部楼层
串口缓冲环,论坛有人发过。

出0入0汤圆

发表于 2018-11-4 19:05:57 来自手机 | 显示全部楼层
9600波特率开100字节DMA缓冲100毫秒处理一下有多难?

出0入0汤圆

发表于 2018-11-4 19:56:05 来自手机 | 显示全部楼层
wowangru 发表于 2018-11-4 17:46
stm32这么强大的  时间绝对不能浪费!!!!!

有个半满中断吧  多进一次中断而已  

出0入0汤圆

发表于 2018-11-4 19:57:11 | 显示全部楼层
定长DMA, 你收到一帧发现丢了数据, 帧头已经错位的时候, 你还不去重新初始化DMA??

出0入4汤圆

发表于 2018-11-4 20:19:01 | 显示全部楼层
STM32有些型号支持设置空闲时间设置,一般用DMA+空闲加空闲后定时器超时.效果还行

出870入263汤圆

发表于 2018-11-4 20:21:50 | 显示全部楼层
瘦肉塞牙缝,肥肉太油腻;我tmd只想吃点土,既不油腻又不塞牙缝!
stm32的UART是我用过最好用的(与LPC17xx,luminary,nuc97x比)!

出0入0汤圆

发表于 2018-11-4 20:24:41 | 显示全部楼层
就串口那点速度,一个字节进一次中断又能占多少CPU

出10入12汤圆

 楼主| 发表于 2018-11-4 20:34:02 | 显示全部楼层
modbus 发表于 2018-11-4 20:24
就串口那点速度,一个字节进一次中断又能占多少CPU

100字节 CPU就占%10了

出10入12汤圆

 楼主| 发表于 2018-11-4 20:34:34 | 显示全部楼层
armstrong 发表于 2018-11-4 20:21
瘦肉塞牙缝,肥肉太油腻;我tmd只想吃点土,既不油腻又不塞牙缝!
stm32的UART是我用过最好用的(与LPC17xx ...

关键得调教!!!!!!

出0入42汤圆

发表于 2018-11-4 20:35:11 | 显示全部楼层
LZ,115200的波特率,1个字节要86.8us
72M的时钟下,86.8us可以执行6000多条指令
串口中断里把数据放到软件fifo里,200条指令足够了,这才3%,绰绰有余啊

数据处理设法放在非中断里处理就可以了

出10入12汤圆

 楼主| 发表于 2018-11-4 20:37:09 | 显示全部楼层
wshtyr 发表于 2018-11-4 20:35
LZ,115200的波特率,1个字节要86.8us
72M的时钟下,86.8us可以执行6000多条指令
串口中断里把数据放到软件 ...

我做数据采集的!!!!  伺服电机性能曲线。。。。慢慢接收可不行哟

出0入0汤圆

发表于 2018-11-4 20:37:28 | 显示全部楼层
二楼才是正解!

出0入42汤圆

发表于 2018-11-4 20:42:35 | 显示全部楼层
本帖最后由 wshtyr 于 2018-11-4 20:44 编辑
wowangru 发表于 2018-11-4 20:37
我做数据采集的!!!!  伺服电机性能曲线。。。。慢慢接收可不行哟


那就放在中断里处理吧。。

char rx_buffer[RX_BUFFER_SIZE];
int rx_buffer_pos = 0;

void USARTx_Interrupt(void)
{
        char c = USARTx->DR;
        rx_buffer[rx_buffer_pos++] = c;
        if(rx_buffer_pos>=数据长度)
        {
                //数据处理
                rx_buffer_pos = 0;
                清零定时器;
        }
}

void TIMx_Interrupt(void)
{
        //超时处理
        rx_buffer_pos = 0;
}

有什么比中断还快的?!

出0入4汤圆

发表于 2018-11-4 20:52:46 | 显示全部楼层
wowangru 发表于 2018-11-4 20:34
100字节 CPU就占%10了

中断里做接收,处理在正常程序中处理。会有这么大占用?

出0入22汤圆

发表于 2018-11-4 21:01:40 来自手机 | 显示全部楼层
如果要又快又好,用fpga在外面处理好,再送到单片机。

出0入362汤圆

发表于 2018-11-4 21:50:30 | 显示全部楼层
空闲中断+DMA,不定长,加LRC或CRC校验,1.5Mbps极少出错,500kbps从来没出错过

出0入4汤圆

发表于 2018-11-4 21:54:46 | 显示全部楼层
你用多大的波特率

出0入0汤圆

发表于 2018-11-4 22:00:34 来自手机 | 显示全部楼层
DMA循环十FIFO

出0入4汤圆

发表于 2018-11-4 22:01:29 来自手机 | 显示全部楼层
tomzbj 发表于 2018-11-4 21:50
空闲中断+DMA,不定长,加LRC或CRC校验,1.5Mbps极少出错,500kbps从来没出错过

串口数据不连续怎么办?再加上定时器超时判断?

出0入0汤圆

发表于 2018-11-4 22:55:03 | 显示全部楼层
wowangru 发表于 2018-11-4 20:34
100字节 CPU就占%10了

就串口那速度你CPU还能占10%,只能说你的串口程序编的不行

出0入0汤圆

发表于 2018-11-4 23:07:20 | 显示全部楼层
4系列的双缓冲很好用啊,把缓冲和环形缓冲区结合起来很方便的。
话又说回来,ST的串口设计的确有些问题,它把16550标准的16B缓冲缩减到1B。带双缓冲的还好,不过代码复杂些,M0这些只有单缓冲的确实不好用,不如NXP

出0入90汤圆

发表于 2018-11-4 23:12:27 | 显示全部楼层
其实就是楼主自己水平差差,然后嫌STM32不好用。

出50入0汤圆

发表于 2018-11-4 23:27:27 | 显示全部楼层
环形缓存,就是DMA循环模式,开定时器定时去读取DMA当前计数值,一定时间发现不变了就认为一帧完毕,已实际应用很久时间,非常好用。

出0入0汤圆

发表于 2018-11-4 23:35:13 | 显示全部楼层
赞成26楼的 我们就这样的115200 8路串口加一个以太网完全没有问题

出10入12汤圆

 楼主| 发表于 2018-11-4 23:37:00 | 显示全部楼层
我现在用空闲中断加定时器,,,, 不知道是否稳定

出10入12汤圆

 楼主| 发表于 2018-11-4 23:37:31 | 显示全部楼层
按道理说这个是最好的 DMA接收  不需要占用CPU  任意长度都可以

出0入24汤圆

发表于 2018-11-4 23:38:01 | 显示全部楼层
方法3:DMA不定长接收
假设1M波特率,一个数据10us时间,4K的缓冲区,数据接收够2K处理一次,定时中断频率为50Hz,一点都不高;或者直接用DMA传输过半中断

方法4:串口空闲中断
由于总线干扰产生的错误,与空闲中断无关,其它任何方式一样处理不了这个错误;
如果干扰导致空闲符号变成一个无效的数据,但是接收缓冲区足够大,并且数据帧有完善的帧结构,并不会影响到接收的数据;
如果干扰导致了一个错误的起始位,那么会触发错误中断;另外既然空闲符号都被干扰了,数据部分不一定能够保证没有被干扰;

还有就是F1系列很老了,十年的老片子了,没有与时俱进,F0系列和F3系列的USART都有可设置时长的超时检测功能

出0入0汤圆

发表于 2018-11-5 00:16:57 | 显示全部楼层
正在研究串口,学习一下

出0入0汤圆

发表于 2018-11-5 04:02:18 | 显示全部楼层
honami520 发表于 2018-11-4 23:12
其实就是楼主自己水平差差,然后嫌STM32不好用。

顶你!

楼主就这水平了。

出0入0汤圆

发表于 2018-11-5 06:31:16 | 显示全部楼层
方法2:DMA定长中断接收, DMA设定长度,如果丢了一个数据,每次中断 后面的数据全错位。  自己把自己玩死!
---------------------------
你发送数据没有帧间隔,接收数据不做超时退出吗?一定要接收到足够数量才停止?

出0入0汤圆

发表于 2018-11-5 07:17:17 | 显示全部楼层
arm 发表于 2018-11-4 18:10
接收中断里把数据到数组里,间隔一定时间后还没新数据过来就当收到一帧数据 ...

这位同学的做法简单粗暴,我也是这么做的,有一个瓶颈是 当两条消息离得太近容易被当成一条消息处理(帧间隔时间小于字节超时时间的情况),这是需要注意的。

出140入8汤圆

发表于 2018-11-5 07:36:00 | 显示全部楼层
建议楼主玩FPGA,你要怎么玩都可以自己设计…

出0入0汤圆

发表于 2018-11-5 07:55:01 | 显示全部楼层
对实时性有要求就收到一次数据,进中断取一字节,批量接收再处理怎么做实时?

出0入0汤圆

发表于 2018-11-5 08:05:38 | 显示全部楼层
wowangru 发表于 2018-11-4 17:45
要是9600的话 这个10个字节 10ms  连续发送  就死掉了!!!!!!!

不能这样算, 一个字节 10个位(一个开始位 8个数据位 一个结束位),单片机接收到最后一个位才进中断,其它时间单片机都在忙,去中断处理的时间也很快。10个字节,估计也就暂用100us时间

出0入0汤圆

发表于 2018-11-5 09:08:01 | 显示全部楼层
我用方法4 我都用9600

出5入8汤圆

发表于 2018-11-5 09:11:41 来自手机 | 显示全部楼层
如果付费我可以把我的架构共享给你。其实没有你想象的那么复杂。中断和DNA我都有用。你只要设置最大值300个字节,循环接收。然后用一个1ms定时中断去判断接收结果就可以了。

出0入4汤圆

发表于 2018-11-5 09:14:38 | 显示全部楼层
icoyool 发表于 2018-11-5 09:11
如果付费我可以把我的架构共享给你。其实没有你想象的那么复杂。中断和DNA我都有用。你只要设置最大值300个 ...

这还要付费呀。。。你也想得出来

出0入0汤圆

发表于 2018-11-5 09:17:54 | 显示全部楼层
建议先算算实际的误码率

出0入0汤圆

发表于 2018-11-5 09:19:32 | 显示全部楼层

我也是这么用的,接收处理两不误。

出0入59汤圆

发表于 2018-11-5 09:33:28 | 显示全部楼层
用了这么多年的东西,大家都在用,也没听谁说不能用,顶多是不如atmel的用着方便

出0入0汤圆

发表于 2018-11-5 09:34:10 | 显示全部楼层
差点被hal库搞死,DMA+空闲中断能解决,挺稳定的

出0入0汤圆

发表于 2018-11-5 09:36:48 | 显示全部楼层
我是协议中有数据的长度,首先DMA接收固定字节 接收到协议的长度,然后根据长度通过DMA接收后续的数据,加上接收中断超时判断还是挺好用的

出140入158汤圆

发表于 2018-11-5 09:43:12 | 显示全部楼层
honami520 发表于 2018-11-4 23:12
其实就是楼主自己水平差差,然后嫌STM32不好用。

哈哈,顶你到二楼。纵观上面的帖子,就只有两几位朋友说的是正解,怪不得国产的设备的串口通信做的垃圾一样,原来是有群众基础的。STM32的串口其实已经很强大,正确的方式是:需要实时性非常高的,串口接收中断。实时性不算很高的,硬件循环DMA做FIFO,定时中断作读取,提取数据包,您想定长就定长,想变长就变长,想校验就校验,想咋弄就咋弄。

出0入0汤圆

发表于 2018-11-5 09:47:36 | 显示全部楼层
DMA循环接收+空闲中断+定时中断取数据,

出90入4汤圆

发表于 2018-11-5 09:52:22 来自手机 | 显示全部楼层
一般中断接收,DMA发送。若不起,只能躲。

出0入0汤圆

发表于 2018-11-5 09:55:16 | 显示全部楼层
DMA循环十FIFO 一段伪代码,仅表达逻辑,不甚严谨。

buf[Len];//根据波特率和处理速度,估算Len
bufP=0,bufEnd=0;

启动DMA接收,循环向buf装数据;
在定时或在大循环处理
{
  while(1)
  {
    bufEnd=Len-huart1.hdmarx->Instance->NDTR;
    if(bufEnd!=bufP)
        {
          接收到的数据=buf[bufP];
          if (bufP<(Len-1))
           {
               bufP++;
            }
            else
            {
                bufP=0;
             }
   }
   else
   break;
   }
}

出0入0汤圆

发表于 2018-11-5 10:01:36 | 显示全部楼层
amigenius 发表于 2018-11-5 09:43
哈哈,顶你到二楼。纵观上面的帖子,就只有两几位朋友说的是正解,怪不得国产的设备的串口通信做的垃圾一 ...

stm32的串口很灵活,因为它完全可以用dma来模拟fifo,可以认为硬件fifo就是用dma做出来的

所以stm32其实挺不错,看用户怎么把握

出0入0汤圆

发表于 2018-11-5 10:05:40 | 显示全部楼层
freertos串口中断加消息队列状态机逻辑处理,简单省事

出10入12汤圆

 楼主| 发表于 2018-11-5 10:22:13 | 显示全部楼层
集思广益 ,方法果然多

出0入0汤圆

发表于 2018-11-5 10:25:11 | 显示全部楼层
串口中断接收数据存到环形队列中,数据处理在主程序中做,应该不占用多少资源吧

出0入50汤圆

发表于 2018-11-5 10:30:22 | 显示全部楼层
wowangru 发表于 2018-11-4 20:34
100字节 CPU就占%10了

我不知道你这100字节的CPU中断开销10%怎么算出来和怎么做出来的。

我一个破51,用115200用足了不停收发,平均1秒超10K字节的数据,比你这大了100倍,都没出错啊,按理说已经是你的STM32的1000%的负荷,早趴下了,

可能吗?你的中断处理程序肯定有问题!

出140入158汤圆

发表于 2018-11-5 10:47:13 | 显示全部楼层
wowangru 发表于 2018-11-5 10:22
集思广益 ,方法果然多

朋友虚心点吧,别一出问题就吐槽,请教问题也要谦逊一点,这里卧虎藏龙,高人很多!

出0入0汤圆

发表于 2018-11-5 11:56:22 | 显示全部楼层
ARM处理器的中断处理,确实不好,原因呢,是因为寄存器太多,进出一次中断,保存/恢复寄存器所用时间不少,MCS-51就不同,中断时,没几个寄存器的值需要保存/恢复。
所以说,寄存器多了,并非一定是好事。

出0入162汤圆

发表于 2018-11-5 12:00:06 来自手机 | 显示全部楼层
太麻烦?简单阿
用DMA 接收,空闲中断时把DMA 接收到的数据放入接收缓冲区中。
接收缓冲区采用环形队列结构,通讯程序对缓冲区数据进行处理即可。什么数据都不会丢的。

出50入0汤圆

发表于 2018-11-5 12:17:48 | 显示全部楼层
感觉楼主是来钓鱼的,标题党。

出0入0汤圆

发表于 2018-11-5 12:18:44 来自手机 | 显示全部楼层
wuzhujian 发表于 2018-11-5 11:56
ARM处理器的中断处理,确实不好,原因呢,是因为寄存器太多,进出一次中断,保存/恢复寄存器所用时间不少, ...

大哥  也不看看速度比51快  怎么能按个数论

出0入8汤圆

发表于 2018-11-5 12:28:52 | 显示全部楼层
容我大笑三声,哈哈哈哈哈哈。。。心疼stm32

出1325入193汤圆

发表于 2018-11-5 12:33:21 | 显示全部楼层
wshtyr 发表于 2018-11-4 20:42
那就放在中断里处理吧。。

char rx_buffer[RX_BUFFER_SIZE];

stm32 串口接收最佳方法

出0入0汤圆

发表于 2018-11-5 17:11:27 | 显示全部楼层
本帖最后由 252514251 于 2018-11-5 17:15 编辑

方法4:串口空闲中断,  stm32 不能设置串口空闲时间长度!!总线有干扰或者100K 1M时就搞死! 坑爹。

什么鬼

我用的是 DMA 循环接收
串口空闲中断 触发定时器 ,定时器时间到,才触发解析数据,定时器时间未到 又来 串口空闲中断的话,清零定时器 重新计时

难道
总线有干扰或者100K 1M时  串口空闲中断会失效么?

出0入0汤圆

发表于 2018-11-5 18:11:38 来自手机 | 显示全部楼层
252514251 发表于 2018-11-5 17:11
方法4:串口空闲中断,  stm32 不能设置串口空闲时间长度!!总线有干扰或者100K 1M时就搞死! 坑爹。

什 ...

如果定时器到了,下一个真正的包尾还没到呢?

出10入12汤圆

 楼主| 发表于 2018-11-5 19:27:26 | 显示全部楼层
我承认我绝对是来钓鱼的!!!!       我测试了串口空闲+定时器的方法, 实验条件下很稳定,115200 满负荷收发,任意长度,没丢数据,CPU还能干活。

出10入12汤圆

 楼主| 发表于 2018-11-5 19:35:16 | 显示全部楼层
cddyy 发表于 2018-11-5 12:17
感觉楼主是来钓鱼的,标题党。

不觉得这个帖子很有价值吗?  stm32 串口接收的各种方法都有了!!! 前人栽树后人乘凉,标准的论坛精神!

出0入0汤圆

发表于 2018-11-5 20:41:35 | 显示全部楼层
Ray______ 发表于 2018-11-5 18:11
如果定时器到了,下一个真正的包尾还没到呢?

应该是没有新数据来才算

出0入0汤圆

发表于 2018-11-5 20:51:40 | 显示全部楼层
Ray______ 发表于 2018-11-5 18:11
如果定时器到了,下一个真正的包尾还没到呢?

应该是
1.串口空闲中断 读取dma指针 p1,开启定时器计时

2.定时时间到 再次读取 dma指针 p2,
比较 p2 != p1 没有收完
p1 = p2 收完了

定时期间又产生串口空闲中断,不影响,重新开启定时器,重新计时

这样ok不

出0入0汤圆

发表于 2018-11-5 20:54:16 | 显示全部楼层
Ray______ 发表于 2018-11-5 18:11
如果定时器到了,下一个真正的包尾还没到呢?

他说的
总线有干扰或者100K 1M时就搞死
有遇到么,我没有搞过多设备的485,机内 直接usart ,外部总线用的CAN

出0入0汤圆

发表于 2018-11-5 20:57:23 | 显示全部楼层
amigenius 发表于 2018-11-5 09:43
哈哈,顶你到二楼。纵观上面的帖子,就只有两几位朋友说的是正解,怪不得国产的设备的串口通信做的垃圾一 ...

modbus T3.5 你定时中断作读取  应该搞不定 帧首尾

出0入296汤圆

发表于 2018-11-5 20:59:26 来自手机 | 显示全部楼层
看了评论……震惊了……太可怕了……

出0入29汤圆

发表于 2018-11-5 21:06:58 | 显示全部楼层
串口中断只接收数据(一个计数器和一个BUFF),数据处理解码在while里面处理

出0入0汤圆

发表于 2018-11-5 21:09:17 | 显示全部楼层
稳定才是最重要

出0入4汤圆

发表于 2018-11-5 21:16:41 来自手机 | 显示全部楼层
Gorgon_Meducer 发表于 2018-11-5 20:59
看了评论……震惊了……太可怕了……

大神有何高见呀,推荐一个最佳方案呀

出10入12汤圆

 楼主| 发表于 2018-11-5 21:33:34 来自手机 | 显示全部楼层
十分感谢各位解惑!!!获益匪浅!

出0入296汤圆

发表于 2018-11-5 21:34:05 | 显示全部楼层
fbwcpu 发表于 2018-11-5 21:16
大神有何高见呀,推荐一个最佳方案呀

前面人都提到了吧。我只是感慨……一楼说的几个方案……貌似,第一个就是错的……然后大家
还煞有介事的认为STM32串口就是不好用……我只是感慨,问题太基础……比较担心代码质量。

出10入12汤圆

 楼主| 发表于 2018-11-5 21:36:43 来自手机 | 显示全部楼层
Ray______ 发表于 2018-11-5 18:11
如果定时器到了,下一个真正的包尾还没到呢?

如果定时到了包尾还没到,那通信一定出了问题!这针数据还是会被解析,解析后检验不合格就丢掉!

出10入12汤圆

 楼主| 发表于 2018-11-5 21:41:34 来自手机 | 显示全部楼层
Gorgon_Meducer 发表于 2018-11-5 21:34
前面人都提到了吧。我只是感慨……一楼说的几个方案……貌似,第一个就是错的……然后大家
还煞有介事的 ...

对熟悉的人来说确实不难!  上面的回复已经有我最满意的方案!  做到任意长度,任意负荷!同时收发,  且不占用cpu, 不丢数据。不错乱!  当然通信干扰收到错误数据会丢掉一帧! 这个是没法能解决的!  毕竟传来都是错的!

出10入12汤圆

 楼主| 发表于 2018-11-5 21:43:28 来自手机 | 显示全部楼层
手机有办法编辑标题吗?我修改标题以免误导

出0入22汤圆

发表于 2018-11-5 21:44:20 来自手机 | 显示全部楼层
我觉得楼主本末倒置,或者钻入死胡同了。如果有干扰,尽量先从硬件解决排除。再来软件解决。如果真有100k,1M.的干扰,啥方式都不好用。串口会一直收到数据,而没法处理。

出100入0汤圆

发表于 2018-11-5 22:01:06 | 显示全部楼层
DMA是数据接收,报文头是协议解析,话说这两个不是一回事好吗?  DMA还要管报文头,还要管解析?

出10入12汤圆

 楼主| 发表于 2018-11-5 23:50:30 来自手机 | 显示全部楼层
收完之后解析

出0入0汤圆

发表于 2018-11-6 00:11:00 | 显示全部楼层
DMA定长接收,加空闲中断……用DMA中断和空闲中断组合判断呢?

出330入0汤圆

发表于 2018-11-6 00:11:43 来自手机 | 显示全部楼层
wowangru 发表于 2018-11-5 19:35
不觉得这个帖子很有价值吗?  stm32 串口接收的各种方法都有了!!! 前人栽树后人乘凉,标准的论坛精神 ...

算是功德一件,集大成者。

出0入0汤圆

发表于 2018-11-6 01:48:00 来自手机 | 显示全部楼层
如果双机都是自己开发的,定制协议的时候可以使用加强slip协议进行祯分割,这样基本是全速在传输,没有粘包现象

出140入8汤圆

发表于 2018-11-6 06:42:46 | 显示全部楼层
可以看出,在群魔乱舞,卧虎藏龙,鱼龙混杂的我大坛发这种调调的帖子,确实略显水平太差…
各路大神还是很和气的…但是也有个别开骂的倾向了…

出0入0汤圆

发表于 2018-11-6 07:24:56 来自手机 | 显示全部楼层
DMA+循环队列的方法也不能满足你了吗?再加上检验自动纠错功能应该就行了吧

出0入0汤圆

发表于 2018-11-6 08:46:13 | 显示全部楼层
252514251 发表于 2018-11-5 20:51
应该是
1.串口空闲中断 读取dma指针 p1,开启定时器计时

我的思路也是这样~

出0入0汤圆

发表于 2018-11-6 08:48:14 | 显示全部楼层
wowangru 发表于 2018-11-5 21:36
如果定时到了包尾还没到,那通信一定出了问题!这针数据还是会被解析,解析后检验不合格就丢掉! ...

不一定噢,空闲中断的时间很短的,假设这个触发点在一个包的前面或者中间,足够时间超过3.5T。
当然严谨的来说肯定认为空闲就是一包的,但是实际总会有不理想的情况。

出0入0汤圆

发表于 2018-11-6 10:00:51 | 显示全部楼层
wshtyr 发表于 2018-11-4 20:42
那就放在中断里处理吧。。

char rx_buffer[RX_BUFFER_SIZE];

我的程序也是用你这种方法,感觉很好用啊,都能满足我的需求

出10入12汤圆

 楼主| 发表于 2018-11-6 10:13:08 | 显示全部楼层
Ray______ 发表于 2018-11-6 08:48
不一定噢,空闲中断的时间很短的,假设这个触发点在一个包的前面或者中间,足够时间超过3.5T。
当然严谨 ...

一包分开发的话肯定不行!!! 我指的是一包连续发送
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-30 05:08

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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