質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Qt Creator

Qt Creatorは、Qtアプリケーションを開発するための開発統合環境(IDE)です。

Q&A

解決済

3回答

2803閲覧

ICカードリーダライタで2種類のカードを同時に検出待ちする実装方法

tuyudaku

総合スコア75

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Qt Creator

Qt Creatorは、Qtアプリケーションを開発するための開発統合環境(IDE)です。

0グッド

1クリップ

投稿2019/07/03 01:00

実装方法に悩んでいるので助言をお願いしたいです。

ICカードリーダライタとの通信を行うプログラムの作成をしています。
リーダライタの機能で、カードの検出待ちを行うPollingコマンドがあるのですが、
FeliCaカード用とMIFAREカード用とでそれぞれ別のPollingコマンドが存在しており、
また同時に二つのカードの検出待ちをすることができません。

そのため2つのカードを同時に取り扱いたい場合は、
FeliCa用Pollingを送り、検出のタイムアウトが発生したらMIFARE用Pollingコマンドを送る。
検出のタイムアウトが発生したらFeliCa用Pollingコマンドを送る。
というのを繰り返すのが基本になるかと思います。

リーダライタからのタイムアウトのレスポンスは、
FeliCa用PollingとMIFARE用Pollingで共通となっていますので、
基本的にはタイムアウトを受け取ったら、前回送ったPollingコマンドじゃないものを送るだけなのですが。

作成中のソフトウェアでは、設定値によってFeliCaカードを使うか、MIFAREカードを使うか、それとも両方を使うのかを選べるようになっているため
その設定値によっても送るコマンドを選択する必要があります。

コマンドのコードを渡せば、コマンドに対応したパケットデータの作成からリーダライタへの送信までを行ってくれる関数は作成済みのため後はどっちのPollingコマンドを送るのかという処理を実装するだけになります

c++

1static const quint8 felica_polling = 0x00; 2static const quint8 felica_polling_res = 0x01; 3static const quint8 mifare_polling = 0xC0; 4static const quint8 mifare_polling_res = 0xC1; 5static const quint8 time_out = 0x7E; 6 7// リーダライタから受信データがある場合、readData関数を呼び出すように関連付け 8connect(device_serial_port_, &QSerialPort::readyRead, this, &IcCardReaderWriter::readData); 9 10void IcCardReaderWriter::readData() 11{ 12 switch(receive_command) 13 { 14 case felica_polling_res: 15 // 受信したデータを処理 16 // 【次送るべきpollingコマンドの選択】 17 break; 18 19 case mifare_polling_res: 20 // 受信したデータを処理 21 // 【次送るべきpollingコマンドの選択】 22 break; 23 24 case time_out: 25 // 【次送るべきpollingコマンドの選択】 26 break; 27 } 28} 29 30void IcCardReaderWriter::writeData(quint8 command_code) 31{ 32 // 渡されたコマンドコードを元にデータを作成してリーダライタへ送信処理 33}

この**【次送るべきpollingコマンドの選択】**という処理の部分を
1つの関数を呼ぶだけで、呼び出し側はカードの使用設定は?前回はどちらだった?というのを
意識せずに処理ができるようにしたいと思っております

カードの使用設定とのからみが厄介で、どうにかしてスマートに実装できないものかと悩んでいるところです
少し長くなってしまいましたが、助言をよろしくお願いします。
足りない情報が有りましたら適宜追記させていただきます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_obara

2019/07/03 01:04

デザインパターン にあるStateパターンを利用するのはいかがですか?
guest

回答3

0

前の質問がつまりこういうことなわけですね。
そういう具体的な話なら、カードリーダークラスのメンバー変数でAUTO/FELICA/MIFAREとかのモードを保持して、polling関数はそれを参照してAUTOだったらpollingを交互に、FELICA/MIFAREだったらそれぞれに強制、とすればいいかと思うのですけれど。まぁ、プログラム的には前回の回答とあまり変わらないですけれど、前回引数で与えたものが今回はメンバー変数になって、多分そのメンバー変数にはセッターを設ける、とかそんなことになりそうな気がします。

投稿2019/07/05 14:19

thkana

総合スコア7629

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

とりあえず、単純なif文の組み合わせで実装しました

投稿2019/07/05 06:59

tuyudaku

総合スコア75

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

どちらのモードでポーリングが成功したかのフラグでも持っておいて、次の段階のときにそのフラグの内容によってどの関数を呼び出すのか選択するようにすればいいのではないかと。

投稿2019/07/03 01:28

y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問