关于串口复用的问题
本帖最后由 hi55234 于 2014-4-15 19:39 编辑对于arduino的RX口,有2个需要接受的数据:
1、GPS的位置信息
2、蓝牙传来的控制信息
显然,这2个信息是不能混在一起的~~那么怎么解决呢?
1、分时复用,GPS信号传完后,发送一个传完了的标记,然后在收到这个标记的若干毫秒内,可以发送信息(GPS模块发送数据1秒1次,又若干时间,约400-500ms的空闲时间)
2、上软串口,单独处理蓝牙传来的控制信号(不过若信号同时来,软件的串口中断能超过硬件的?可以同时接受,对此俺表示怀疑)
除此之外,还有更好的方法吗?
-------------------------------------------------------------
上述图片要解决的是,当3进行时,arduino(RX)与蓝牙(RX)需要断开
上述图片要解决的是,当3进行时,arduino(RX)与蓝牙(RX)需要断开,且GPS(TX)与控制信号不能同时在线
目前电路图如下
尝试分别用软件、硬件方式解决问题
-------------------------------------------------------------
一个悲催的实事~~~
采用5楼的方案1,arduino 读取nema-1803——处理——打印nema-1803 +处理结果,整个过程耗时惊人~~
读取nema-1803 约460ms以上,可能会接近500ms
处理nema-1803,并打印处理结果(172字节)以及nema-1803(399字节)总体耗费510-550ms
留给蓝牙TX的时间片约基本没有,换言之只要输出完整的nema-1803,控制基本没戏~~~
除开串口接收数据造成的中断(这个时间倒是不多),目前整个程序耗时980-992ms,坑爹呢不是
不打印nema-1803,则整个程序耗时588ms左右
只打印有限量的处理结果(约37字节),则整个程序耗时488ms左右
如果连处理结果也不输出的话,整个程序耗时:487ms
结论:有限量的输出结果是可以接受的
__________________________________________
最后用软串口解决的问题
接法:gps——arduino RX——arduino TX ——HC-06 RX
软串口——HC-06 TX
至于gps的nema-1803 发送时间不足的问题,直接在硬件RX接到一个字符后,就立刻通过硬件TX转发出去,基本就没啥延迟
http://image.geek-workshop.com/forum/201404/14/232449pwmw4coytgrsgsu0.jpg
虚拟串口听说用过的人说不稳定,处理不可靠数据没事,分时的话,上下位机最好有协议,就是比如A上位机,BC下位机,A发送给B说你不要发了,此时B的输出电平应该拉高,这样才能和C正常通讯,推荐换stm32f103系列,3个硬uart,淘宝上导出引脚的开发板在40-50左右,串口可以直接写片,调试器jlink v8 60-70块。 本帖最后由 hi55234 于 2014-4-12 13:28 编辑
pathletboy 发表于 2014-4-12 12:53 static/image/common/back.gif
虚拟串口听说用过的人说不稳定,处理不可靠数据没事,分时的话,上下位机最好有协议,就是比如A上位机,BC下 ...
感谢回复,对于只有1个串口的arduino pro mini来说,复用应该是最靠谱的了
大致过程如下
1、GPS发送完毕后,pro mini 通知上位机可以发送
2、上位机在接收到可以发送通知的时候,在特定时间段内发送控制命令
3、pro mini 校验后通知上位机(是否有效,如果无效,上位机则在下一个时间段再发送)
存在的问题:
1、控制命令延迟严重~~~少说都在400ms以上(若是一次性发送若干命令,比如持续连击,那个延迟完全不能接受)
2、上位机程序相对复杂,需要在非发送时段存储控制命令,且必须计算合理阻塞时间片
PS:虽然问题多多,但值得一试,毕竟玩的就是折腾
还有方案目测是,双芯片,2个arduino pro mini,一个用于数据采集、处理、计算、一个专门接受控制命令,做出相应的操作,分别接在蓝牙串口的RX、TX上,除了控制芯片成本翻倍、增加采集芯片对受控芯片的控制外,其他也还好,关键控制没延迟 hi55234 发表于 2014-4-12 13:21 static/image/common/back.gif
感谢回复,对于只有1个串口的arduino pro mini来说,复用应该是最靠谱的了
大致过程如下
带来的不光成本增加,项目复杂度也增加了,而且硬件模块越多,项目稳定性就越低。 本帖最后由 hi55234 于 2014-4-13 20:19 编辑
本帖最后由 yyy_zc 于 2014-4-13 23:18 编辑
虚拟串口很好用呀(至少在我的实验中行畅快)。而且他是有缓存的,延迟个几毫秒对应用应该影响不大(或者应用自己进行同步控制),而且可调高串口的通讯速率。GPS1 秒一次,蓝牙控制信息更不频繁,对于8MHZ 以上的MCU 这些都可忽略 。即使软件中断比硬件慢了1 毫秒,对使用者还说键盘回车都是几十毫秒。 Time:2014/04/14 14:09:23
latitude:29 34.3465 N
longitude:106 30.0591 E
weixingshu:05
altitude: 353.0 M
gp2y1010:1191 mV
speed:0.00 Knot
course:262.56
$GPGGA,060923.000,2934.3465,N,10630.0591,E,1,05,1.2,353.0,M,,,,0000*03
$GPGSA,A,3,14,16,25,32,20,,,,,,,,3.1,1.2,2.9*3E
$GPGSV,3,1,09,31,57,355,,32,55,268,38,14,41,102,27,16,31,207,33*71
$GPGSV,3,2,09,20,25,304,33,29,18,078,18,25,17,039,25,22,12,166,10*78
$GPGSV,3,3,09,23,03,309,*48
$GPRMC,060923.000,A,2934.3465,N,10630.0591,E,0.00,262.56,140414,,*0D
time2=927 DS1307在没有接入的情况下,在、以下命令最好别用,否则会无限等待的~~~就这个破问题,尽然折腾了俺20分钟~~~:'(:'(:'(:'(
DateTime now = RTC.now();
//通过串口传送当前的日期和时间
printDateTime(now);
PS:话说这个子程序大概耗时30ms的样子
页:
[1]