• 締切済み

Visual Basic 2005でRS-232Cを用いて機器を制御する際のエラーについて

現在,ディジタルマルチメータをPCで制御するため,PCとディジタルマルチメータをRS-232Cケーブルで接続し,Visual Basic 2005を用いて制御しようとプログラムを作成しています. 以前は,Visual Basic 6.0で制御していたのですが,今後の為を考え,2005へ移行することにしました. そこで,VB6のプログラムと同様の設定を用いて,同じ命令をマルチメータ側に送信しようとするのですが,マルチメータ側で命令を受信した後に,マルチメータがエラーを出してしまいます. 全ての命令に対してエラーを出すのではなく,マルチメータ側から返信を伴う命令に対してのみエラーが出るようです. 環境は,PC:Windows XP (Home),マルチメータ:Agilent 34401Aです. 以下がソースの一部です. [VB6] With SerialPort .CommPort = 4 .Settings = "9600,n,8,1" .Handshaking = comNone .RThreshold = 1 .SThreshold = 1 .InputLen = 0 .PortOpen = True End With SerialPort.Output = ":SYST:REM" & vbCrLf 'マルチメータをリモートにする SerialPort.Output = "MEAS:VOLT:DC? 10V,0.003V" & vbCrLf '直流電圧を測定 [VB2005] With SerialPort .PortName = "COM4" .BaudRate = 9600 .DataBits = 8 .Parity = IO.Ports.Parity.None .Handshake = IO.Ports.Handshake.None .Open() End With SerialPort.WriteLine("SYST:REM" & vbCrLf) 'マルチメータをリモートにする(エラーは出ない) SerialPort.WriteLine("MEAS:VOLT:DC? 10V, 0.003V" & vbCrLf) '直流電圧を測定(エラーが出る) 原因などが分かれば,教えてください. よろしくお願いします.

みんなの回答

回答No.3

#2の方が書いているように、 WriteLine()は、自動的にデリミタをつけます。 デリミタはSerialPort.NewLineで指定し、デフォルトはvbLfだったと思います。(今.NETの環境が無いので自信無し) 送信時にvbCrLfを付加するなら、Write()を使うと良いです。

R_Nakao
質問者

補足

Write()を使って命令を送信するには, SerialPort.Write("MEAS:VOLT:DC? 10V,0.003V" & vbCrLf) でよろしいのでしょうか?また,NewLineでの指定は SerialPort.NewLine = vbCrLf でよろしいですか? この設定で間違いが無いのであれば,これでもエラーが出るため,別の原因ではないかと思うのですが…

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

WriteLineでやってるなら vbCrLfを付加しなくてもいいのではないでしょうか 余分に CRLFが出力されているため マルチメータがエラーになってるとか …

R_Nakao
質問者

補足

もし,CrLfを余分に出力しているためエラーが出るのだとすると,最初のマルチメータをリモートにする時にエラーが出ないのはなぜでしょうか? リモートにする命令,電圧測定をさせる命令からそれぞれvbCrLfを削除して試してみましたが,やはり同じタイミングでエラーが出るようです.

回答No.1

.StopBits = StopBits.One 多分、これが足りないのでは?

R_Nakao
質問者

補足

すみません.うっかり書き損じたようです. ですが,他のVB2005の同じようなプログラムではストップビットの設定も行っていますが,こちらの方もエラーが出るようです. 他に原因は考えられないのでしょうか…?

関連するQ&A

  • シリアル通信(タブレット、シーケンサー)

    現在、WindowsXP + VB6 + MSComm <ー> FXn2-16MR(RS232Cユニット)を シリアル通信で制御しています。これをWindows8.1(タブレット) + VB2013で全面的に 書き換えを行っています。テスト用のパソコンとは何の問題間無く通信は通りますが、 対シーケンサーだと送信はしているようだが、受信が全くできない状態です。 制御パラメータは、SerialPort1.Handshake=None, DtrEnable=True, RtsEnable=True 送信時のプロトコルは、<ENQ> + データ(ASCコード) 受信時のプロトコルは、<STX> + データ(ASCコード)+ <ETX> VB6は、この設定で動作しています。 VB2013では、制御パラメータは同じし送受信では普通に SerialPort1.Write、SerialPort1.ReadLineを使っています。 宜しくお願いします。

  • Ni-VISAによるRS232C制御プログラム

    Ni-VISA+VB.NETでRS232C付きの計測器の制御プログラムを作成したいと考えています。 現在まで、USBTMCとGPIB接続での制御プログラム作成経験がありますが、RS232C接続での制御プログラム作成は初めてです。 Ni-MAXで動作確認できていますので計測器とPCはRS232Cで正常に接続できています。 しかしながら、下記プログラムコードでうまく動作しません。 プログラムの修正点などアドバイス頂けないでしょうか? Public Function DcOutput_P4305(DcValue As Double) ' リソースの宣言 Dim RM As New Ivi.Visa.Interop.ResourceManager ' VISA COM リソースマネージャ Dim VCG As New Ivi.Visa.Interop.FormattedIO488 ' VISA COM フォーマッテッドIO ' 通信の開始 VCG.IO = RM.Open("ASRL1::INSTR") ' 処理待機時間を設定 System.Threading.Thread.Sleep(500) ' DC出力値設定(例:VOLT 10 ・・・10V出力) VCG.WriteString("VOLT" & " " & DcValue.ToString() & vbLf) ' 処理待機時間を設定 System.Threading.Thread.Sleep(500) ' 通信の終了処理 VCG.IO.Close() System.Runtime.InteropServices.Marshal.ReleaseComObject(VCG) System.Runtime.InteropServices.Marshal.ReleaseComObject(RM) '処理待機時間を設定 System.Threading.Thread.Sleep(500) Return 0 End Function

  • C#とマイコンでSCI通信

    マイコンとC#で仮想COMポートを使ってSCI通信しているんですが、 ・「マイコン⇒C#」でデータを受信するときは、  正常に受信でき、 「C#⇒マイコン」がデータを受信するときは    正常に受信できません。 ・C#から何を送っても0x0aの値しかマイコンが受け取りません。 (TeraTermからは正常な値を受け取っています) 以上の点から、C#の送信プログラムの中身が悪いと思うのですが、 C#は初めて手をつけたのでよくわかりません。 送信にはWriteLine()関数を使っています serialPort1.WriteLine("a"); このような感じで一文字一文字送り、マイコンでLCDに表示させ結果を見ています。 シリアルポートの設定は次のように行っています try { beginTime = DateTime.Now; //←プログラムの関係上いれてるだけです this.serialPort1.PortName = this.textBox2.Text; this.serialPort1.BaudRate = 9600; this.serialPort1.Parity = System.IO.Ports.Parity.None; this.serialPort1.DataBits = 8; this.serialPort1.StopBits = System.IO.Ports.StopBits.One; serialPort1.Open(); serialPort1.DtrEnable = true; serialPort1.RtsEnable = true; } catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } COMポートに関してはFormに別途ボタンを作りそこから選択するようにしています。 どこが悪いのか概要だけでも教えてほしいください;; よろしくおねがいしますm(__)m

  • VB2008でのシリアル通信

    VB2008のシリアル通信を使用して、ボタンを押した時にある機器に文字列(ここでは例として\"XXXX\")を送信しようとしているのですが、下記コードでは動作できません。 何がいけないのでしょうか? ボタンクリックのコードは省略 Using com1 As IO.Ports.SerialPort = _ My.Computer.Ports.OpenSerialPort("COM1") com1.WriteLine("XXXX" & vbCrLf) End Using アドバイスや参考URLなどありましたら教えてください。

  • 電圧変動による制御エラーについて

    動力電圧がクランプメーターで205Vを超えると 制御機器がエラーを起こすらしいです。 20年ものマシニングセンターの外部制御/パレチェンです。 主因は経年劣化と思われます。 未だ、半信半疑ですが、 ほっとくわけにも行かず、 安価に電圧を下げる方法はどんなものがありますでしょうか? どれだけ下げればいいのかも確定的なことはいえない状況ですので、 トランスを採用しにくいことになってしまっています。 また、状況的に押さえているだけで、 ユニット/部品では不具合箇所/原因を特定できていません。 何か知見がありましたら、教えてください。

  • 'Button1を押したらポートオープン

    'Button1を押したらポートオープン Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 'シリアルポートを設定。 SerialPort1.PortName = SerialPortComboBox.Text SerialPort1.BaudRate = SerialBpsComboBox.Text Select Case SerialParityComboBox.Text Form3.SerialPort1.Parity = IO.Ports.Parity.None 'データ長 SerialPort1.DataBits = SerialDataBitsComboBox.Text 'RTSラインを有効にする SerialPort1.RtsEnable = True '送信タイムアウト SerialPort1.WriteTimeout = 3000 Try 'ポートをオープン SerialPort1.Open() 'いざ送信 'SerialPort1.Write(Chr(&HC)) 'ケーブルが外れた場合などのタイムアウトエラーなら、 Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Critical, "シリアル通信エラー") SerialPort1.Close() Exit Sub End Try '送信バッファが空になるまで待って、 While SerialPort1.BytesToWrite > 0 My.Application.DoEvents() End While ''''''''''''文字送信 'シリアルポート送信データをSJISに指定 SerialPort1.Encoding = System.Text.Encoding.GetEncoding(932) Dim Settei As String '送信文字代入 Settei = "A.1=" & vbCrLf 'いざ送信 SerialPort1.Write(Settei) '送信バッファが空になるまで待って、 While SerialPort1.BytesToWrite > 0 My.Application.DoEvents() End While End Sub '文字受信 Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived Dim strDataReceived As String Dim add As New AddDataDelegate(AddressOf AddData) Try strDataReceived = SerialPort1.ReadLine Catch ex As Exception strDataReceived = ex.Message End Try TextBox1.Invoke(add, strDataReceived) End Sub ///////// 文字を送信した後に相手から帰ってきます。 送信した後の受信の部分ですが、これで正しいか教えて頂きたいです。

  • RS-232C経由マルチメータを使用して自動計測でバッファがオーバフローします

    現在RS232C経由でデジタルマルチメータ(KEITHLEY 2000 MULTIMETER)の自動計測をしようとしています(C#.NET)。 timerで高速制御(10msぐらいで電圧値がほしい)しようとすると、KEITHLEYのバッファがオーバーフローして困っています。timerをゆっくり(200msぐらい)にするとちゃんとデータを送ってきてくれます。 そこで、最速の時間分解能で計測するために、PCから、マルチメータのバッファの中身が0だったら、次の電圧値要求を送るというようにしたいのですが、「バッファの中身が0だったら」という命令が分かりません。 どのようにしたらよいでしょうか。また他のいいやり方はあるのでしょうか。

  • VB.NET(2005)の"SerialPort" RTSラインを制御

    VB.NET(2005)の"SerialPort" RTSラインを制御したいです。 やりたい事は、「パソコンから通信相手の機器へデータを送信している間だけ、RTSをHIGHにする」ということです。データ送信完了と共に、RTS信号をLOWにしなくてはなりません。 SerialPortにあるRtsEnableをTrueにして、オシロで確認してみたのですが、RTS信号はHIGHに張り付いてしまっていて、全く動いていませんでした。 同じくDtrEnableをTrueにしても、同じでした。 Handshakeプロパティを"RequestToSend"に設定してみたのですが、これもまた同じ結果でした。 どなたかご存知の方がおられましたら、解決策をご教授いただければ幸いです。

  • 【Win7・64・C#】マイコンUSB通信エラー

    インターフェース2012年6月号付属FM3マイコン基板を使いPCとのUSB通信を試みております。 インターフェース6,7月号との基盤特集ページ(http://www.kumikomi.net/interface/contents/fm3.php)を参考に、マイコンにUSB通信プログラム(仮想シリアルデバイス、PCから送信された文字をエコーバックするプログラム)を書き込み、特集ページの64ビットデバイスドライバをPC(win7、64bit)にインストール、Tera Termで接続しました。ここでTera Termではエラー無く接続でき送信した文字列はエコーバックされて画面上に表示されました。 次にTera TermではなくPC側のプログラムを自作したいと考え、色々なHPを参考に下記の様なコードをVisual C# 2010 Expressで書きました。(また構成マネージャを編集し64ビットに対応(したつもりです)しました) これで実行すると、「システムに接続されたデバイスが機能していません」というエラーが出てしまい、どうにも先に進めなくなってしまいました。 原因をご存知のかたや解決のアイデアのあるかたアドバイスをいただければ幸いです。 どうぞよろしくお願いいたします。 //////////////////////////////////////////////////////////////// using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO.Ports; namespace SerialTest01 { class Program { static SerialPort port = new SerialPort(); static void Main(string[] args) { //if (IntPtr.Size == 4) //{ // Console.WriteLine("32ビット"); //} //else if (IntPtr.Size == 8) //{ // Console.WriteLine("64ビット"); //} SerialInitialization(); Console.ReadLine(); port.Close(); port.Dispose(); } static void SerialInitialization() { try { string[] ports = System.IO.Ports.SerialPort.GetPortNames(); Console.Write(ports[0] + "に接続します。\n\n"); port.PortName = ports[0]; port.BaudRate = 9600; port.DataBits = 8; port.StopBits = StopBits.One; port.Parity = Parity.None; port.Handshake = Handshake.None; port.ReadTimeout = 30000; port.WriteTimeout = 30000; port.DtrEnable = true; port.RtsEnable = true; if (port.IsOpen) Console.Write("ERROR: " + ports[0] + "は既に開いています。"); else port.Open(); } catch (Exception ex) { Console.Write("ERROR:\n" + ex); } } } } ////////////////////////////////////////////////////////////////

  • RS232Cで機器制御

    C言語で、RS232Cインターフェイスを使って機器を制御したいのですが、こういった経験がないものなので、どういう準備したらいいか、どういう関数を使ったらいいのかといった基本手順を教えてもらえないでしょうか。 勉強するのにいい本なども知りたいです。 数学系の出身なので、C自体は数値計算で使い慣れています。 環境はWindowsXPか2000があります。 よろしくお願いいたします。