极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 34286|回复: 14

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

[复制链接]
发表于 2014-6-27 07:47:27 | 显示全部楼层 |阅读模式
用Arduino DUE与703N进行通讯,串口缓冲区只能有64字节,最后一个字节还是空,不够用的 能否像1.0.5版本那样修改串口缓冲区的size?DUE用的是Arduino 1.5.6版本,阅读了core代码 没有找到哪里能够修改,请高手赐教!
回复

使用道具 举报

发表于 2014-6-27 09:11:23 | 显示全部楼层
看源碼在

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

當中設定:
  1. #if (RAMEND < 1000)
  2.   #define SERIAL_BUFFER_SIZE 16
  3. #else
  4.   #define SERIAL_BUFFER_SIZE 64
  5. #endif
复制代码
但未試過修改, 不知是否有效.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-27 09:54:40 | 显示全部楼层
Super169 发表于 2014-6-27 09:11
看源碼在

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

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

使用道具 举报

发表于 2014-6-27 13:19:25 | 显示全部楼层
不推荐改arduino库源码,你可以选择buffer满的时候等待,或者自己再后面接1层大buffer。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-27 15:24:56 | 显示全部楼层
pathletboy 发表于 2014-6-27 13:19
不推荐改arduino库源码,你可以选择buffer满的时候等待,或者自己再后面接1层大buffer。

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

使用道具 举报

发表于 2014-6-27 17:37:11 | 显示全部楼层
lien 发表于 2014-6-27 15:24
我是新手,编程的东西很多都不懂,从703N传过来的内容比较多,具体我应该怎么做呀?

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

使用道具 举报

 楼主| 发表于 2014-6-28 17:03:09 | 显示全部楼层
pathletboy 发表于 2014-6-27 17:37
你是收缓冲区满的话,那就赶紧收了,处理,如果发满的话,那你自己把你的数据包切成最大64字节1组,根据你 ...

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

使用道具 举报

发表于 2014-6-28 20:31:11 | 显示全部楼层
lien 发表于 2014-6-28 17:03
是个思路 实在不行 我就准备切开 做多次交互了 不过这样相对会复杂很多

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

使用道具 举报

发表于 2014-6-28 23:08:03 | 显示全部楼层
本帖最后由 Super169 于 2014-6-28 23:09 编辑

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

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

使用道具 举报

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

回复 支持 反对

使用道具 举报

发表于 2015-3-16 17:32:38 | 显示全部楼层
\hardware\arduino\avr\cores\arduino\HardwareSerial.cpp

修改的文件不对,应该是以上文件,已验证可以。
回复 支持 反对

使用道具 举报

发表于 2015-3-25 16:46:17 | 显示全部楼层
本帖最后由 mc.six 于 2015-3-25 19:59 编辑
lien 发表于 2014-6-28 17:03
是个思路 实在不行 我就准备切开 做多次交互了 不过这样相对会复杂很多


不好意思发错了
回复 支持 反对

使用道具 举报

发表于 2015-3-25 16:48:07 | 显示全部楼层
本帖最后由 mc.six 于 2015-3-25 20:02 编辑
pathletboy 发表于 2014-6-27 17:37
你是收缓冲区满的话,那就赶紧收了,处理,如果发满的话,那你自己把你的数据包切成最大64字节1组,根据你 ...


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


我缓冲区设的是128还请指教!!!
回复 支持 反对

使用道具 举报

发表于 2015-4-18 23:53:41 | 显示全部楼层
本帖最后由 pathletboy 于 2015-4-18 23:56 编辑
mc.six 发表于 2015-3-25 16:48
请教一下,怎么才能快速收下来。我有个串口传过来的数据有450个字符(ASCII码),发端是GSM模块一个命令 ...


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

使用道具 举报

发表于 2015-12-3 09:03:06 | 显示全部楼层
mc.six 发表于 2015-3-25 16:48
请教一下,怎么才能快速收下来。我有个串口传过来的数据有450个字符(ASCII码),发端是GSM模块一个命令 ...

请问楼主解决了没有?遇到了同样的问题
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-7 06:43 , Processed in 0.081074 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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