發送命令Visa Write:發送命令時,其按初始化打開串口的格式操作,如波特率,奇偶檢驗,結束符等。返回變量 return count 大小僅指 write buffer 的長度,write buffer 是"#01",那麼return count 返回3。
讀取緩衝區Visa Read:首先應該輸入想要讀取多少字節 byte count,return count爲實際讀取到的字節數量。讀取之後串口緩衝區字節數將相應減少return count。比如緩衝區現在存有22個字節,
如果輸入 byte count 等於22,那麼將讀出所有22字節,同時 return count返回22;
如果輸入 byte count 等於20,那麼將讀出緩衝區前面20字節,return count返回20,此時緩衝區內還有2字節,這時如緊接着Visa Read調用串口屬性 Number of Bytes at Serial Port,其值爲2,在其它情況下,其值爲0。但是如果在 Visa Read後先調用VISA高級節點Visa Flush IO Buffer,清空緩衝區,再調用屬性 Number of Bytes at Serial Port,其值也將返回0;
如果輸入 byte count 大於22,那麼將讀出所有22字節,同時 return count返回22。
串口寫入讀取操作的以上特點,決定了在實際編寫串口程序時應考慮的一些問題:
通常情況下,一個串行通信程序由數據採集與信號控制組成。數據採集需要循環採集,而信號控制只在有需要時發出控制命令。控制命令發出後,一般需要判斷設備是否響應了命令,這就需要讀取輸入緩衝區。但在發送控制命令時,數據採集命令可能也正在發送,因爲數據採集是不斷循環採集的,因此此時輸入緩衝區可能是採集到的數據,也有可能是控制命令的響應報文,採集的數據與控制命令響應報文在字節大小與報文格式上一般不同。比如採集的數據爲: >+0022.3 ,控制命令響應報文爲 !01 ,那麼此時
如果程序先讀取數據,那麼讀取byte count等於8,之後緩衝區大小爲0,而此時再讀取響應就爲空,程序會認爲設備未能正確響應控制,將放棄此次操作,重新發送控制命令;
如果程序先讀取響應,那麼讀取 byte count等於3,如果此時對應的緩衝區爲 >+0022.3,那讀取到的格式與響應報文不一致,程序應判斷爲設備未正常響應控制命令,應放棄此次操作。讀取響應之後緩衝區變爲022.3,此時讀取採集數據,將只讀到5個字節,且與數據格式不一致,程序應放棄數據,重新發送數據採集命令。
這就會造成在發送控制命令時,採集與控制混亂。可能造成報文丟失,且程序需多次發送命令,運行效率降低。
解決辦法:設置一採集中斷位,在發送信號控制命令前,採集中斷位置位,然後再發送控制命令,待控制命令正常響應後,採集中斷位復位。
示例程序:
數據採集:
信號控制: