找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3356|回复: 6
打印 上一主题 下一主题
收起左侧

求助:单片机串口读取设备数据,为何有一个1秒延时?奉上全部身家

[复制链接]
跳转到指定楼层
楼主
ID:894800 发表于 2021-5-7 21:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
19黑币
本人用AT516电阻仪测量电阻,电阻仪说明书上采样速率7ms,140次/秒。
读取电阻仪数据时,向电阻仪发送一次"fetch"指令,电阻仪自动返回一次数据,具体实现有两种方法:
第一种,电阻仪有232接口,可通过232转USB线直连电脑,在电脑串口助手上定时发送指令、接收数据。此方法采样速率50ms-100ms,可达到要求。

第二种:通过232转TTL芯片接线到单片机(软串口),单片机通过软串口向电阻仪发指令,电阻仪返回数据,读取软串口数据通过串口发送到电脑。

代码如下
  1. #include <SoftwareSerial.h>      
  2. SoftwareSerial DLSerial(2, 3); // 软串口 RX(D2), TX(D3)  
  3. String stringOne="";//存储接收的类如“+5.5019e+06,BIN00”的数据
  4. void setup() {      
  5. DLSerial.begin(38400); //软串口波特率38400     
  6. Serial.begin(9600) ;//默认串口波特率9600   
  7. Serial.println("DLSerial is ready!");  
  8. }      
  9. void loop() {     
  10. DLSerial.listen();         
  11. DLSerial.write("fetch?"); //软串口发送字节数据      
  12. delay(50); //延时50ms     
  13. while (DLSerial.available()>0) //如果缓存中有接收到的数据     
  14. {      
  15.     String stringOne = DLSerial.readString(); //读取软串口数据赋给字符串stringOne      
  16.     Serial.print(stringOne);  //通过串口发到PC      
  17. }         
  18. }
复制代码
方法可行,我设想通过延时程序改变读取速度。比如本代码设置延时50ms,但是实际读取一次为1050ms,无论设置延时多少,实际都会增加1000ms。
我已尝试增加串口波特率,未果。

本人为机械专业学生,没有做过单片机项目,时间紧张,也是第一次发贴求助,可能在阅读感受上给大家带来了不变,如有表述不清等问题,感谢大家批评指正,我会及时改正,谢谢大家帮助。






1.png (31.24 KB, 下载次数: 77)

1.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:887371 发表于 2021-5-8 09:40 | 只看该作者
看了半天,不知道你需求。1050ms很可能时电阻仪的特性,要验证很简单。在第一张图的基础上发"fetch"指令。
回复

使用道具 举报

板凳
ID:844772 发表于 2021-5-8 09:46 | 只看该作者
你使用了arduino 的软串口,应该用了Time0,也就是和delay()冲突了,用个简单的
回复

使用道具 举报

地板
ID:844772 发表于 2021-5-8 09:46 | 只看该作者
用个简单的for循环代替delay试试。
回复

使用道具 举报

5#
ID:827243 发表于 2021-5-8 10:38 | 只看该作者
没用过 DLSerial, 看程序应该是 DLSerial.listen();  是阻塞进程,要等1000ms没收到东西才退出。
回复

使用道具 举报

6#
ID:894800 发表于 2021-5-8 19:49 | 只看该作者
datouyuan 发表于 2021-5-8 09:40
看了半天,不知道你需求。1050ms很可能时电阻仪的特性,要验证很简单。在第一张图的基础上发"fetch"指令。

你好,电阻仪直接连接电脑,本可7ms测一次数据,但是连接单片机后,我想通过   delay(50)  实现50ms测一次数据,但实际是1050ms,无故多了1000ms,我不清楚问题出在哪里。   
回复

使用道具 举报

7#
ID:155507 发表于 2021-5-9 08:01 | 只看该作者
如果你的项目需要同步数据流,请参阅Paul Stoffregen的AltSoftSerial库。 AltSoftSerial克服了核心SoftwareSerial的许多其他问题,但是有其自身的局限性。 有关更多信息,请参考AltSoftSerial网站。

如果你的项目需要同步数据流,请参阅Paul Stoffregen的AltSoftSerial库。 AltSoftSerial克服了核心SoftwareSerial的许多其他问题,但是有其自身的局限性。 有关更多信息,请参考AltSoftSerial网站。 www点pjrc点com/teensy/td_libs_AltSoftSerial.html  AltSoftSerial库 AltSoftSerial模拟一个附加的串行端口,使你可以与另一个串行设备进行通信。  AltSoftSerial能够在16 MHz AVR上运行高达31250波特,或者在96 MHz下的Teensy 3.2上运行高达400000波特。 当其他代码可能会延迟AltSoftSerial的中断响应时,建议使用较慢的波特率。  串口选项 HardwareSerial-最佳性能。 如果可用,请始终先使用此功能! Teensy和Teensy ++具有一个可用的HardwareSerial端口(不适用于上传或Arduino串行监视器)。 Arduino Mega具有3个额外的HardwareSerial端口。 Arduino Uno没有。 AltSoftSerial-可以同时发送和接收。 同时使用HardwareSerial和其他库时的干扰最小。 使用一个16位定时器(不适用于需要该定时器的任何库)并禁用某些PWM引脚。 对其他库的中断使用可能很敏感。 SoftwareSerial(以前称为“ NewSoftSerial”)-几乎在任何引脚上都可以有多个实例,但是一次只能激活1个。 不能同时发送和接收。 如果以较低的波特率使用,可能会干扰其他库或HardwareSerial。 对其他库的中断使用可能很敏感。 Old SoftwareSerial(Arduino 0023及更早版本中的SoftwareSerial)-性能很差。  AltSoftSerial和SoftwareSerial可用速度 一个常见的问题是这些库可以支持的最大波特率。两者都可以以大约1位的其他代码的中断延迟时间工作。因此,如果其他中断最多花费15 μs(例如某些库),则应该有57600的波特率。 如果没有其他库,则在Teensy或Arduino(已修复问题776)上,中断延迟约为3到4 μs。 115200波特是可能的。  但是,最大波特率通常不是最重要的问题。每个库对其他库都施加了中断延迟。 AltSoftSerial导致大约2-3 μs的延迟。 SoftwareSerial会导致其他库延迟10比特时间。以57600波特运行,这是174 μs!此延迟是AltSoftSerial和SoftwareSerial之间的主要区别。  要查看实际效果,您可以尝试Arduino 1.0中SoftwareSerial附带的示例。如果您在Arduino串行监视器中键入“晚安”,您将看到在4800波特处针脚3实际出现的是“ Goot”。字符“ dnigh”丢失了。原因是因为当SoftwareSerial在4800发送字母“ G”时,字母“ oodnigh”到达57600波特。 UART寄存器中仅保留“ oo”。其余的丢失是因为禁止中断时间太长了。 AltSoftSerial可以长时间不锁定中断,因此可以轻松处理此测试。  https://github.com/PaulStoffregen/AltSoftSerial


AltSoftSerial
AltSoftSerial模拟一个附加的串行端口,使你可以与另一个串行设备进行通信。

AltSoftSerial能够在16 MHz AVR上运行高达31250波特,或者在96 MHz下的Teensy 3.2上运行高达400000波特。 当其他代码可能会延迟AltSoftSerial的中断响应时,建议使用较慢的波特率。

串口选项
  • HardwareSerial-最佳性能。 如果可用,请始终先使用此功能! Teensy和Teensy ++具有一个可用的HardwareSerial端口(不适用于上传或Arduino串行监视器)。 Arduino Mega具有3个额外的HardwareSerial端口。 Arduino Uno没有。
  • AltSoftSerial-可以同时发送和接收。 同时使用HardwareSerial和其他库时的干扰最小。 使用一个16位定时器(不适用于需要该定时器的任何库)并禁用某些PWM引脚。 对其他库的中断使用可能很敏感。
  • SoftwareSerial(以前称为“ NewSoftSerial”)-几乎在任何引脚上都可以有多个实例,但是一次只能激活1个。 不能同时发送和接收。 如果以较低的波特率使用,可能会干扰其他库或HardwareSerial。 对其他库的中断使用可能很敏感。
  • Old SoftwareSerial(Arduino 0023及更早版本中的SoftwareSerial)-性能很差。


AltSoftSerial和SoftwareSerial可用速度
一个常见的问题是这些库可以支持的最大波特率。两者都可以以大约1位的其他代码的中断延迟时间工作。因此,如果其他中断最多花费15 μs(例如某些库),则应该有57600的波特率。
如果没有其他库,则在Teensy或Arduino(已修复问题776)上,中断延迟约为3到4 μs。 115200波特是可能的。

但是,最大波特率通常不是最重要的问题。每个库对其他库都施加了中断延迟。 AltSoftSerial导致大约2-3 μs的延迟。 SoftwareSerial会导致其他库延迟10比特时间。以57600波特运行,这是174 μs!此延迟是AltSoftSerial和SoftwareSerial之间的主要区别。

要查看实际效果,您可以尝试Arduino 1.0中SoftwareSerial附带的示例。如果您在Arduino串行监视器中键入“晚安”,您将看到在4800波特处针脚3实际出现的是“ Goot”。字符“ dnigh”丢失了。原因是因为当SoftwareSerial在4800发送字母“ G”时,字母“ oodnigh”到达57600波特。 UART寄存器中仅保留“ oo”。其余的丢失是因为禁止中断时间太长了。 AltSoftSerial可以长时间不锁定中断,因此可以轻松处理此测试。

https://github.com/PaulStoffregen/AltSoftSerial

NeoSWSerial
波特率9600、19200和38400的SoftwareSerial的高效替代品。同时进行RX和TX,不需要额外的TIMER,在RX期间不禁用中断

NeoSWSerial-3.0.5.zip

11.18 KB, 下载次数: 3

AltSoftSerial-master.zip

14.29 KB, 下载次数: 3

回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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