找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 5041|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

求助:單片機(jī)串口讀取設(shè)備數(shù)據(jù),為何有一個(gè)1秒延時(shí)?奉上全部身家

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:894800 發(fā)表于 2021-5-7 21:27 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
19黑幣
本人用AT516電阻儀測量電阻,電阻儀說明書上采樣速率7ms,140次/秒。
讀取電阻儀數(shù)據(jù)時(shí),向電阻儀發(fā)送一次"fetch"指令,電阻儀自動(dòng)返回一次數(shù)據(jù),具體實(shí)現(xiàn)有兩種方法:
第一種,電阻儀有232接口,可通過232轉(zhuǎn)USB線直連電腦,在電腦串口助手上定時(shí)發(fā)送指令、接收數(shù)據(jù)。此方法采樣速率50ms-100ms,可達(dá)到要求。

第二種:通過232轉(zhuǎn)TTL芯片接線到單片機(jī)(軟串口),單片機(jī)通過軟串口向電阻儀發(fā)指令,電阻儀返回?cái)?shù)據(jù),讀取軟串口數(shù)據(jù)通過串口發(fā)送到電腦。

代碼如下
  1. #include <SoftwareSerial.h>      
  2. SoftwareSerial DLSerial(2, 3); // 軟串口 RX(D2), TX(D3)  
  3. String stringOne="";//存儲(chǔ)接收的類如“+5.5019e+06,BIN00”的數(shù)據(jù)
  4. void setup() {      
  5. DLSerial.begin(38400); //軟串口波特率38400     
  6. Serial.begin(9600) ;//默認(rèn)串口波特率9600   
  7. Serial.println("DLSerial is ready!");  
  8. }      
  9. void loop() {     
  10. DLSerial.listen();         
  11. DLSerial.write("fetch?"); //軟串口發(fā)送字節(jié)數(shù)據(jù)      
  12. delay(50); //延時(shí)50ms     
  13. while (DLSerial.available()>0) //如果緩存中有接收到的數(shù)據(jù)     
  14. {      
  15.     String stringOne = DLSerial.readString(); //讀取軟串口數(shù)據(jù)賦給字符串stringOne      
  16.     Serial.print(stringOne);  //通過串口發(fā)到PC      
  17. }         
  18. }
復(fù)制代碼
方法可行,我設(shè)想通過延時(shí)程序改變讀取速度。比如本代碼設(shè)置延時(shí)50ms,但是實(shí)際讀取一次為1050ms,無論設(shè)置延時(shí)多少,實(shí)際都會(huì)增加1000ms。
我已嘗試增加串口波特率,未果。

本人為機(jī)械專業(yè)學(xué)生,沒有做過單片機(jī)項(xiàng)目,時(shí)間緊張,也是第一次發(fā)貼求助,可能在閱讀感受上給大家?guī)砹瞬蛔,如有表述不清等問題,感謝大家批評(píng)指正,我會(huì)及時(shí)改正,謝謝大家?guī)椭?font color="red">






1.png (31.24 KB, 下載次數(shù): 102)

1.png
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:887371 發(fā)表于 2021-5-8 09:40 | 只看該作者
看了半天,不知道你需求。1050ms很可能時(shí)電阻儀的特性,要驗(yàn)證很簡單。在第一張圖的基礎(chǔ)上發(fā)"fetch"指令。
回復(fù)

使用道具 舉報(bào)

板凳
ID:844772 發(fā)表于 2021-5-8 09:46 | 只看該作者
你使用了arduino 的軟串口,應(yīng)該用了Time0,也就是和delay()沖突了,用個(gè)簡單的
回復(fù)

使用道具 舉報(bào)

地板
ID:844772 發(fā)表于 2021-5-8 09:46 | 只看該作者
用個(gè)簡單的for循環(huán)代替delay試試。
回復(fù)

使用道具 舉報(bào)

5#
ID:827243 發(fā)表于 2021-5-8 10:38 | 只看該作者
沒用過 DLSerial, 看程序應(yīng)該是 DLSerial.listen();  是阻塞進(jìn)程,要等1000ms沒收到東西才退出。
回復(fù)

使用道具 舉報(bào)

6#
ID:894800 發(fā)表于 2021-5-8 19:49 | 只看該作者
datouyuan 發(fā)表于 2021-5-8 09:40
看了半天,不知道你需求。1050ms很可能時(shí)電阻儀的特性,要驗(yàn)證很簡單。在第一張圖的基礎(chǔ)上發(fā)"fetch"指令。

你好,電阻儀直接連接電腦,本可7ms測一次數(shù)據(jù),但是連接單片機(jī)后,我想通過   delay(50)  實(shí)現(xiàn)50ms測一次數(shù)據(jù),但實(shí)際是1050ms,無故多了1000ms,我不清楚問題出在哪里。   
回復(fù)

使用道具 舉報(bào)

7#
ID:155507 發(fā)表于 2021-5-9 08:01 | 只看該作者
如果你的項(xiàng)目需要同步數(shù)據(jù)流,請(qǐng)參閱Paul Stoffregen的AltSoftSerial庫。 AltSoftSerial克服了核心SoftwareSerial的許多其他問題,但是有其自身的局限性。 有關(guān)更多信息,請(qǐng)參考AltSoftSerial網(wǎng)站。

如果你的項(xiàng)目需要同步數(shù)據(jù)流,請(qǐng)參閱Paul Stoffregen的AltSoftSerial庫。 AltSoftSerial克服了核心SoftwareSerial的許多其他問題,但是有其自身的局限性。 有關(guān)更多信息,請(qǐng)參考AltSoftSerial網(wǎng)站。 www點(diǎn)pjrc點(diǎn)com/teensy/td_libs_AltSoftSerial.html  AltSoftSerial庫 AltSoftSerial模擬一個(gè)附加的串行端口,使你可以與另一個(gè)串行設(shè)備進(jìn)行通信。  AltSoftSerial能夠在16 MHz AVR上運(yùn)行高達(dá)31250波特,或者在96 MHz下的Teensy 3.2上運(yùn)行高達(dá)400000波特。 當(dāng)其他代碼可能會(huì)延遲AltSoftSerial的中斷響應(yīng)時(shí),建議使用較慢的波特率。  串口選項(xiàng) HardwareSerial-最佳性能。 如果可用,請(qǐng)始終先使用此功能! Teensy和Teensy ++具有一個(gè)可用的HardwareSerial端口(不適用于上傳或Arduino串行監(jiān)視器)。 Arduino Mega具有3個(gè)額外的HardwareSerial端口。 Arduino Uno沒有。 AltSoftSerial-可以同時(shí)發(fā)送和接收。 同時(shí)使用HardwareSerial和其他庫時(shí)的干擾最小。 使用一個(gè)16位定時(shí)器(不適用于需要該定時(shí)器的任何庫)并禁用某些PWM引腳。 對(duì)其他庫的中斷使用可能很敏感。 SoftwareSerial(以前稱為“ NewSoftSerial”)-幾乎在任何引腳上都可以有多個(gè)實(shí)例,但是一次只能激活1個(gè)。 不能同時(shí)發(fā)送和接收。 如果以較低的波特率使用,可能會(huì)干擾其他庫或HardwareSerial。 對(duì)其他庫的中斷使用可能很敏感。 Old SoftwareSerial(Arduino 0023及更早版本中的SoftwareSerial)-性能很差。  AltSoftSerial和SoftwareSerial可用速度 一個(gè)常見的問題是這些庫可以支持的最大波特率。兩者都可以以大約1位的其他代碼的中斷延遲時(shí)間工作。因此,如果其他中斷最多花費(fèi)15 μs(例如某些庫),則應(yīng)該有57600的波特率。 如果沒有其他庫,則在Teensy或Arduino(已修復(fù)問題776)上,中斷延遲約為3到4 μs。 115200波特是可能的。  但是,最大波特率通常不是最重要的問題。每個(gè)庫對(duì)其他庫都施加了中斷延遲。 AltSoftSerial導(dǎo)致大約2-3 μs的延遲。 SoftwareSerial會(huì)導(dǎo)致其他庫延遲10比特時(shí)間。以57600波特運(yùn)行,這是174 μs!此延遲是AltSoftSerial和SoftwareSerial之間的主要區(qū)別。  要查看實(shí)際效果,您可以嘗試Arduino 1.0中SoftwareSerial附帶的示例。如果您在Arduino串行監(jiān)視器中鍵入“晚安”,您將看到在4800波特處針腳3實(shí)際出現(xiàn)的是“ Goot”。字符“ dnigh”丟失了。原因是因?yàn)楫?dāng)SoftwareSerial在4800發(fā)送字母“ G”時(shí),字母“ oodnigh”到達(dá)57600波特。 UART寄存器中僅保留“ oo”。其余的丟失是因?yàn)榻怪袛鄷r(shí)間太長了。 AltSoftSerial可以長時(shí)間不鎖定中斷,因此可以輕松處理此測試。  https://github.com/PaulStoffregen/AltSoftSerial


AltSoftSerial
AltSoftSerial模擬一個(gè)附加的串行端口,使你可以與另一個(gè)串行設(shè)備進(jìn)行通信。

AltSoftSerial能夠在16 MHz AVR上運(yùn)行高達(dá)31250波特,或者在96 MHz下的Teensy 3.2上運(yùn)行高達(dá)400000波特。 當(dāng)其他代碼可能會(huì)延遲AltSoftSerial的中斷響應(yīng)時(shí),建議使用較慢的波特率。

串口選項(xiàng)
  • HardwareSerial-最佳性能。 如果可用,請(qǐng)始終先使用此功能! Teensy和Teensy ++具有一個(gè)可用的HardwareSerial端口(不適用于上傳或Arduino串行監(jiān)視器)。 Arduino Mega具有3個(gè)額外的HardwareSerial端口。 Arduino Uno沒有。
  • AltSoftSerial-可以同時(shí)發(fā)送和接收。 同時(shí)使用HardwareSerial和其他庫時(shí)的干擾最小。 使用一個(gè)16位定時(shí)器(不適用于需要該定時(shí)器的任何庫)并禁用某些PWM引腳。 對(duì)其他庫的中斷使用可能很敏感。
  • SoftwareSerial(以前稱為“ NewSoftSerial”)-幾乎在任何引腳上都可以有多個(gè)實(shí)例,但是一次只能激活1個(gè)。 不能同時(shí)發(fā)送和接收。 如果以較低的波特率使用,可能會(huì)干擾其他庫或HardwareSerial。 對(duì)其他庫的中斷使用可能很敏感。
  • Old SoftwareSerial(Arduino 0023及更早版本中的SoftwareSerial)-性能很差。


AltSoftSerial和SoftwareSerial可用速度
一個(gè)常見的問題是這些庫可以支持的最大波特率。兩者都可以以大約1位的其他代碼的中斷延遲時(shí)間工作。因此,如果其他中斷最多花費(fèi)15 μs(例如某些庫),則應(yīng)該有57600的波特率。
如果沒有其他庫,則在Teensy或Arduino(已修復(fù)問題776)上,中斷延遲約為3到4 μs。 115200波特是可能的。

但是,最大波特率通常不是最重要的問題。每個(gè)庫對(duì)其他庫都施加了中斷延遲。 AltSoftSerial導(dǎo)致大約2-3 μs的延遲。 SoftwareSerial會(huì)導(dǎo)致其他庫延遲10比特時(shí)間。以57600波特運(yùn)行,這是174 μs!此延遲是AltSoftSerial和SoftwareSerial之間的主要區(qū)別。

要查看實(shí)際效果,您可以嘗試Arduino 1.0中SoftwareSerial附帶的示例。如果您在Arduino串行監(jiān)視器中鍵入“晚安”,您將看到在4800波特處針腳3實(shí)際出現(xiàn)的是“ Goot”。字符“ dnigh”丟失了。原因是因?yàn)楫?dāng)SoftwareSerial在4800發(fā)送字母“ G”時(shí),字母“ oodnigh”到達(dá)57600波特。 UART寄存器中僅保留“ oo”。其余的丟失是因?yàn)榻怪袛鄷r(shí)間太長了。 AltSoftSerial可以長時(shí)間不鎖定中斷,因此可以輕松處理此測試。

https://github.com/PaulStoffregen/AltSoftSerial

NeoSWSerial
波特率9600、19200和38400的SoftwareSerial的高效替代品。同時(shí)進(jìn)行RX和TX,不需要額外的TIMER,在RX期間不禁用中斷

NeoSWSerial-3.0.5.zip

11.18 KB, 下載次數(shù): 3

AltSoftSerial-master.zip

14.29 KB, 下載次數(shù): 3

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表