NI製品ディスカッション

キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

NI-VISAでASCIIコードを送信する方法

解決済み
解決策を見る

NI-VISAでASCIIコードを送信したいと思います。

終端文字はCRです。

例えば「39 39 39 CR」と送りたい場合は、VISAの書き込みモジュールの書き込みバッファを定型、標準表示にして、「999\R」と入力すれば良いでしょうか?

0 件の賞賛
メッセージ1/20
3,434件の閲覧回数
解決策
トピック作成者y-okadaが受理

平素よりNI製品をご愛顧頂きありがとうございます。
日本ナショナルインスツルメンツ技術部の上野です。

 

標準表示ですと\rは表現できませんので、999\Rと入力すると999\\Rのようになってしまいます。

'¥'コードコード表示でしたら、「999\r」と入力することでCR終端として送信できます。

 

16進表示の場合でしたら、「3939 390D」となります。

 

 

0 件の賞賛
メッセージ2/20
3,421件の閲覧回数

日本ナショナルインスツルメンツ技術部 上野様

 

早々に回答頂きありがとうございます。

 

元々TERATERMで制御していた装置を計測器を絡めることから制御をLABVIEWに取り込もうと考えております。

 

TERATERMでシリアル通信で、

ボーレート:115.2kbps

データ 8bit

STOPBIT 1bit

パリティ なし

受信改行 LF

送信改行 CR

で設定し、動いていたものを取り込もうとしています。

 

TERATERMでは装置起動時とENTER(改行コード)を送ると装置からデータが返ってくるのを確認し、

LABVIEWで添付test.viのように組んで改行コードを送りたいと思い、作成しましたが応答が返ってこず、タイムアウトエラーで終了してしまいます。

 

16進数表示の書き込みバッファで0Dを入れる形で改行コードを送る動作になりますでしょうか?

0 件の賞賛
メッセージ3/20
3,414件の閲覧回数

はい、¥コード表示で\rとなりますので、これで改行を送信しています。

 

タイムアウトが発生するのは、どの部分でしょうか?

 

VISA読み取り関数が2つ使われており、バイトカウントとして100という値が設定されていますが、100文字のデータを受信するという設定で間違いはございませんか?

 

Enterキーを押すというのは、CR+LFであったということはありませんか?その場合は、16進表示で「0D0A 」を送信することになると思います。

 

0 件の賞賛
メッセージ4/20
3,403件の閲覧回数

回答ありがとうございます。

 

>タイムアウトが発生するのは、どの部分でしょうか?

 

ステップ実行を行った際、最初の読み取りでタイムアウトしていました。

最初の読み取りは装置起動時に吐き出されるデータを表示しようと入れていましたが、あまり意味をなさないので、

取り除いて実行したところエラーは解消されましたが、何も表示されませんでした。

 

>VISA読み取り関数が2つ使われており、バイトカウントとして100という値が設定されていますが、100文字のデータを受信するという設定で間違いはございませんか?

 

計測器制御のトレーニングを受けた際、ここは特に受信されるデータ量きっちりでなくて良いとのことだったので、

1000なども試してみましたがデータは表示されませんでした。

 

>Enterキーを押すというのは、CR+LFであったということはありませんか?その場合は、16進表示で「0D0A 」を送信することになると思います。

 

装置側の認識する改行コードはCRとされているので0Dとしていました。

0D0Aも試してみましたが変化はありませんでした。

0 件の賞賛
メッセージ5/20
3,396件の閲覧回数

VISA読み取り関数を1つにした場合は、エラーなく実行が終了するのでしたら添付のVIを試していただけないでしょうか?

 

読み取りバッファ表示器は、’¥’コード表示にして標準表示では表示されない文字がないかを確認できると思います。

0 件の賞賛
メッセージ6/20
3,393件の閲覧回数

ファイルありがとうございました。

 

実行してみましたが何も起きず終了しました。

Byte数も取れませんでした。

 

最後のシンプルエラー処理のエラー出力の配線が切れているのは問題ないでしょうか?

 

VISAモジュールでWriteの後Readを置くとWriteが実行された後すぐReadに移るのでしょうか?

 

TERATERMの動きと違うところを追っていく必要がありそうです。

0 件の賞賛
メッセージ7/20
3,382件の閲覧回数

シリアルの送信はPXIで行っているので、

Dsub9ピンの送信ピンをオシロスコープで観測してみました。

 

LABVIEWで0Dを送信する波形とTERATERMでENTERを押す波形は同じでしたので、

READ側で問題がありそうです。

 

TERATERMの動作は詳しく分からないのですが、

http://ttssh2.osdn.jp/manual/ja/reference/sourcecode.html

こちらを見ると受信でポーリングしているようです。

 

LABVIEWで何かシリアルで受信データが入ってきたら受信を開始するなどポーリングするようなイベント処理はできるのでしょうか?

0 件の賞賛
メッセージ8/20
3,378件の閲覧回数

ご確認ありがとうございます。

 

まずいくつかご質問がございますので、先に回答致します。

 

Q1. 最後のシンプルエラー処理のエラー出力の配線が切れているのは問題ないでしょうか?

A1. 配線したつもりでしたが、切れているようでしたらお手数ですが配線してください。

 

Q2. VISAモジュールでWriteの後Readを置くとWriteが実行された後すぐReadに移るのでしょうか?

A2. はい、現在のコードでは待機関数を間に挟んでおりませんので、即時読み取りになります。速すぎるか、応答がなく読み取れるバイト数を返すプロパティノードの値が0の場合は、0バイトの読み取り、すなわち読み取らずに終了となっているのではないかと思います。

 

Q3. LABVIEWで何かシリアルで受信データが入ってきたら受信を開始するなどポーリングするようなイベント処理はできるのでしょうか?

Q3. 読み取りをWhileループで連続的におこなうようにすれば、ポーリングとなります。

 

今まで頂いた情報を踏まえて添付ファイルを作成致しましたので、動作確認いただけると助かります。

バージョン2からの変更点は以下のとおりです。

 

  • VISAクリアVIを先頭に追加
    前回の実行でバッファに残っているデータをクリアします。
  • Null文字を無視するプロパティノードを追加
    以前Tera TermでNull文字が無視されている事例があったため、同様の処理を追加してみました。

  • VISA書き込み関数の後に待機関数を追加
    読み取りが速すぎることを懸念されておりましたので、待機時間を設定できるようにしました。

  • ポーリング化
    連続で読み取りをおこなうようにWhileループを追加しました。

 

0 件の賞賛
メッセージ9/20
3,365件の閲覧回数

ありがとうございます。

受信することができました。

 

受信しているときは読み取りバイト数が変化しているので、連続的に受信しないとダメだったのかもしれません。

READモジュールが読み取り終了する条件は何でしょうか?

 

またダブルクォーテーションをループごとに挟むのはなぜでしょうか?

 

書き込み後の待機関数を除いても正常に受信できていました。

 

次の発展として、CRの送信、受信の後、別の送信データ1とCRを入れてみました。

TERATERMではそれぞれの送信で異なるデータが受信されるのに対し、LABVIEWでは同じ文字列が返ってきました。

 

要因特定の為、またオシロスコープで送信波形を比較してみようと思います。

0 件の賞賛
メッセージ10/20
3,354件の閲覧回数