こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

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

投稿日時 - 2012-04-19 12:35:24

QNo.7429429

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

Hardware flow controlは、HandshakeプロパティにNoneを設定すればできる。

ACKの送信は、&H06入れたバイト配列用意して、write(Byte[], Int32, Int32)メソッドで送るなり、
Chr(&H06)を、write(string)メソッドで送れば良いんじゃないかな?

動作確認はしていないのであしからず。

投稿日時 - 2012-04-19 18:15:58

お礼

お返事ありがとうございます。

方法は解決しなかったのですが、開発する必要がなくなったため、回答を締め切らせて頂きます。

ありがとうございました。

投稿日時 - 2012-04-24 10:02:37

ANo.1

制御コードについてはASCIIコード表を見ましょう。

ACKは&H06です。
他にも
ENQ &H05
NAK &H15
あたりも使うかな?

あと、BSC手順とか調べるといいかもしんない。

投稿日時 - 2012-04-19 13:58:36

お礼

お返事ありがとうございます。
つまり、16進数でリーダーに送らないといけないってことですね。

それからBSC手順については、伝送を制御するための手順ってことは解りました。
つまり、シリアルポートで通信するためには、受信側から「送信していいですよ」っていう情報がないといけないってことですよね。
ですが、VBでそれをするためにはどうすればいいのか、具体的に書いているサイトを見つけられませんでした。

VBでカードリーダに「&H06」を送るためにはどういった関数を使えばいいのでしょうか?

投稿日時 - 2012-04-19 15:08:24

あなたにオススメの質問