lien 发表于 2014-6-27 07:47:27

Arduino DUE 串口缓冲区 只有64字节 不够用 怎么办?

用Arduino DUE与703N进行通讯,串口缓冲区只能有64字节,最后一个字节还是空,不够用的 能否像1.0.5版本那样修改串口缓冲区的size?DUE用的是Arduino 1.5.6版本,阅读了core代码 没有找到哪里能够修改,请高手赐教!

Super169 发表于 2014-6-27 09:11:23

看源碼在

<arduino>\hardware\arduino\avr\cores\arduino\HardwareSerial.h

當中設定:#if (RAMEND < 1000)
#define SERIAL_BUFFER_SIZE 16
#else
#define SERIAL_BUFFER_SIZE 64
#endif但未試過修改, 不知是否有效.

lien 发表于 2014-6-27 09:54:40

Super169 发表于 2014-6-27 09:11 static/image/common/back.gif
看源碼在

\hardware\arduino\avr\cores\arduino\HardwareSerial.h


这个试了一下 还是被截断了。
另外在sam文件夹下面没有找到类似修改的地方

pathletboy 发表于 2014-6-27 13:19:25

不推荐改arduino库源码,你可以选择buffer满的时候等待,或者自己再后面接1层大buffer。

lien 发表于 2014-6-27 15:24:56

pathletboy 发表于 2014-6-27 13:19 static/image/common/back.gif
不推荐改arduino库源码,你可以选择buffer满的时候等待,或者自己再后面接1层大buffer。

我是新手,编程的东西很多都不懂,从703N传过来的内容比较多,具体我应该怎么做呀?

pathletboy 发表于 2014-6-27 17:37:11

lien 发表于 2014-6-27 15:24 static/image/common/back.gif
我是新手,编程的东西很多都不懂,从703N传过来的内容比较多,具体我应该怎么做呀?

你是收缓冲区满的话,那就赶紧收了,处理,如果发满的话,那你自己把你的数据包切成最大64字节1组,根据你的波特率,加入延时后循环发送。

lien 发表于 2014-6-28 17:03:09

pathletboy 发表于 2014-6-27 17:37 static/image/common/back.gif
你是收缓冲区满的话,那就赶紧收了,处理,如果发满的话,那你自己把你的数据包切成最大64字节1组,根据你 ...

是个思路 实在不行 我就准备切开 做多次交互了 不过这样相对会复杂很多

pathletboy 发表于 2014-6-28 20:31:11

lien 发表于 2014-6-28 17:03 static/image/common/back.gif
是个思路 实在不行 我就准备切开 做多次交互了 不过这样相对会复杂很多

缓冲就这么多,别说你单片机,就连台式机底层也是分包的,只不过比较大,能到2K 4K。

Super169 发表于 2014-6-28 23:08:03

本帖最后由 Super169 于 2014-6-28 23:09 编辑

其實不修改庫, 也可以自建更大的 buffer.

只要在 SerialEvent 中, 不斷把資料讀出, 再放進另一個 buffer 就可以了.
要珍惜那珍貴的 SRAM, 但樓主用的是 DUE, 有 96K SRAM, 應該很夠用了.

leolink 发表于 2015-2-9 00:12:11

我用due做串口读取,也遇到类似楼主的问题,
据说SerialEvent 不是一个实时中断,它仅仅在2次loop循环中执行一次中断,由于我的loop中包含多次延时,一次loop循环时间中,即会导致串口缓存满了,然后loop循环好像强制退出,跑去执行SerialEvent, 等SerialEvent 执行完,它又没有返回loop的断点位置,反而又从头还是执行。头疼了很久,后来只有设法减少串口接受数据。

giluh 发表于 2015-3-16 17:32:38

\hardware\arduino\avr\cores\arduino\HardwareSerial.cpp

修改的文件不对,应该是以上文件,已验证可以。

mc.six 发表于 2015-3-25 16:46:17

本帖最后由 mc.six 于 2015-3-25 19:59 编辑

lien 发表于 2014-6-28 17:03 static/image/common/back.gif
是个思路 实在不行 我就准备切开 做多次交互了 不过这样相对会复杂很多

不好意思发错了

mc.six 发表于 2015-3-25 16:48:07

本帖最后由 mc.six 于 2015-3-25 20:02 编辑

pathletboy 发表于 2014-6-27 17:37 static/image/common/back.gif
你是收缓冲区满的话,那就赶紧收了,处理,如果发满的话,那你自己把你的数据包切成最大64字节1组,根据你 ...

请教一下,怎么才能快速收下来。我有个串口传过来的数据有450个字符(ASCII码),发端是GSM模块一个命令的输出,不可能截断。我试了   
Serial1.println("AT+CENG?");
   delay(100);
   CELLMSGt="";
while(Serial1.available())
    {
   CELLMSGt+=char(Serial1.read());
   delay(1);
   }
第一次什么也收不到,第二次就收全了,把这段代码放到别的的程序里当子程序就又不行了。


我缓冲区设的是128还请指教!!!

pathletboy 发表于 2015-4-18 23:53:41

本帖最后由 pathletboy 于 2015-4-18 23:56 编辑

mc.six 发表于 2015-3-25 16:48 static/image/common/back.gif
请教一下,怎么才能快速收下来。我有个串口传过来的数据有450个字符(ASCII码),发端是GSM模块一个命令 ...

请调整你的程序逻辑,尽量减少忙等待(delay函数),使得处理器尽可能高效的从缓冲区取出数据进行处理,一个正常的业务逻辑中,是不该含有忙等待的。

palemoon 发表于 2015-12-3 09:03:06

mc.six 发表于 2015-3-25 16:48 static/image/common/back.gif
请教一下,怎么才能快速收下来。我有个串口传过来的数据有450个字符(ASCII码),发端是GSM模块一个命令 ...

请问楼主解决了没有?遇到了同样的问题
页: [1] 2
查看完整版本: Arduino DUE 串口缓冲区 只有64字节 不够用 怎么办?