• 締切済み

VB2005でシリアル通信

QNo.2434041で質問した者です。 ご回答いただきました内容に従って通信を試みましたが、うまく行きません。 PCとある制御ボードを接続し、 「接続」すなわち、call SerialPort1.Open()を行なうとボード上のLEDが点灯し、 「切断」すなわち、call SerialPort1.Close()を行なうとボード上のLEDが消灯するので、 一応接続はできているようなのです。 (SerialPortコントロールを追加して、プロパティのDtrEnableとRtsEnableをTrueにしています。) しかし、SerialPort1.WriteLine(TextBox2.Text) を実行してもボードが思った動きをしてくれません。 どうも信号が出ていないような気がしています。 どうしてなのでしょうか? MSCommコントロールを使用しなければならないのでしょうか?

みんなの回答

  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.3

No2です。 > ボードやPCのデフォルト値だからです。 では、「デフォルト値」のままで変更されていないことは「確認」済みってことですね。 > ボードに付属のソフトでは通信できることを確認しています。 「これで繋がったんだから、あっている『はず』だ」って言う、「推測」じゃないんですね? #それで満足しているなら、「設定は、あっている『はず』だから、動くはず」で回答が終わってしまいます・・・ 念の為に、「別の設定」にして試してみたりはやられましたか? > >制御ボードがデリミタと検出する記号をきちんと出力していますか?。 > これはわかりません。 こちらは、その後、確認済みですか? 例えば、マニュアルには「どういうコマンド文字列を送れ」と書かれていましたか? で、貴方はどういう文字列を送ったんですか? #別のサイトのQ&A掲示板の話ですが、 #マニュアルに「TIME+CRLF」と記述されていたのを見て、 #"TIME+CRLF"と言う文字列を送る、と勘違いした言う話がでてましたが・・・

全文を見る
すると、全ての回答が全文表示されます。
  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.2

こんにちは。 > 9600baud、1stop bitです。 って事ですが、 No1さんの、 > >通信速度やストップビットなどの設定は合っていますか? は、「その設定が制御ボードが要求している設定か」を尋ねておられるんだと思いますよ。 設定を > 9600baud、1stop bitです。 にした根拠は何です? ちなみに、私は昔、シリアル接続のラベルプリンタをVB6で制御する プログラムを作った事がありますが、 その時は、プリンタが、全然応答してくれなくて3日ほど悩んだことがあります。 結局、原因はラベルプリンタのディップスイッチの設定が間違っていて、必要なボーレートが標準値(サンプルプログラムの値)と違っていた所為でした。

murano47
質問者

お礼

> 9600baud、1stop bitです。 にした根拠は何です? ボードやPCのデフォルト値だからです。 ボードに付属のソフトでは通信できることを確認しています。

全文を見る
すると、全ての回答が全文表示されます。
  • miyuyu
  • ベストアンサー率61% (30/49)
回答No.1

普通に使用できます。 まず最初に触れていないのですが通信速度やストップビットなどの設定は合っていますか? 制御ボードがデリミタと検出する記号をきちんと出力していますか?。 ケーブルは間違っていませんか?クロス、ストレートとはいってもその内訳は色々あります。 ハイパーターミナルでやってみても同じですか?

murano47
質問者

お礼

ご回答ありがとうございます。 >通信速度やストップビットなどの設定は合っていますか? 9600baud、1stop bitです。 >制御ボードがデリミタと検出する記号をきちんと出力していますか?。 これはわかりません。 >ケーブルは間違っていませんか?クロス、ストレートとはいってもその内訳は色々あります。 >ハイパーターミナルでやってみても同じですか? ボードに附属していたソフトをPCにインストールしてちゃんと動きますから、 ケーブルの結線は間違っていないと思います。

全文を見る
すると、全ての回答が全文表示されます。

関連する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を使っています。 宜しくお願いします。

  • 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

  • teratermではシリアル通信出来るのですが・・

    現在アームロボットをPCからシリアルで送って制御するプログラムを作りたいと思っております。 現在Teratermからコマンドを送ってアームロボットが動く事は確認出来ております。 ただ、そこからC#にてプログラムを作成して動かそうとするとどうしてもコマンドを受け付けてくれません。 Teratermの設定は  ボーレート9600bps  データ長8bit  パリティnone  ストップビット 1bit  フロー制御 non です。 これで接続して「NT」と打ってリターンを押すと ロボットが原点復帰動作をします。 一方C#では  SerialPort port = new System.IO.Ports.SerialPort("COM2",9600,Parity.None,8,StopBits.One);  port.Open();  port.Write("NT");  port.Close();  port.Dispose(); と記述して実行しますが動きません。 改行コードが怪しいと思い、teratermで改行コードを CRからCR+LFに変更してみましたが問題なく動きます。 teraterm以外にもシリアル通信チェッカーv4.1.0 を試しましたが動きませんでした。 teratermは何か特別な仕様なのでしょうか? 何か見落としている設定項目ありますでしょうか? どうぞアドバイスよろしくお願い致します。

  • VB2010 シリアル受信した情報を表示する

    VB2010 シリアル受信した情報を表示する フォームが表示されたらポートを開けてテキストボックスに文字を表示させたいです。 送られてくる情報はSTXとETXで挟まれた数十文字のアスキー文字です。 フォーム表示中は、teratermやハイパーターミナルで接続不可エラーが出ますし その逆でteratermやハイパーターミナルで接続している時にはcomポートエラーが出ます。 teratermやハイパーターミナルではシリアルで受信した文字が表示されています。 そのような状況で下記、シンプルなコードを作りましたが表示されません。 テキストボックスが何も変化しない状態です。なんでもいいので、テキストボックスに受信した情報を出してみたいです。 http://msdn.microsoft.com/ja-jp/library/cc720852.aspx を参考に受信部分に使っています。 Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Call SerialPort1.Open() End Sub Delegate Sub AddDataDelegate(ByVal str As String) Private Sub AddData(ByVal str As String) TextBox1.Text = TextBox1.Text + str 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 End Class

  • (VC++)シリアル通信について

    OS:Windows7 開発環境:VisualStudio2010 言語:C++ 機器:カードリーダ 接続:RS-232C VisualStudio2010にて、シリアル通信を行うプログラムを作成しています。 VisualStudioのヘルプや、いくつかのWebページを参考に、送信を行うところまではできています。 しかし、受信ができているのか、もしくは受信した内容が表示できていないのか分かりませんが、受信が確認できません。 送信はカードリーダが動くので分かりやすいのですが、受信は表示できないと確認できないためこのような状態です。 カードリーダの仕様は、あるASCIIコードを送るとカードが送られ、エラーステイタスコードが返ってきます。正常にカードが送られた場合は、またASCIIコードを送ると、読み取ったカードの情報がでてきます。(シリアル通信をテストするプログラムでは送信受信共に成功しています。) (送信)は、こちらが送ったもので、それ以外は受信した結果です。 ---------------以下その時の結果--------------- 3f 0d (送信) 30 10 45 30 31 32 30 30 38 0d (送信) 32 0d 33 59 0d 30 0d 31 59 0d 32 59 0d 33 0d 30 0d 31 0d ---------------------------------------------- C++のプログラムは以下の様になっています。 上記の結果でいうと、3f、0dを送り30を受け取るというところです。3f、0dでカードが送られ、30(正常終了)という結果を受け取ります。この結果をテキストボックスに表示したいと考えています。現在は、カードは送られるものの、30(もしくは他のエラーステイタスコード)という結果を表示することができません。 private: System::Void button_start_Click(System::Object^ sender, System::EventArgs^ e) {  serialPort1->Open();  serialPort1->Write(x3f); //defineにて定義(中身は?[0x3f])  serialPort1->Write(x0d); //defineにて定義(中身はCR[0x0d])  serialPort1->Close(); } delegate void SerialDataRecievedDelegate(String^ recvData); private: void SerialDataRecieved(String^ recvData) {  textBox1->Text = recvData; //確認するためにtextBox1に結果を表示 } private: System::Void serialPort1_DataReceived(System::Object^ sender, System::IO::Ports::SerialDataReceivedEventArgs^ e) {  SerialDataRecievedDelegate^ dlgte = gcnew SerialDataRecievedDelegate( this, &CardReader::Form1::SerialDataRecieved );  String^ RecievedData = serialPort1->ReadExisting();  //1バイトずつ受信  if(serialPort1->IsOpen == true) //シリアルポートが開いているか確認  {   COMRevieveBuffer = COMRevieveBuffer + RecievedData; //受信バッファに追加   if(RecievedData == "\r" ) //改行コード検出   {    RecievedData = RecievedData + "\n";    COMRevieveBuffer = COMRevieveBuffer + RecievedData;    //受信した一行をテキストボックスに転送    this->Invoke(dlgte, COMRevieveBuffer);    COMRevieveBuffer = "";   }   //エコーを返す   serialPort1->Write(RecievedData);  } } C言語でのプログラム作成はしていたのですが、VisualStudioやC++でのプログラム作成は初めてです。 ソースに変な点が多々あるとは思います。 ご教授お願いします。

  • MELSEC-QシーケンサをVBAで通信したい!

    三菱のシーケンサMELSEC-Qシリーズのシーケンサ「QJ71C24N」にエクセルVBAで 通信したいと考えています。なかなかうまくいかず、困り果てています・・・。 下記、進めてきた経緯と組んだプログラムを書きます。 どこがおかしいか、どなたか教えてください・・・ ■ゴール シーケンサ内部のM300という変数に格納されている値を、VBAで作成した テキストボックスに表示させたい。 1.使用するエクセルのバージョンは2003です。 MSCOMMが入ってなかったため、「vb6sp6rt4.exe」というランタイムを用いて MSCOMMはインストールできました。 2.以下プログラム Dim R As String Private Sub CommandButton1_Click() Sheets("Sheet1").Select MSComm1.DTREnable = True MSComm1.RTSEnable = True MSComm1.inputLen = 0 'Input プロパティ使用時に、バッファ全体を読み取る。 MSComm1.commport = 1 'これは必要かと考え、テキストにはないが追加。 MSComm1.Settings = "9600,N,8,1" MSComm1.portopen = True MSComm1.inbuffercount = 0 ' 0文字受信するまで待機 MSComm1.output = Chr$(H5) + "F90000FF0004010000D*0010200050" + Chr$(H31) + Chr$(H43) End Sub +でいいのでしょうか?&というのも見ましたが・・・。 一応下記の通りだと取扱説明書をみながら、進めました。 'chr$(H5):制御コードENQuiry(問合せ):ヘッダ 'F900:識別番号+フレーム+局番号 '00FF:ネットワーク番号+PC番号 '00:自局番号 '0401:コマンド(一括読み出し) '0000:サブコマンド(モニタ条件指定無し、デバイスメモリ拡張指定無し) 'D*:デバイスコード '001020:先頭デバイス '50:デバイス点数 ' Chr$(H31) + Chr$(H43):サムチェックコード ↓ここからが、テキストボックスへの表示になりますが・・・。これもうまくいかず。 Private Sub CommandButton2_Click() R = MSComm1.input text1.Text = R text2.Text = Mid$(R, 6, 4) End Sub そして、ポートオープン。これは、エラーが出ず、うまくいったと考えています。 Private Sub Form_Load() Sheets("Sheet1").Select MSComm1.DTREnable = True MSComm1.RTSEnable = True MSComm1.inputLen = 0 'Input プロパティ使用時に、バッファ全体を読み取る。 MSComm1.commport = 1 'これは必要かと考え、テキストにはないが追加。 MSComm1.Settings = "9600,N,8,1" MSComm1.portopen = True End Sub そして、ポートクローズ。こちらも、エラーが出ず、うまくいったと考えています。 Private Sub CommandButton3_Click() MSComm1.portopen = False End Sub 最大の問題は、しっかりとコードが送信できているのかというところです。 解らないところも多々あるため不明な点も多いですが、なにとぞ、教えてください。

  • シリアル受信データをファイルに書き出したい

    マイコンとPCをCOMポートで通信し、受信データをファイルに書き出したいのです。 やってみたこと1.と2.の間を埋める技術についてアドバイスをお願いします。 1.キーボード入力したテキストボックスの内容をファイルに書き出す ⇒書けました、OK     Dim xxx As New System.IO.StreamWriter("e:xxx.txt", False, System.Text.Encoding.Default) xxx.WriteLine(TextBox1.Text) xxx.Close() 2.サンプルコードでシリアル通信 ⇒受信データがテキストボックスに表示されました、OK     以下サイトを参考に勉強中、テキストボックス部分を抜粋させて頂きます     (http://www.kana-soft.com/tech/sample_0008_4.htm#1) 3.2.で表示されたテキストボックスの内容を、1.のように書き出したいのですが   上手くいきません。'■から'■間に xxx.WriteLine(RcvTextBox.Text) 書いてみましたが   e:xxx.txtは作成されません。delegate、invokeの理解不足が原因かと思うのですが、   調べ回るうちに・・・限界みたいです。(^_^;) (抜粋) '===== Private Delegate Sub Delegate_RcvDataToTextBox( data As String ) '===== Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived Try '受信データを読み込む. Dim data As String data = SerialPort1.ReadExisting() '受信したデータをテキストボックスに書き込む. Dim args(0) As Object args(0) = data Invoke(New Delegate_RcvDataToTextBox(AddressOf Me.RcvDataToTextBox), args) Catch ex As Exception MsgBox( ex.Message ) End Try End Sub '===== Private Sub RcvDataToTextBox( data As String ) '受信データをテキストボックスの最後に追記する. If IsNothing( data ) = False Then RcvTextBox.AppendText( data ) End If '■     Dim xxx As New System.IO.StreamWriter("e:xxx.txt", False, System.Text.Encoding.Default) xxx.WriteLine(RcvTextBox.Text) xxx.Close()     '■ End Sub ===== 以上、駄目出しをよろしくお願いします。

  • 双方向ファン 制御

    ファンの回転制御についてです。 無線モジュールのアナログ出力ピンでファンの制御をしようとしています。 まず始めに、teratermにてデューティー比50コマンド入力をして、アナログ出力ピン(pwm)から抵抗とledを接続した結果、LEDは光りました。 次にデューティー0のコマンドを入力することでLEDは消灯しました。 つまり、pwm信号は送れているということだと思います。 そこで以下の双方向ファンを制御しようとしました。 入力電圧12vとgndにまず接続して印加した結果まずファンは回転し始めた。 そこでブラッドボード上でコントロール線を先ほどのLEDと同じラインに接続しました。 とりあえずデューティー50のコマンドを入力したら、LEDは点灯しました。ファンの回転は変わっているかはわかりません。 そのあとデューティー0のコマンドを入力しました。本来ならばファンの使用上逆回転し始めるはずなのですがLEDだけは消灯して逆回転しません。 何故だかわかりません。わかる方教えてください 1つめはファン 2つめは実際の回路の写真です https://www.sanyodenki.com/archive/document/product/cooling/catalog_J_pdf/San_Ace_92RF38_J.pdf https://drive.google.com/file/d/1NUFRHBcZUqbNRcUNCkKJEa570TlSy1by/view?usp=drivesdk

  • 通信確認

    あるコントロールボードの設計をしているのですが、 シリアル通信についての質問です。 RS232Cインターフェースで外部機器とやりとりするのですが、 (通信自体は問題なく動作している状態です) 通信確認用のLEDを付けてほしいと言われています。 このような場合は普通は(普通があるのかどうか知らないですが) どのようにLEDを接続するものなのか教えて下さい。 CPLDなどのゲートは一切乗っていません。 直接CPUのTxDもしくはRxDにプルアップやプルダウンするような形で 抵抗とLEDを接続したりするのでしょうか? CPUからの送信とCPUへの受信は3.3Vです。 よろしくお願いします。

  • 【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); } } } } ////////////////////////////////////////////////////////////////