久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4947|回復: 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, 下載次數: 102)

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久久久久久久新郎 | 久久精品电影 | 中文字幕av网址 | 欧美日韩一区不卡 | 波多野结衣一区二区 | 男女网站免费 | 国产成人在线视频 | 日韩中文字幕在线视频 | 亚洲国产精品网站 | 一级黄色毛片免费 | 日韩精品区 | 国产精品99久久久久久www | 日韩福利片 | 成人中文字幕在线观看 | 欧美xxxⅹ性欧美大片 | 免费在线黄| 久久精品久久久久久 | 欧美日韩亚洲国产 | 99视频精品 | 瑟瑟视频在线看 | 亚洲国产精选 | 九九九久久国产免费 | 久久精品欧美电影 | 黄色成人在线 | 欧美在线观看一区 | 久久久久久久久淑女av国产精品 | 久久精品91久久久久久再现 | 久久久久久久久国产成人免费 | 日韩精品成人一区二区三区视频 | 日本视频一区二区三区 | 欧美一级黄视频 | 99re视频在线 | 久久久国产一区 | 久久蜜桃av一区二区天堂 | 亚洲人成在线观看 | 中文字幕在线观看 | 欧美三区在线观看 | 日韩一级免费电影 | 日本精品视频 | 久操伊人| 国产精品久久国产精品 |