• 締切済み

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

マイコンと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 ===== 以上、駄目出しをよろしくお願いします。

みんなの回答

  • samtomsan
  • ベストアンサー率55% (1060/1897)
回答No.1

Eドライブのルートに書き出したいのでしょうか。 > "e:xxx.txt" ドライブ指定が違っているだけのように見えます。 "e:\xxx.txt" 「¥」が必要

up2pc
質問者

お礼

御指摘ありがとうございました。 e:\xxx.txt とすることで、書き出しができました。(^_^)v いじっているうちに”\”を消してしまったみたいです・・・ ちなみに、1.では2.の一部をコピペして動作確認したのですが、 "\"無しの"e:xxx.txt"でも書き出しができたので、気付きませんでした。

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

関連するQ&A

  • 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

  • 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 ------------------------------------------------------------------------

  • vb2005で受信関数を以下の作成しています。

    vb2005で受信関数を以下の作成しています。 Private Sub r_SerialPort1_DataReceived(ByVal sender As Object, _  ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) _  Handles SerialPort1.DataReceived  Dim tmp As Integer  Try   tmp = SerialPort1.BytesToRead '受信バイト数取得 SerialPort1.Read(s_RxBuff, s_RxCont, tmp) 'データ読込み s_RxCont = s_RxCont + tmp '受信バイト数更新  Catch ex As Exception s_Status = c_ErrTRP 'ポートエラー(受信) End Try End Sub この関数で割込みが入るのですが、tmp=の所でbreakし読出そうとしてSerialPort1をウォッチすると、 "ポートは閉じられています"と表示されていて、Catch方向に進むのですが、何故こんなことが起こるのでしょうか? 宜しくお願いします。

  • カードリーダーのデータ受信方法

    統合開発環境ソフト:Microsoft Visual Studio 2010 Express OS:windowsXP 言語:Visual Basic 上記環境で磁気カードを読み込んだカードリーダのデータをUSBにつないで、パソコンに送信し、パソコンのソフト側で受信するソフトを作りたいと思っているのですが、カードリーダでデータの方が送信されず、アドバイスいただければと思い質問させていただきました。 ネットで調べながらテキストボックスに書いたポート番号を開いて、その後、リーダーで送信するという動きをさせようと、以下のようなソースを書いてみたのですが、データが送信されません。 磁気リーダ(アメリカ製)のプログラマーズマニュアルを調べてみたところ、 Upload Data 1. ID-e will send the first record and wait for an <ACK > (hex code: 06h) to send the next one or a NAK (hex code: 15h) to resend the record. と書いており、プログラム側で「ACK」というデータを送信しないとリーダーが送信を開始しないのかと思ったのですが、どのようにすればいいのか調べても解りませんでした。 他にも抜けていることがあるのかも知れませんが、お気づきの点ございましたら、ご教授いただけると幸いです。 また、参考までに作ったプログラムの実行時の画面を添付いたします。 尚、ポートの設定は磁気カードリーダのマニュアルの記載通り Baud rate: 19200 Parity: None Data bit: 8 Stop bit: 1 としております。 ただ、 Hardware flow control: None という記載があるのですが、どこで設定すればいいのかわからないため、変更しておりません。 よろしくお願いいたします。 ------------------------------------------------------------------------ Public Class Form1 Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click Try If SerialPort1.IsOpen = True Then Exit Sub End If SerialPort1.PortName = TextBox1.Text SerialPort1.Open() Catch ex As Exception MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try SerialPort1.RtsEnable = True End Sub Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click If SerialPort1.IsOpen = True Then SerialPort1.Close() End If End Sub Delegate Sub DataDelegate(ByVal sdata As String) Private Sub PrintData(ByVal sdata As String) TextBox2.Text = sdata End Sub Private Sub SerialPort1_DataReceived() Dim ReceivedData As String = " " Try ReceivedData = SerialPort1.ReadLine Catch ex As Exception ReceivedData = ex.Message End Try Dim adre As New DataDelegate(AddressOf PrintData) Me.Invoke(adre, ReceivedData) End Sub End Class

  • '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 ///////// 文字を送信した後に相手から帰ってきます。 送信した後の受信の部分ですが、これで正しいか教えて頂きたいです。

  • シリアルポートから送られてくる文字の指定方法

    現在VB2010で作成中のアプリと測定器のデーターをシリアル通信で記録採取したと考えています。 測定機からの通信が下記の通りにPCに送られてきますが、必要な部分の採取す方法が分かりませんので教えてください。 ハイパーターミナルでの測定器からの文字受信は12文字送られてきます。 VBで作成中のアプリでは5文字目から9文字目のみをテキストに表示したいと思いますが、分かる方教えてください。現在制作中のソースも一部表示しますので、よろしくお願いします。今年から勉強してる、初心者です。 Delegate Sub AddDataDelegate(ByVal str As String) Private Sub AddData(ByVal str As String) '受信データー表示' If SerialPort1.IsOpen = False Then 'シリアルポートをオープンしていないときは、処理しない Return End If '受信データー読み込み Dim data As String data = SerialPort1.ReadExisting()    上記のソースが受信するようにしていますが、受信データーは1s毎に更新されておりますその都度テキストへ表示するようにしたいと思います。データーが更新されても、数値は残るようにしたいと思います。

  • VB2010 COMポートからのバイナリ受信

    オシロスコープからの画像データ(40kバイト程度のtifファイル)をPCのCOMポートから受信し 保存するプログラムを作成しているのですが、受信データを正しくPC上に保存できません。 具体的には下記のコードでtifファイルは作成されますが、容量が数kバイトで明らかに不足 しています。 MsgBoxを有効にして受信バッファサイズや書込み長さを確認しましたが、「OK」ボタンを押す たびに下記の表示になります。COMポートのバッファサイズが4096バイトなので「dat.Length」 をすべて足し合わせると本来の受信データサイズになると思うのですが、PC上に作成された ファイル容量から「dat」が常に上書きされているような気がします。 正しく保存するにはどのような修正が必要でしょうか? 【MsgBoxを有効にしたときの表示値(OKを押すたびに数値が変わる)】 「dat.Length」 183 4075 4072 4092 4088 4084 4085 4092 4059 4078 3910 0 0 ・ ・ ・ 「ByteToRead」 4060 1508 324 908 2334 1785 70 227 400 0 0 ・ ・ ・ 【作成したコード】 Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As_ System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived ' シリアルポートからデータ受信 Dim dat As Byte() = New Byte(SerialPort1.BytesToRead - 1) {} SerialPort1.Read(dat, 0, dat.GetLength(0)) 'MessageBox.Show(dat.Length) 'MessageBox.Show(SerialPort1.BytesToRead) File.WriteAllBytes("C:\test1.tif", dat) SerialPort1.DiscardInBuffer() End Sub 【環境】 OS:Win7 VB:2010 ポート設定:SerialPortクラス標準からポート番号以外は変更なし

  • VS.NET2005 C#にてSerialPort受信されたときのイベントについて質問

    Visual Studio.NET2005ProにてSerialPort接続アプリケーションを開発しております。 受信が来たときのイベント DataReceived のところで、受信された文字列をテキストボックスへ表示させるということを行いたいのですが、エラーが出てしまいます。 ちなみにプログラムはこうです。 private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { //シリアルポートからデータを受信するたびに発生する textBox_all_in.Text = (string)serialPort.ReadByte(); } それで、エラーは エラー 1 型 'int' を型 'string' に変換できません。 このように出てしまいました。プログラミング初心者で、つまずいてしまいどうすればよいのかわからなく困っております。アドバイスよろしくお願いします。

  • VB2010から外部機器へのシリアル通信によるデー

    VB2010をのserialport機能を用いて,外部機器にデータを送るプログラムを作成しています。 外部機器から送信されてきたデータの受信は問題なくできましたが,PCからの送信がうまく出来ません。 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click If TextBox2.Text.Length = 0 Then MessageBox.Show("送信文字列を入力してください", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error) TextBox2.Focus() Exit Sub End If Try SerialPort1.WriteLine(TextBox2.Text) Catch ex As Exception MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End Sub プログラムは上記のようになります。(microsoftのサンプルそのままです。) 上記のプログラムで 数字の「1」を送信したいのですが,うまく送ることができません。 外部機器は,データが送信されたことは感知していますが, 「1」 が送られたことは認識できていないようです。 serialdebug2というソフトを使用して,「1」 を送信した場合は,問題ありませんでした。 どうすれば,上記のような問題を解決できるdしょうか?

  • SerialPort処理でInvokeメソッドを使用するとエラーが発生。

    はじめまして。こんばんわ。 同一プロジェクトの複数のフォームから、RS232C接続処理を行っております。 まったく同じ処理内容なので、クラスを使用しようとしております。 しかし、データ受信時、Invokeメソッドを使用して、各フォームのイベントをCALLしますと、『InvalidOperationException』が発生し、『ウィンドウ ハンドルが作成される前、コントロールで Invoke または BeginInvoke を呼び出せません。』というエラーメッセージが表示されてしまいます。 ソースを下記に記載いたします。どなたか、原因・対処方法がわかる方がいらっしゃいましたら、御手数をおかけいたしますが、ご教示の程、よろしくお願い申し上げます。 ============================== 呼び出し元フォーム ============================== Public Class Form1   Private cls232CIns As cls232C   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click     cls232CIns.openport()   End Sub   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load     cls232CIns = New cls232C()   End Sub   Public Sub DispData(ByVal data As String)     TextBox1.Text = data   End Sub End Class ============================== SerialPort通信クラス ============================== Imports System.IO.Ports Public Class cls232C   WithEvents SP1 As SerialPort   Delegate Sub RecvDataDisp(ByVal dataR As String)   Public Sub New()     SP1 = New SerialPort("COM6", 9600)   End Sub   Public Sub openport()     SP1.Open()   End Sub   Public Sub closeport()     SP1.Close()   End Sub   Public Sub ReceiveData(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SP1.DataReceived     Dim getdata As String     getdata = SP1.ReadLine     Form1.Invoke(New RecvDataDisp(AddressOf Form1.DispData), getdata) ←ここでエラー発生   End Sub End Class  

このQ&Aのポイント
  • 手首式血圧計のBluetooth接続について詳しく教えてください。
  • iPhone SEのiOS15.0を使用していますが、Bluetooth接続ができません。
  • エレコム株式会社の製品について、Bluetooth接続ができない問題が発生しています。
回答を見る

専門家に質問してみよう