07-09-2019 12:23 AM
NI-VISAでASCIIコードを送信したいと思います。
終端文字はCRです。
例えば「39 39 39 CR」と送りたい場合は、VISAの書き込みモジュールの書き込みバッファを定型、標準表示にして、「999\R」と入力すれば良いでしょうか?
解決済! 解決策の投稿を見る。
07-09-2019 12:56 AM
平素よりNI製品をご愛顧頂きありがとうございます。
日本ナショナルインスツルメンツ技術部の上野です。
標準表示ですと\rは表現できませんので、999\Rと入力すると999\\Rのようになってしまいます。
'¥'コードコード表示でしたら、「999\r」と入力することでCR終端として送信できます。
16進表示の場合でしたら、「3939 390D」となります。
07-09-2019 01:17 AM
日本ナショナルインスツルメンツ技術部 上野様
早々に回答頂きありがとうございます。
元々TERATERMで制御していた装置を計測器を絡めることから制御をLABVIEWに取り込もうと考えております。
TERATERMでシリアル通信で、
ボーレート:115.2kbps
データ 8bit
STOPBIT 1bit
パリティ なし
受信改行 LF
送信改行 CR
で設定し、動いていたものを取り込もうとしています。
TERATERMでは装置起動時とENTER(改行コード)を送ると装置からデータが返ってくるのを確認し、
LABVIEWで添付test.viのように組んで改行コードを送りたいと思い、作成しましたが応答が返ってこず、タイムアウトエラーで終了してしまいます。
16進数表示の書き込みバッファで0Dを入れる形で改行コードを送る動作になりますでしょうか?
07-09-2019 02:23 AM - 編集済み 07-09-2019 02:28 AM
はい、¥コード表示で\rとなりますので、これで改行を送信しています。
タイムアウトが発生するのは、どの部分でしょうか?
VISA読み取り関数が2つ使われており、バイトカウントとして100という値が設定されていますが、100文字のデータを受信するという設定で間違いはございませんか?
Enterキーを押すというのは、CR+LFであったということはありませんか?その場合は、16進表示で「0D0A 」を送信することになると思います。
07-09-2019 03:09 AM
回答ありがとうございます。
>タイムアウトが発生するのは、どの部分でしょうか?
ステップ実行を行った際、最初の読み取りでタイムアウトしていました。
最初の読み取りは装置起動時に吐き出されるデータを表示しようと入れていましたが、あまり意味をなさないので、
取り除いて実行したところエラーは解消されましたが、何も表示されませんでした。
>VISA読み取り関数が2つ使われており、バイトカウントとして100という値が設定されていますが、100文字のデータを受信するという設定で間違いはございませんか?
計測器制御のトレーニングを受けた際、ここは特に受信されるデータ量きっちりでなくて良いとのことだったので、
1000なども試してみましたがデータは表示されませんでした。
>Enterキーを押すというのは、CR+LFであったということはありませんか?その場合は、16進表示で「0D0A 」を送信することになると思います。
装置側の認識する改行コードはCRとされているので0Dとしていました。
0D0Aも試してみましたが変化はありませんでした。
07-09-2019 03:26 AM
VISA読み取り関数を1つにした場合は、エラーなく実行が終了するのでしたら添付のVIを試していただけないでしょうか?
読み取りバッファ表示器は、’¥’コード表示にして標準表示では表示されない文字がないかを確認できると思います。
07-09-2019 07:42 PM
ファイルありがとうございました。
実行してみましたが何も起きず終了しました。
Byte数も取れませんでした。
最後のシンプルエラー処理のエラー出力の配線が切れているのは問題ないでしょうか?
VISAモジュールでWriteの後Readを置くとWriteが実行された後すぐReadに移るのでしょうか?
TERATERMの動きと違うところを追っていく必要がありそうです。
07-09-2019 08:11 PM - 編集済み 07-09-2019 09:06 PM
シリアルの送信はPXIで行っているので、
Dsub9ピンの送信ピンをオシロスコープで観測してみました。
LABVIEWで0Dを送信する波形とTERATERMでENTERを押す波形は同じでしたので、
READ側で問題がありそうです。
TERATERMの動作は詳しく分からないのですが、
http://ttssh2.osdn.jp/manual/ja/reference/sourcecode.html
こちらを見ると受信でポーリングしているようです。
LABVIEWで何かシリアルで受信データが入ってきたら受信を開始するなどポーリングするようなイベント処理はできるのでしょうか?
07-09-2019 10:03 PM
ご確認ありがとうございます。
まずいくつかご質問がございますので、先に回答致します。
Q1. 最後のシンプルエラー処理のエラー出力の配線が切れているのは問題ないでしょうか?
A1. 配線したつもりでしたが、切れているようでしたらお手数ですが配線してください。
Q2. VISAモジュールでWriteの後Readを置くとWriteが実行された後すぐReadに移るのでしょうか?
A2. はい、現在のコードでは待機関数を間に挟んでおりませんので、即時読み取りになります。速すぎるか、応答がなく読み取れるバイト数を返すプロパティノードの値が0の場合は、0バイトの読み取り、すなわち読み取らずに終了となっているのではないかと思います。
Q3. LABVIEWで何かシリアルで受信データが入ってきたら受信を開始するなどポーリングするようなイベント処理はできるのでしょうか?
Q3. 読み取りをWhileループで連続的におこなうようにすれば、ポーリングとなります。
今まで頂いた情報を踏まえて添付ファイルを作成致しましたので、動作確認いただけると助かります。
バージョン2からの変更点は以下のとおりです。
07-10-2019 07:45 PM
ありがとうございます。
受信することができました。
受信しているときは読み取りバイト数が変化しているので、連続的に受信しないとダメだったのかもしれません。
READモジュールが読み取り終了する条件は何でしょうか?
またダブルクォーテーションをループごとに挟むのはなぜでしょうか?
書き込み後の待機関数を除いても正常に受信できていました。
次の発展として、CRの送信、受信の後、別の送信データ1とCRを入れてみました。
TERATERMではそれぞれの送信で異なるデータが受信されるのに対し、LABVIEWでは同じ文字列が返ってきました。
要因特定の為、またオシロスコープで送信波形を比較してみようと思います。