Arduino DUE 串口缓冲区 只有64字节 不够用 怎么办?
用Arduino DUE与703N进行通讯,串口缓冲区只能有64字节,最后一个字节还是空,不够用的 能否像1.0.5版本那样修改串口缓冲区的size?DUE用的是Arduino 1.5.6版本,阅读了core代码 没有找到哪里能够修改,请高手赐教! 看源碼在<arduino>\hardware\arduino\avr\cores\arduino\HardwareSerial.h
當中設定:#if (RAMEND < 1000)
#define SERIAL_BUFFER_SIZE 16
#else
#define SERIAL_BUFFER_SIZE 64
#endif但未試過修改, 不知是否有效. Super169 发表于 2014-6-27 09:11 static/image/common/back.gif
看源碼在
\hardware\arduino\avr\cores\arduino\HardwareSerial.h
这个试了一下 还是被截断了。
另外在sam文件夹下面没有找到类似修改的地方 不推荐改arduino库源码,你可以选择buffer满的时候等待,或者自己再后面接1层大buffer。 pathletboy 发表于 2014-6-27 13:19 static/image/common/back.gif
不推荐改arduino库源码,你可以选择buffer满的时候等待,或者自己再后面接1层大buffer。
我是新手,编程的东西很多都不懂,从703N传过来的内容比较多,具体我应该怎么做呀? lien 发表于 2014-6-27 15:24 static/image/common/back.gif
我是新手,编程的东西很多都不懂,从703N传过来的内容比较多,具体我应该怎么做呀?
你是收缓冲区满的话,那就赶紧收了,处理,如果发满的话,那你自己把你的数据包切成最大64字节1组,根据你的波特率,加入延时后循环发送。 pathletboy 发表于 2014-6-27 17:37 static/image/common/back.gif
你是收缓冲区满的话,那就赶紧收了,处理,如果发满的话,那你自己把你的数据包切成最大64字节1组,根据你 ...
是个思路 实在不行 我就准备切开 做多次交互了 不过这样相对会复杂很多 lien 发表于 2014-6-28 17:03 static/image/common/back.gif
是个思路 实在不行 我就准备切开 做多次交互了 不过这样相对会复杂很多
缓冲就这么多,别说你单片机,就连台式机底层也是分包的,只不过比较大,能到2K 4K。 本帖最后由 Super169 于 2014-6-28 23:09 编辑
其實不修改庫, 也可以自建更大的 buffer.
只要在 SerialEvent 中, 不斷把資料讀出, 再放進另一個 buffer 就可以了.
要珍惜那珍貴的 SRAM, 但樓主用的是 DUE, 有 96K SRAM, 應該很夠用了. 我用due做串口读取,也遇到类似楼主的问题,
据说SerialEvent 不是一个实时中断,它仅仅在2次loop循环中执行一次中断,由于我的loop中包含多次延时,一次loop循环时间中,即会导致串口缓存满了,然后loop循环好像强制退出,跑去执行SerialEvent, 等SerialEvent 执行完,它又没有返回loop的断点位置,反而又从头还是执行。头疼了很久,后来只有设法减少串口接受数据。
\hardware\arduino\avr\cores\arduino\HardwareSerial.cpp
修改的文件不对,应该是以上文件,已验证可以。 本帖最后由 mc.six 于 2015-3-25 19:59 编辑
lien 发表于 2014-6-28 17:03 static/image/common/back.gif
是个思路 实在不行 我就准备切开 做多次交互了 不过这样相对会复杂很多
不好意思发错了 本帖最后由 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:56 编辑
mc.six 发表于 2015-3-25 16:48 static/image/common/back.gif
请教一下,怎么才能快速收下来。我有个串口传过来的数据有450个字符(ASCII码),发端是GSM模块一个命令 ...
请调整你的程序逻辑,尽量减少忙等待(delay函数),使得处理器尽可能高效的从缓冲区取出数据进行处理,一个正常的业务逻辑中,是不该含有忙等待的。 mc.six 发表于 2015-3-25 16:48 static/image/common/back.gif
请教一下,怎么才能快速收下来。我有个串口传过来的数据有450个字符(ASCII码),发端是GSM模块一个命令 ...
请问楼主解决了没有?遇到了同样的问题
页:
[1]
2