RS232通訊問題!!

各位先進


最近在寫一個軸控的程式,寫了一個排程讓馬達依輸入的距離做移動,但是每執行一段

時間後(幾分鐘到幾十分鐘,不一定),就會出現VISA Write Error -1073807194或-1073807339

有上網找過這Error code的解決方法,但仍然解決不了我的問題;

附上程式來討論一下,是否是我的用法有問題。(會先執行RS232_Initial,之後下指令才用RS232_Write)

RS232_Initial.viRS232_Write.vi

麻煩有類似經驗的先進給點方向,謝謝!

能否附上你的完整程式?


還是你現在的使用法就是,
“會先執行RS232_Initial,之後下指令才用RS232_Write”
每次都這樣先後執行兩個VI,且執行一次就結束了?

先試試在RS232_Write這個程式裡,迴圈最後面加上VISA Close這個函數吧~
Product Documentation - NI

SKYBOW

不好意思沒有說清楚,我是程式一開始先執行一次RS232_Initial與控制器連線,之後就不再執行;

等到要下指令時才會使用RS232_Write來做寫讀動作,所以會一直重覆使用這VI,

等到要離開程式時才會下VISA Close。

不知道這樣的程序是否有問題??

謝謝回覆!!
Jelly41662.6737152778

[QUOTE=Jelly]

SKYBOW

不好意思沒有說清楚,我是程式一開始先執行一次RS232_Initial與控制器連線,之後就不再執行;

等到要下指令時才會使用RS232_Write來做寫讀動作,所以會一直重覆使用這VI,

等到要離開程式時才會下VISA Close。

不知道這樣的程序是否有問題??

謝謝回覆!!
[/QUOTE]

我覺得會有點問題,
因為在你RS232_Write這個VI中,COM port必須跟RS232_Initial選一樣,
但這樣做,設定值其實也可能不一致。

再加上你原本沒有用VISA Close,
所以COM Port資源有可能在執行一段時間之後,因為沒有釋放而發生預期外的問題,
這有可能是導致你錯誤訊息的原因。

我會建議Initial和Write全部寫在一起,而且為了之後更複雜的應用,可以考慮用狀態機去寫~

如果你對狀態機這個設計樣板不熟的話,可以先參考內建的範例,
你到Help->Find Examples,關鍵字打Serial,
第一個範例Continuous Serial Write and Read.vi應該就是你需要的。(我也順便上傳了,是2013版)

只要先選好COM port,然後設定好需要的Baud rate等參數,
執行程式後應該就會立刻先Initial一遍,
接下來迴圈會不斷執行,等待你按下Write或是Read按鈕,
每按一次,就會執行Case內對應的動作。
用這個範例去改寫,應該可以符合你簡單測試的需求!

Continuous Serial Write and Read.viSKYBOW41662.7671527778

SKYBOW


不好意思,版本太新打不開,多謝您的協助。

[QUOTE=Jelly]SKYBOW


不好意思,版本太新打不開,多謝您的協助。
[/QUOTE]

我VI改上傳2011版,你試試看!
或是先看底下這個VI Snippet擷圖也可~
RS232_Examples.zip

SKYBOW 


這個範例我有用過,但一執行就會跳出error -1073807339,就沒用這個範例。

目前正往硬體著手,看是否是硬體方面的問題;感謝回覆。

[QUOTE=Jelly]SKYBOW 


這個範例我有用過,但一執行就會跳出error -1073807339,就沒用這個範例。

目前正往硬體著手,看是否是硬體方面的問題;感謝回覆。
[/QUOTE]

執行範例前,按一下Highlight Execution,看一下error出自哪裡?
是不是第一個VI就出錯了? 還是在讀取時才出錯~

用這範例的話是在Read的時候跳出Error -1073807339的錯誤

但用Basic的範例是可以正常動作的。
Jelly41664.4408564815

上述的程式版本太高,無法開啟,我純粹分享自己的心得

我前陣子也有在處理持續與com port通訊的程式

是沒遇到原po說的error

但我的情形是在持續通訊過程中剛開始跑都正常,跑久以後,

讀回的值會有漏讀的情形,甚至有時會當機

後來解決後的心得如下

(1)建立通訊與Close VISA擺在迴圈外,既然是持續通訊就不需要開開關關

(2)依據每次執行的時間週期放入節拍器在迴圈中,附檔範例為一秒

(3)建立通訊的Timeout不需要如預設值十秒那麼長,接近或等同迴圈週期即可,因迴圈內可能不只有VISA Read/Write的工作,當然也不能設太短(ex.100/200msec)不然程式可能會誤判而導致讀不到硬體回傳值,附檔範例為兩秒

(4)若迴圈內有VISA Write跟VISA Read,兩者中間要放手錶Delay做緩衝,至於delay多久需依通訊硬體而定(自行測試)

(5)可於每次迴圈開始前,檢查通訊狀態,error就Close VISA再重開



基本上com port連線正常的狀況下,3&5都是不會用到的,1&2&4則是我覺得能維持持續通訊時連線品質的重要關鍵

參考附檔,希望對您有幫助

2014-01-27_154706/Basic_Serial_Write_and_Read.viee94luke41666.6577893519

[QUOTE=Jelly]

用這範例的話是在Read的時候跳出Error -1073807339的錯誤

但用Basic的範例是可以正常動作的。
[/QUOTE]

Basic範例? 是指一開始你附上的這兩個RS232的VI嗎?

[QUOTE=ee94luke]上述的程式版本太高,無法開啟,我純粹分享自己的心得

我前陣子也有在處理持續與com port通訊的程式

是沒遇到原po說的error

但我的情形是在持續通訊過程中剛開始跑都正常,跑久以後,

讀回的值會有漏讀的情形,甚至有時會當機

後來解決後的心得如下

(1)建立通訊與Close VISA擺在迴圈外,既然是持續通訊就不需要開開關關

(2)依據每次執行的時間週期放入節拍器在迴圈中,附檔範例為一秒

(3)建立通訊的Timeout不需要如預設值十秒那麼長,接近或等同迴圈週期即可,因迴圈內可能不只有VISA Read/Write的工作,當然也不能設太短(ex.100/200msec)不然程式可能會誤判而導致讀不到硬體回傳值,附檔範例為兩秒

(4)若迴圈內有VISA Write跟VISA Read,兩者中間要放手錶Delay做緩衝,至於delay多久需依通訊硬體而定(自行測試)

(5)可於每次迴圈開始前,檢查通訊狀態,error就Close VISA再重開



基本上com port連線正常的狀況下,3&5都是不會用到的,1&2&4則是我覺得能維持持續通訊時連線品質的重要關鍵

參考附檔,希望對您有幫助2014-01-27_125659/Basic_Serial_Write_and_Read.vi[/QUOTE]


請問您附上的程式,關於第(5)點是不是寫倒反了? 
有error的時候才關閉重開,那應該是放在true case裡面?

[QUOTE=SKYBOW]

請問您附上的程式,關於第(5)點是不是寫倒反了??
有error的時候才關閉重開,那應該是放在true case裡面?
[/QUOTE]



的確是放反的,我更新了,謝謝您的指正

[QUOTE=SKYBOW]

[QUOTE=Jelly]

用這範例的話是在Read的時候跳出Error -1073807339的錯誤

但用Basic的範例是可以正常動作的。
[/QUOTE]

Basic範例? 是指一開始你附上的這兩個RS232的VI嗎?
[/QUOTE]

不好意思沒說清楚,我指的是使用範例中的"Advanced Serial Write and Read.vi"會跳錯誤,

但使用範例"Basic Serial Write and Read"是沒問題的。

[QUOTE=ee94luke]上述的程式版本太高,無法開啟,我純粹分享自己的心得

我前陣子也有在處理持續與com port通訊的程式

是沒遇到原po說的error

但我的情形是在持續通訊過程中剛開始跑都正常,跑久以後,

讀回的值會有漏讀的情形,甚至有時會當機

後來解決後的心得如下

(1)建立通訊與Close VISA擺在迴圈外,既然是持續通訊就不需要開開關關

(2)依據每次執行的時間週期放入節拍器在迴圈中,附檔範例為一秒

(3)建立通訊的Timeout不需要如預設值十秒那麼長,接近或等同迴圈週期即可,因迴圈內可能不只有VISA Read/Write的工作,當然也不能設太短(ex.100/200msec)不然程式可能會誤判而導致讀不到硬體回傳值,附檔範例為兩秒

(4)若迴圈內有VISA Write跟VISA Read,兩者中間要放手錶Delay做緩衝,至於delay多久需依通訊硬體而定(自行測試)

(5)可於每次迴圈開始前,檢查通訊狀態,error就Close VISA再重開



基本上com port連線正常的狀況下,3&5都是不會用到的,1&2&4則是我覺得能維持持續通訊時連線品質的重要關鍵

參考附檔,希望對您有幫助

2014-01-27_154706/Basic_Serial_Write_and_Read.vi[/QUOTE]


謝謝ee94luke的分享,我會再試試看,謝謝!