• 締切済み

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

統合開発環境ソフト: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

みんなの回答

回答No.2

Hardware flow controlは、HandshakeプロパティにNoneを設定すればできる。 ACKの送信は、&H06入れたバイト配列用意して、write(Byte[], Int32, Int32)メソッドで送るなり、 Chr(&H06)を、write(string)メソッドで送れば良いんじゃないかな? 動作確認はしていないのであしからず。

halsan1111
質問者

お礼

お返事ありがとうございます。 方法は解決しなかったのですが、開発する必要がなくなったため、回答を締め切らせて頂きます。 ありがとうございました。

回答No.1

制御コードについてはASCIIコード表を見ましょう。 ACKは&H06です。 他にも ENQ &H05 NAK &H15 あたりも使うかな? あと、BSC手順とか調べるといいかもしんない。

halsan1111
質問者

お礼

お返事ありがとうございます。 つまり、16進数でリーダーに送らないといけないってことですね。 それからBSC手順については、伝送を制御するための手順ってことは解りました。 つまり、シリアルポートで通信するためには、受信側から「送信していいですよ」っていう情報がないといけないってことですよね。 ですが、VBでそれをするためにはどうすればいいのか、具体的に書いているサイトを見つけられませんでした。 VBでカードリーダに「&H06」を送るためにはどういった関数を使えばいいのでしょうか?