無法以RS232讀取到達每1ms遞增的變數

發現 一個問題在於

我們以RS232作為通訊 來擷取一個由1~1000 每1ms遞增的變數

可是發現 他無法每筆資料都擷取到   每筆資料中間會有堅格15筆的資訊 才能擷取到下一筆

雖然大致上繪出的圖形正確 但是無法每一筆資訊都擷取到的話

如下圖:

![](upload://ycXOHC37eqoG72V5Orzdj2SvWoI.jpeg)

![](upload://9I4sWNJxlBJkG1FMkCbA61NRvpy.jpeg)

 

我認為有以下幾種的可能性造成現在的情況:

一 我程式方面 或許是哪裡撰寫有問題  造成他作業時無法每筆資訊均擷取到

二 不知道是不是RS232他的限度是多少  會部會無法到這個快呢

 

以下是我的程式內容:

![](upload://nGKiY6gE0m7gJVVJrvjP9zoth4A.jpeg)

要是我解決的話 我會立即PO上來 與大家分享

 

 

額外補充的是:

 

中間的間隔 除了是差距15筆資訊外

也就是等於他每15ms 才擷取一次 造成的

無法到達及時每1ms就擷取的速度

個人認為rs232無法達到如此快的通信效率.

你的通信迴圈中就已經用了1ms等待通信讀取了,加上其他程序的執行時間,要讀到1ms的變化是不可能的.

 

而且在中間的回圈  我的N值可以改為1   時間改為150

因為我的N值 乘於我的 時間 的乘積必須要大於150

它才會正常擷取

不然會造成擷取失敗  變成一堆斷點 擷取到一點 再掉到0 在擷取到一點 類似這樣子的情況

![|726x293](upload://rApuzYqMxsWSCTJeU1s7gqV3X4M.jpeg)

即他最小 就只能到乘積150  無法再降下來了

  請問一下你的RS232連接的是甚麼設備?

資訊由 安川伺服MP2300  與我的電腦作溝通 

 

 

 

我打算 先把其他的程式內容先除去

不在回圈內 加入存檔 製作報表 之類的程式

直接就單單 僅止於 作通訊擷取

看會不會是因為我迴圈內作的動作太多造成時間無法這麼快

像這樣子的內容:

![|841x531](upload://3OczVxqYVQqqSYnrugLUUqRgcuC.jpeg)

 

除了這樣外

 

我可能去修改 他中間for loop的寫法

看有沒有其他的寫法

在作測試看看

影響RS232通信效率的因素有下:

1. 通信速率:速率越高,速度越快,但通訊誤失率也相對增高.

2. 通信數據格式:一般使用ascii code編成通信字串,傳送後接收端須將該字串解譯再進行回應,需耗費較長的回應等待時間.

3. 通信回應等待時間: 你的程式使用固定等待時間,當通信內容改變時,回應量增加時,極可能造成通訊失敗.應算出會回應字元量,監看接收buffer內是否

    已達到回應量.

4. 當程式中除了通信程序外,還有其他執行緒時,執行緒間執行時間分配也會影響.

雖然MODBUS 速度比一般通訊快上一倍.

但依舊無法在1ms內完成通訊命令.

不知道你讀取是伺服哪些參數

說不定可以提供不同方式測試看看

因為要建立人機介面

所以現在所要作的是先作  通訊的穩定度測試

因此才會 先練習以0~1000的遞增變數來作擷取

之後要作的會是 動力計 方面的資訊擷取

 

當然 一般差不多 通訊的速度 10 ms就能符合大部分的測試功能

只是想說有沒有辦法克服 這樣的問題 能夠1ms 及時擷取

但我想 或許真的無法到達如此快速

因為如wdj提到的

4. 當程式中除了通信程序外,還有其他執行緒時,執行緒間執行時間分配也會影響.

所以會影響到

 

所以我打算 如果我改以簡化程式 去測試看看 只有擷取功能 看會不會能影響較小

如果還是一樣的話

可能就算 改以一樣0~1000 的遞增變數 每10ms 這邊下手了

那如果搞定了 我會馬上PO上來根大家說的

努力去摟~謝謝你們

動力計 啊

這我就沒辦法

如果是讀取脈波變化量.我就有好法子.

還是給你一些建議參考看看.

1.只讀取即時需要的參數 (參數長度1最好)

2.程式內不要再做CRC運算 (因為要讀的值位置是固定;所以CRC答案是不會變的)

3.通訊速率加快(9600--->38400或更快).TIMEOUT時間越小越好(會回應為原則)

我曾經做到3m內傳送接收

那時是用仿modbus RTU做溝通,一樣也是使用CRC16

不過鮑率飆到115200 , 每筆資料長度大概7byte

但我認為用modbus RTU 也不會差多少了

可能是程式沒寫好,或著時間花在別的地方了

當然這是當時的極限測試,線上在跑沒有用這樣的參數

1m是滿拚的,傳送接收之外,還必需給它點時間處理額外的程序