极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 20408|回复: 7

关于串口复用的问题

[复制链接]
发表于 2014-4-12 12:30:08 | 显示全部楼层 |阅读模式
本帖最后由 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转发出去,基本就没啥延迟


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2014-4-12 12:53:08 | 显示全部楼层
虚拟串口听说用过的人说不稳定,处理不可靠数据没事,分时的话,上下位机最好有协议,就是比如A上位机,BC下位机,A发送给B说你不要发了,此时B的输出电平应该拉高,这样才能和C正常通讯,推荐换stm32f103系列,3个硬uart,淘宝上导出引脚的开发板在40-50左右,串口可以直接写片,调试器jlink v8 60-70块。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-12 13:21:48 | 显示全部楼层
本帖最后由 hi55234 于 2014-4-12 13:28 编辑
pathletboy 发表于 2014-4-12 12:53
虚拟串口听说用过的人说不稳定,处理不可靠数据没事,分时的话,上下位机最好有协议,就是比如A上位机,BC下 ...


感谢回复,对于只有1个串口的arduino pro mini来说,复用应该是最靠谱的了

大致过程如下

1、GPS发送完毕后,pro mini 通知上位机可以发送
2、上位机在接收到可以发送通知的时候,在特定时间段内发送控制命令
3、pro mini 校验后通知上位机(是否有效,如果无效,上位机则在下一个时间段再发送)

存在的问题:
1、控制命令延迟严重~~~少说都在400ms以上(若是一次性发送若干命令,比如持续连击,那个延迟完全不能接受)
2、上位机程序相对复杂,需要在非发送时段存储控制命令,且必须计算合理阻塞时间片

PS:虽然问题多多,但值得一试,毕竟玩的就是折腾

还有方案目测是,双芯片,2个arduino pro mini,一个用于数据采集、处理、计算、一个专门接受控制命令,做出相应的操作,分别接在蓝牙串口的RX、TX上,除了控制芯片成本翻倍、增加采集芯片对受控芯片的控制外,其他也还好,关键控制没延迟
回复 支持 反对

使用道具 举报

发表于 2014-4-12 13:35:02 | 显示全部楼层
hi55234 发表于 2014-4-12 13:21
感谢回复,对于只有1个串口的arduino pro mini来说,复用应该是最靠谱的了

大致过程如下

带来的不光成本增加,项目复杂度也增加了,而且硬件模块越多,项目稳定性就越低。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-13 12:46:39 | 显示全部楼层
本帖最后由 hi55234 于 2014-4-13 20:19 编辑







本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2014-4-13 23:15:57 | 显示全部楼层
本帖最后由 yyy_zc 于 2014-4-13 23:18 编辑

虚拟串口很好用呀(至少在我的实验中行畅快)。而且他是有缓存的,延迟个几毫秒对应用应该影响不大(或者应用自己进行同步控制),而且可调高串口的通讯速率。GPS1 秒一次,蓝牙控制信息更不频繁,对于8MHZ 以上的MCU 这些都可忽略 。即使软件中断比硬件慢了1 毫秒,对使用者还说键盘回车都是几十毫秒。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-14 14:27:18 | 显示全部楼层
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
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-14 15:09:43 | 显示全部楼层
DS1307在没有接入的情况下,在、以下命令最好别用,否则会无限等待的~~~就这个破问题,尽然折腾了俺20分钟~~~

    DateTime now = RTC.now();
      //通过串口传送当前的日期和时间      
printDateTime(now);

PS:话说这个子程序大概耗时30ms的样子
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-22 20:59 , Processed in 0.058485 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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