• 締切済み

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は何か特別な仕様なのでしょうか? 何か見落としている設定項目ありますでしょうか? どうぞアドバイスよろしくお願い致します。

  • tplgy
  • お礼率75% (3/4)

みんなの回答

回答No.2

port.Writeメソッドではなくport.WriteLineメソッドを使用すべきでしょう。 port.Write("NT")ではNとTが出力されるのみです。

tplgy
質問者

お礼

お返事ありがとうございました。 WriteLineメソッドでも出来ませんでしたが、 ロボットの方の通信が RTS,CTSを使ったシリアル通信だったために serialPort クラスのRequestToSendプロパティをTrueにしてやることで無事通信を行えました。 Teratermで出来たのは、1文字1文字入力する間に時間があったために ロボットの方の処理が追いついていたようで、 プログラムで"NT"と送ると処理能力が追いつかなかったのだと思います・・・。 ありがとうございました。

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.1

>port.Write("NT"); port.Write("NT\n"); とか port.Write("NT\r"); は

tplgy
質問者

補足

ありがとうございます、やってみましたがダメでした。 現象としては「port.Write("NT\n");」でコマンドを送ってやると ロボットの本体で不適切なコマンドとしてエラービットが立ってしまいます。 teratermで送るとこのようなことはありません。。。 困りました・・・・

関連する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

  • シリアル通信の方法(VB)

    VisualBasicを使ってシリアル通信(受信のみ)を考えている初心者です。 現在、フォームのデザイナーからSerialportをドラッグしプロパティを設定しました。 コードでは、ポートを開き、受信の命令をしていますが ".readline"の文のところでフリーズしてしまいます。 ---------- SerialPort1.Open() Dim receivedata As String = "" receivedata = SerialPort1.Readline ---------- 原因がつかめず困っています。 何がいけないのでしょうか?詳しい方、是非ご教授お願いします。

  • VB2010で、シリアル通信をするには

    VB2010で、シリアル通信をするには シリアルポートをopenしようとすると、エラーで弾かれてしまいます。 どのように対処したら良いですか? 使っているソースコードは、下記の通り。 Private Sub ButtonRsStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonRsStart.Click Try '例外処理のはじまり If SerialPort1.IsOpen = True Then 'ポートはオープン済み MessageBox.Show("すでに" & SerialPort1.PortName & "は接続されています。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End If SerialPort1.PortName = "COM1" 'オープンするポート名を格納 SerialPort1.Open() 'ポートオープン PORT_STATE.Text = "OPEN" Catch ex As Exception '例外処理 MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End Sub --------------- エラーが発生する場所は、「Catch 」になります。 エラーメッセージは、「ポート 'COM1' へのアクセスが拒否されました。」です。 何が原因なのか、さっぱり分かりません。 ヒントになりそうな解答を頂けないでしょうか?

  • コマンドプロンプトのシリアル通信について

    最初に、プログラム等の知識が乏しいので、説明がわかりづらければすいません。 貴金属向けの計量器をPCから制御できる方法を探しております。 計量器にあるコマンドを送る事で、計量値を0にしたり、結果を返す事が出来るようです。 というのも、計量器メーカーの出している専用アプリケーションを利用すれば、そのあるコマンドを送り、計量器からの戻り値も受信できるのですが、他アプリへ連携したいので、その専用アプリを介さず制御したいのです。 あるコマンドというのは、 ・計量値を0にする(リセット)=”R”+改行コード ・計量結果を取り出す=”PRT”+改行コード 自分でも色々と検索し、コマンドプロンプトで、 type C:\test\R.txt > com5 のようにテキストファイルの中身を計量器(COM5)へ送る事で、計量値を0にする事は成功しました。 テキストファイルの中身は文字列”R”と改行コードです。 計量した結果を計量器から取り出す為には、 文字列”PRT”+改行コードを計量器に送り、計量器から戻り値として、 【1.12g】のように返ってきます。 この返ってきた情報をコマンドプロンプトでPCに取り出す事は可能でしょうか? また不可能であればPowershellで行う方法もありますでしょうか? もし方法をご存じの方がいらっしゃれば教えていただけないでしょうか。 宜しくお願いします。 ちなみに計量器に送信するコマンドについては、シリアル通信をモニターできるフリーソフトを利用し、テストしているのであっていると思います。 添付画像を参照ください。 ※50 52 54 0d 0a=”PRT”+改行コードを送信し結果(20 20 20 20 20 20 20 20 30 2e 30 32 20 67 0d 0a= 4.82 g+改行コード)が返ってきたときの画像です。

  • VBでシリアル通信がうまくいきません

    VisualBasicのシリアルポートメソッドを使い、RS232-C通信を試そうとしている初心者です。 現在、別のPCからTeratermより文字を送り、自分のPCで受信結果を得ようとしているのですが 別PCから単発で文字を送っても、自分のPCでは反応せず キーボードを押しっぱなしにすると、自分のPCのウィンドウに受信結果が表示されます。 一体、何が原因なのでしょうか? さっぱり、わからず途方に暮れています。 下記にソースコードを記載しますので、詳しい方は教えて下さると幸いです。 ------------------------------------------------------------------------ Public Delegate Sub MyDelegate(ByVal intData As Integer) Private Sub AddData(ByVal str As String) TextBox1.Text = str End Sub Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived Dim dlgByte As MyDelegate = New MyDelegate(AddressOf AddData) Dim ByteRead(SerialPort1.BytesToRead - 1) As Byte SerialPort1.Read(ByteRead, 0, SerialPort1.BytesToRead) For i As Integer = 0 To ByteRead.Length - 1    Me.Invoke(dlgByte, ByteRead(0)) Next End Sub ------------------------------------------------------------------------

  • Teraterm macro

    Teratermを使って仕事をしようとしています。 概要は、シリアルポートにATコマンドを送って、そのレスポンスをチェックというだけのものですが、 いかんせん、多数の対象製品があります。仕事の正確性、迅速性から、自動化したいと考えています。 (1)シリアルポートの接続 (2)ログファイルのオープン (3)ログファイルに時刻の記録 (4)ATコマンドの送出 (5)ログファイルに区切りの線を入れる (6)ログファイルのクローズ (7)シリアルポートのクローズ DOSプロンプトにて、 ttpmacro.exe test.ttl を入力して、作業を進めたいと考えます。 ここに、test.ttl は、Teratermと同じフォルダにおきます。 test.ttl------------------- connect '/c=4' pause 1 logopen "teraterm.log" 1 1 pause 1 gettime datetime '-%Y%m%d-%H%M%S' ????? sendln "AT+xxxxx" pause 1 sendln "AT+YYYY" pause 1 logwrite "-----------"#13#10 logclose disconnect pause ------------------------- サジェスチョンをいただきたいのは; 1.時刻(datetime )を如何にすれば、ログに残すことができるのか? 2.pauseは、sendlnの後には、確実に必要ですが、他の部分は、まだ、チェックしていません。 絶対に不要と言う箇所をサジェスチョン願います。 3.マクロの終了後、Teratermのウィンドウが残ったままになってしまいます。   2回上記(ttpmacro.exe test.ttl)を実行させると、2つのTeratermウィンドウが残ってしまいます。   マクロ終了後、如何にして、ウィンドウをクローズさせることができますか? 4.その他、期待しないコード等が、ログに残されてしまいます。 送出したコマンド、受け取ったレスポンス以外をログに残さないことは可能でしょうか? 以上、宜しくお願いいたします。

  • シリアルポートについて

    シリアルポート(D-sub 9pin)をCで制御してリレーを使い簡単なロボットみたいなのを作りたいと思ってます。 シリアルポートの制御方法を自分なりに調べてみたのですが、Cでの制御方法がわからず皆様にご教授してもらおうと思いました。 まずシリアルポートを使うさいに必要な宣言などはありますか?(例えば変数など) それからシリアルポートにスイッチなどで信号を送りそれを元に判断する方法はありますか? そしてシリアルポートから外部に出力する方法はどうやればいいのでしょうか? 以上3つを教えてください。 なお自分自身CとBASICしかまだわかりませんのでC++よりCで教えていただけると光栄です。 皆様よろしくお願いします。

  • (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++でのプログラム作成は初めてです。 ソースに変な点が多々あるとは思います。 ご教授お願いします。

  • シリアル通信で受信したデータによる図の描写

    RS-232Cのシリアル通信により受信したデータをもとに appletに図を描写するプログラムを考えています。 まず受信したデータをコマンドプロンプトに出力することはできたのですがプログラムを改良して 受信データを用いてappletに図を描こうとしたところ コンパイルはできたのですがappletで実行すると コマンドプロンプトにエラーメッセージが表示され実行できませんでした。 プログラムは以下の通りです。 分かる方がおられたらご回答のほどよろしくお願いします。 import javax.comm.*; import java.io.*; import java.util.*; import java.applet.Applet; import java.awt.*; public class SerialPortReader extends Applet implements SerialPortEventListener { protected SerialPort port; private InputStream is; public int newData; public void init(){ String portName = "COM6"; CommPortIdentifier portID = null; try{ // COM6 のCommPortIdentifier を取得 portID = CommPortIdentifier.getPortIdentifier(portName); }catch(NoSuchPortException ex){ ex.printStackTrace(); System.exit(1); } try{ //ポートのオープン port = (SerialPort)portID.open("SerialPortWriter", 5000); }catch(PortInUseException ex){ ex.printStackTrace(); System.exit(1); } try { // 通信速度などの通信条件の設定 port.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); port.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN | SerialPort.FLOWCONTROL_RTSCTS_OUT); } catch (UnsupportedCommOperationException ex){ ex.printStackTrace(); System.exit(1); } try { // SerialPortEvent を受け取るためのリスナの登録 port.addEventListener(this); } catch(TooManyListenersException ex){ ex.printStackTrace(); System.exit(1); } // Data Available イベントを受け取るようにする port.notifyOnDataAvailable(true); try { //COM6ポートから入力ストリームを取得する is = port.getInputStream(); } catch (IOException ex){ ex.printStackTrace(); System.exit(1); } } //受信データの大きさの円を描く public void paint(Graphics g) { g.fillOval(50, 50 , newData , newData); } // SerialPortEvent 処理ルーチン public void serialEvent(SerialPortEvent event) { newData = 0; switch(event.getEventType()) { case SerialPortEvent.BI: case SerialPortEvent.OE: case SerialPortEvent.FE: case SerialPortEvent.PE: case SerialPortEvent.CD: case SerialPortEvent.CTS: case SerialPortEvent.DSR: case SerialPortEvent.RI: case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // Data Available 以外のイベントは処理しない break; case SerialPortEvent.DATA_AVAILABLE: while (newData != -1) { try { //入力ストリームから次のバイトデータを読み込む newData = is.read(); //十進数のアスキーコードから0~9の整数に変換 newData = newData - 48; //受信データを元にグラフ表示 repaint(); //入力ストリームからバイトデータがなくなったら処理を終える if (newData == -1) { break; } } catch (IOException ex) { System.err.println(ex); return; } } break; } } }

    • ベストアンサー
    • Java

専門家に質問してみよう