RS232Cからのデータ取り込みについて
RS232Cからのデータ取り込みについて
はじめまして。hiroといいます。
N88BASICはよくゲームを作って遊んでおりましたくちであります。最近はとんとプログラム作りから離れていたのですが、こんなソフトが無料であるのを発見し、プログラミング意欲が再び沸いてきている今日この頃です。
ところで、このactivebasicを使ってRS232Cからのデータ取り込みするプログラムを組みたいと思っているのですが、初心者の私では難しいでしょうか。単純に取り込まれてきたデータを画面に表示し、それをcsv形式で保存できればいいのですが。どなたかご教授願います。
N88BASICはよくゲームを作って遊んでおりましたくちであります。最近はとんとプログラム作りから離れていたのですが、こんなソフトが無料であるのを発見し、プログラミング意欲が再び沸いてきている今日この頃です。
ところで、このactivebasicを使ってRS232Cからのデータ取り込みするプログラムを組みたいと思っているのですが、初心者の私では難しいでしょうか。単純に取り込まれてきたデータを画面に表示し、それをcsv形式で保存できればいいのですが。どなたかご教授願います。
そうなんですか
Takoさん返信ありがとうございます。RS232Cからのデータ取り込みってそんなに短いコーディングで可能なんですか。
なにせN88BASIC時代は簡単なゲームを作って遊んでいただけでRS232Cからのデータ取り込みなんてやったことがないので、皆目検討がつきません。ぜひサンプルコードを教えていただけないでしょうか。なにせ周りに相談する人はいませんので。
>予断ですが、ハイパーターミナル等を使えば良いのでは?
なんですが、一度自分でつくってみたいのです。自分で作ったソフトが動いた時の感動を再び味わいたいのです(ちょっとおおげさですね)。特に実用になるものでしたらなおさらです。
>AB3以上では、WindowsAPIの知識が必要です。
>AB2で感を取り戻して、次のステップでAB4を使用しGUIに挑戦してみては
>如何でしょう。
まさにその通りで将来的にはGUIのソフトを作ってみたいです。activebasicオフィシャルユーザーズガイドを買おうと思っていますが、Ver4でも使えますか?あの本はVer3で書かれているものだとあったので・・・。それにはこのような外部入出力に関することが書いてあればよいのですが。そのほかになにか参考になるような書籍等をご存知でしたら紹介していただけないでしょうか。
なにせN88BASIC時代は簡単なゲームを作って遊んでいただけでRS232Cからのデータ取り込みなんてやったことがないので、皆目検討がつきません。ぜひサンプルコードを教えていただけないでしょうか。なにせ周りに相談する人はいませんので。
>予断ですが、ハイパーターミナル等を使えば良いのでは?
なんですが、一度自分でつくってみたいのです。自分で作ったソフトが動いた時の感動を再び味わいたいのです(ちょっとおおげさですね)。特に実用になるものでしたらなおさらです。
>AB3以上では、WindowsAPIの知識が必要です。
>AB2で感を取り戻して、次のステップでAB4を使用しGUIに挑戦してみては
>如何でしょう。
まさにその通りで将来的にはGUIのソフトを作ってみたいです。activebasicオフィシャルユーザーズガイドを買おうと思っていますが、Ver4でも使えますか?あの本はVer3で書かれているものだとあったので・・・。それにはこのような外部入出力に関することが書いてあればよいのですが。そのほかになにか参考になるような書籍等をご存知でしたら紹介していただけないでしょうか。
なんとなく昔書いたコード
昔ABで書いたコードの一部抜粋です。
現在はABを使っていないため、ちょっと意味がわからない所もあったので、
不安たっぷりながら、書き込みしてみます。
なお、コンパイル済みのソースから抜粋してますが、
ほんとに一部抜粋ですので、適当に足りない部分は補完して下さい。
(無責任ですいません)
以下、怪しい解説・・・
基本的には、「CreateFile」でファイルではなく、"COM1"などの指定して、
COMのオープンを行います。
その後は、ファイルの読み書きと同じ要領でCOMにアクセスできます。
とりあえず以下をどっかに書いていただいて、、、
(意味はおいおい調べてください)
少しでもお役に立てれば幸いです。
現在はABを使っていないため、ちょっと意味がわからない所もあったので、
不安たっぷりながら、書き込みしてみます。
なお、コンパイル済みのソースから抜粋してますが、
ほんとに一部抜粋ですので、適当に足りない部分は補完して下さい。
(無責任ですいません)
以下、怪しい解説・・・
基本的には、「CreateFile」でファイルではなく、"COM1"などの指定して、
COMのオープンを行います。
その後は、ファイルの読み書きと同じ要領でCOMにアクセスできます。
とりあえず以下をどっかに書いていただいて、、、
(意味はおいおい調べてください)
[ここをクリックすると内容が表示されます]
' DCB構造体の定義
Type DCB
DCBlength As Long '構造体のサイズ
BaudRate As Long 'ボーレイト(bps)の設定
fBitFields As Long 'ビット単位のフィールド定義
wReserved As Integer '予約(0をセットする)
XonLim As Integer '受信バッファ中のデータが何バイトになったらXon文字を送るかを指定
XoffLim As Integer '受信バッファの空きが何バイトになったらXoff文字を送るかを指定
ByteSize As Byte '1データのビット数を指定
Parity As Byte 'パリティの方式を指定
StopBits As Byte 'ストップビット数を指定
XonChar As Byte 'Xon文字を指定
XoffChar As Byte 'Xoff文字を指定
ErrorChar As Byte 'パリティエラーの場合に使う文字を指定
EofChar As Byte '非バイナリモードの場合のデータ終了文字の指定
EvtChar As Byte 'イベントを生成する文字を指定
End Type
' COMMTIMEOUTS構造体の定義
Type COMMTIMEOUTS
ReadIntervalTimeout As Long '文字の読み込みの待ち時間
ReadTotalTimeoutMultiplier As Long '読み込みの1文字あたりの時間
ReadTotalTimeoutConstant As Long '読み込みの定数時間
WriteTotalTimeoutMultiplier As Long '書き込みの1文字あたりの時間
WriteTotalTimeoutConstant As Long '書き込みの定数時間
End Type
'シリアルポートの設定関数の定義
Declare Function SetCommState Lib "kernel32" (ByVal hCommDev As Long,ByRef lpDCB As DCB) As Long
'タイムアウトの設定関数の定義
Declare Function SetCommTimeouts Lib "kernel32" (ByVal hFile As Long,ByRef lpCommTimeouts As COMMTIMEOUTS) As Long
'************************
' グローバル変数
'************************
Dim hComm As HANDLE 'COMポートハンドル
Dim stDCB As DCB '通信ポート情報
Dim timeOut As COMMTIMEOUTS '通信タイムアウト設定
COMのオープンはこちら
' DCB構造体の定義
Type DCB
DCBlength As Long '構造体のサイズ
BaudRate As Long 'ボーレイト(bps)の設定
fBitFields As Long 'ビット単位のフィールド定義
wReserved As Integer '予約(0をセットする)
XonLim As Integer '受信バッファ中のデータが何バイトになったらXon文字を送るかを指定
XoffLim As Integer '受信バッファの空きが何バイトになったらXoff文字を送るかを指定
ByteSize As Byte '1データのビット数を指定
Parity As Byte 'パリティの方式を指定
StopBits As Byte 'ストップビット数を指定
XonChar As Byte 'Xon文字を指定
XoffChar As Byte 'Xoff文字を指定
ErrorChar As Byte 'パリティエラーの場合に使う文字を指定
EofChar As Byte '非バイナリモードの場合のデータ終了文字の指定
EvtChar As Byte 'イベントを生成する文字を指定
End Type
' COMMTIMEOUTS構造体の定義
Type COMMTIMEOUTS
ReadIntervalTimeout As Long '文字の読み込みの待ち時間
ReadTotalTimeoutMultiplier As Long '読み込みの1文字あたりの時間
ReadTotalTimeoutConstant As Long '読み込みの定数時間
WriteTotalTimeoutMultiplier As Long '書き込みの1文字あたりの時間
WriteTotalTimeoutConstant As Long '書き込みの定数時間
End Type
'シリアルポートの設定関数の定義
Declare Function SetCommState Lib "kernel32" (ByVal hCommDev As Long,ByRef lpDCB As DCB) As Long
'タイムアウトの設定関数の定義
Declare Function SetCommTimeouts Lib "kernel32" (ByVal hFile As Long,ByRef lpCommTimeouts As COMMTIMEOUTS) As Long
'************************
' グローバル変数
'************************
Dim hComm As HANDLE 'COMポートハンドル
Dim stDCB As DCB '通信ポート情報
Dim timeOut As COMMTIMEOUTS '通信タイムアウト設定
[ここをクリックすると内容が表示されます]
'COMポートオープン
hComm = CreateFile(StrComNo, GENERIC_READ Or GENERIC_WRITE, 0, ByVal 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
st.DCB.BaudRate = 9600
stDCB.ByteSize = 8 'ビット長の指定
stDCB.fBitFields = &H3001 'バイナリモードのフラグを有効にし
'RTSの制御を設定する(それ以外はFalseにする)
stDCB.Parity = 0 'パリティの設定(パリティなし)
stDCB.StopBits = 0 'ストップビット数を指定(1ビット)
dummy = SetCommState(hComm, stDCB) '必要な部分だけ書き換える
'タイムアウトの設定
timeOut.ReadIntervalTimeout = 500 '文字の読み込み待ち時間(500ms)
timeOut.ReadTotalTimeoutMultiplier = 0 '読み込みの1文字あたりの時間
timeOut.ReadTotalTimeoutConstant = 1 '読み込みの定数時間(500ms)
timeOut.WriteTotalTimeoutMultiplier = 0 '書き込みの1文字あたりの時間
timeOut.WriteTotalTimeoutConstant = 500 '書き込みの定数時間(500ms)
dummy = SetCommTimeouts(hComm, timeOut) 'タイムアウトの設定
受信はこんな感じでしょうか
'COMポートオープン
hComm = CreateFile(StrComNo, GENERIC_READ Or GENERIC_WRITE, 0, ByVal 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
st.DCB.BaudRate = 9600
stDCB.ByteSize = 8 'ビット長の指定
stDCB.fBitFields = &H3001 'バイナリモードのフラグを有効にし
'RTSの制御を設定する(それ以外はFalseにする)
stDCB.Parity = 0 'パリティの設定(パリティなし)
stDCB.StopBits = 0 'ストップビット数を指定(1ビット)
dummy = SetCommState(hComm, stDCB) '必要な部分だけ書き換える
'タイムアウトの設定
timeOut.ReadIntervalTimeout = 500 '文字の読み込み待ち時間(500ms)
timeOut.ReadTotalTimeoutMultiplier = 0 '読み込みの1文字あたりの時間
timeOut.ReadTotalTimeoutConstant = 1 '読み込みの定数時間(500ms)
timeOut.WriteTotalTimeoutMultiplier = 0 '書き込みの1文字あたりの時間
timeOut.WriteTotalTimeoutConstant = 500 '書き込みの定数時間(500ms)
dummy = SetCommTimeouts(hComm, timeOut) 'タイムアウトの設定
[ここをクリックすると内容が表示されます]
送信は想像力でなんとかしてください、、、、^^;
Dim rChr[300] As Byte
Dim rLen As Long
Dim dummy As Long
' rChrは受信した文字列が入ります。
' 300 は受信する文字数
' rLenには受信した文字数が入ります。
dummy = ReadFile(hComm, rChr, 300, VarPtr(rLen), ByVal 0)
Dim rLen As Long
Dim dummy As Long
' rChrは受信した文字列が入ります。
' 300 は受信する文字数
' rLenには受信した文字数が入ります。
dummy = ReadFile(hComm, rChr, 300, VarPtr(rLen), ByVal 0)
少しでもお役に立てれば幸いです。
>データ取り込みなんてやったことがないので、皆目検討がつきません。ぜひサン
>プルコードを教えていただけないでしょうか。なにせ周りに相談する人はいません
>ので。
AB2でしたら、下記のコードで受信しファイル化できます。(試していませんが・・・)
Open COM1 AS #1
Open RX_File.CSV FOR OUTPUT As #2
For Rx_Loop=1 To 10
Line Input #1,Rx$
Print Rx$
Print #2,Rx$
Next
Close #2
Close #1
RS-232Cはファイルと同様に扱います。
受信データは、 「データ + CR + LF」 で1行の処理になります。
ボーレート等の設定は、AB2コンパイラで行うか、レジストリの操作になります。
(プログラムで設定するには、APIの知識が有れば可能です。)
>なんですが、一度自分でつくってみたいのです。自分で作ったソフトが動いた時
>の感動を再び味わいたいのです(ちょっとおおげさですね)。特に実用になるもの
>でしたらなおさらです
良いですね。初めてプログラムした気持ちを思い出します。
N88Basicをお使いでしたら、おそらく私の方が古い人間ですよぉ。
がんばってください。
私は書籍は購入していません。
ヘルプと、過去ログ、住人のホームページ等で十分でした。
>プルコードを教えていただけないでしょうか。なにせ周りに相談する人はいません
>ので。
AB2でしたら、下記のコードで受信しファイル化できます。(試していませんが・・・)
Open COM1 AS #1
Open RX_File.CSV FOR OUTPUT As #2
For Rx_Loop=1 To 10
Line Input #1,Rx$
Print Rx$
Print #2,Rx$
Next
Close #2
Close #1
RS-232Cはファイルと同様に扱います。
受信データは、 「データ + CR + LF」 で1行の処理になります。
ボーレート等の設定は、AB2コンパイラで行うか、レジストリの操作になります。
(プログラムで設定するには、APIの知識が有れば可能です。)
>なんですが、一度自分でつくってみたいのです。自分で作ったソフトが動いた時
>の感動を再び味わいたいのです(ちょっとおおげさですね)。特に実用になるもの
>でしたらなおさらです
良いですね。初めてプログラムした気持ちを思い出します。
N88Basicをお使いでしたら、おそらく私の方が古い人間ですよぉ。
がんばってください。
私は書籍は購入していません。
ヘルプと、過去ログ、住人のホームページ等で十分でした。
ありがとうございました
サンプルコードを紹介していただきまして本当にありがとうございました。それにしてもWindowsAPIではこれだけのことを宣言しておいてやる必要があるわけですか。こりゃ勉強しがいがありそうです。でもコメントつけてくれたおかげでなんとなくイメージが湧きそうです。がんばってみます。ここまで親切に教えていただいて感謝感激です。ありがとうございました。
>N88Basicをお使いでしたら、おそらく私の方が古い人間ですよぉ。
私が中学生の時(今から20数年前です)学校にPC8001が1台あり、ベーシックマガジンやI/O、ASCII(なつかしい!)に載っていたゲームのプログラムを打ち込んでは遊び、まずパソコンを触るのをあきらめるだろうと思い、親にPC8801を買わせ、思い通りに”お前にやる”の言葉をもらい、みようみまねでBASICを覚え、ゲームで遊ぶよりゲームを作るほうに喜びを感じておりましたが、PC98時代になるとパソコンから離れてしまいほとんどパソコンを触らないようになり、大学生になると今度はMacintoshにはまり、会社に入るとWINDOWSマシンに転向し、現在に至っております。
>N88Basicをお使いでしたら、おそらく私の方が古い人間ですよぉ。
私が中学生の時(今から20数年前です)学校にPC8001が1台あり、ベーシックマガジンやI/O、ASCII(なつかしい!)に載っていたゲームのプログラムを打ち込んでは遊び、まずパソコンを触るのをあきらめるだろうと思い、親にPC8801を買わせ、思い通りに”お前にやる”の言葉をもらい、みようみまねでBASICを覚え、ゲームで遊ぶよりゲームを作るほうに喜びを感じておりましたが、PC98時代になるとパソコンから離れてしまいほとんどパソコンを触らないようになり、大学生になると今度はMacintoshにはまり、会社に入るとWINDOWSマシンに転向し、現在に至っております。
>>インクルードや、初期設定は、どこで調べればよろしいでしょうか?
インクルードって、何をインクルードするのですか?
RS-232CのAPIでしたらMSCのMSDNが良いと思います。
http://msdn.microsoft.com/library/defau ... serial.asp
インクルードって、何をインクルードするのですか?
RS-232CのAPIでしたらMSCのMSDNが良いと思います。
http://msdn.microsoft.com/library/defau ... serial.asp
RS-232C関連を使うときはインクルードファイルは
Takoさん
偶然に、私もRS-232C(バーコードリーダー)でチャレンジしており
通常のOpenや Input#1 などでうまくいかなかったので、初期設定の解釈が
ぬけているのかなと思って書きました。
(ちなみに、ハイパーテキストではきちんと応答文字が出てきます。)
include "BASIC"
とか、特別なサブファイルを指定するような設定がありましたので
RS232Cは必要かなと思い、これについて伺おうとしてました。
APIを用いたものはまだ、考えていません。
ヘルプに、なかなか書いていない部分なので、ぜひこの掲示板で伺いたいなと
思いました。(しかし実際掲示板でもなかなか分かる方がいないようです)
> >>インクルードや、初期設定は、どこで調べればよろしいでしょうか?
>
> インクルードって、何をインクルードするのですか?
>
> RS-232CのAPIでしたらMSCのMSDNが良いと思います。
>
> http://msdn.microsoft.com/library/defau ... serial.asp
偶然に、私もRS-232C(バーコードリーダー)でチャレンジしており
通常のOpenや Input#1 などでうまくいかなかったので、初期設定の解釈が
ぬけているのかなと思って書きました。
(ちなみに、ハイパーテキストではきちんと応答文字が出てきます。)
include "BASIC"
とか、特別なサブファイルを指定するような設定がありましたので
RS232Cは必要かなと思い、これについて伺おうとしてました。
APIを用いたものはまだ、考えていません。
ヘルプに、なかなか書いていない部分なので、ぜひこの掲示板で伺いたいなと
思いました。(しかし実際掲示板でもなかなか分かる方がいないようです)
> >>インクルードや、初期設定は、どこで調べればよろしいでしょうか?
>
> インクルードって、何をインクルードするのですか?
>
> RS-232CのAPIでしたらMSCのMSDNが良いと思います。
>
> http://msdn.microsoft.com/library/defau ... serial.asp
Rs-232C系のコマンドを使用するには、AB2を使用する必要があります。
http://www.activebasic.com/activebasic2.6/index.html
AB3、AB4ではサポートしていません。(APIが必要です。)
AB2でのRS232C制御(と言うより文字変数の取り扱い)は、いろいろと癖が有ります。
不可能では有りませんが、あまりお勧めしません。(特に送信が必要な時。)
昔の掲示板に対処方法を書き込みをした事がありますが、消えてしまったのかなぁ??
あと、割り込み系のON Com 等は使用できません。
使った事はありませんが、99Basicや98エミュレーター等を検討するか、
前記に、せっかくAPIの書き込みが有るので、APIに挑戦してみては如何でしょう??
http://www.activebasic.com/activebasic2.6/index.html
AB3、AB4ではサポートしていません。(APIが必要です。)
AB2でのRS232C制御(と言うより文字変数の取り扱い)は、いろいろと癖が有ります。
不可能では有りませんが、あまりお勧めしません。(特に送信が必要な時。)
昔の掲示板に対処方法を書き込みをした事がありますが、消えてしまったのかなぁ??
あと、割り込み系のON Com 等は使用できません。
使った事はありませんが、99Basicや98エミュレーター等を検討するか、
前記に、せっかくAPIの書き込みが有るので、APIに挑戦してみては如何でしょう??
すごいですね。
Tako様
> 私が中学の時は、ご指摘の雑誌に付属されていたTiny BASIC(ソノシート)を
> TK-80(コンポBS)に読み込ませBasicを走らせていました。
> その後、PET→APPLE-II →PC-8001って感じです。
TK-80からですか。すごいですね。これってPC8001の元になった基板にテンキーみたいなのと7セグ表示(だったっけ?)だけのPCでしたよね?写真でしかみたことないです。でも今となっては写真でも見たことある人も少ないでしょうね。むちゃくちゃなつかしい!カセットテープに”ピーガー”とプログラムを保存(録音?)していた時代からえらく時代は進んだものです。自分も歳をとるのがわかります。(^^;)
> 私が中学の時は、ご指摘の雑誌に付属されていたTiny BASIC(ソノシート)を
> TK-80(コンポBS)に読み込ませBasicを走らせていました。
> その後、PET→APPLE-II →PC-8001って感じです。
TK-80からですか。すごいですね。これってPC8001の元になった基板にテンキーみたいなのと7セグ表示(だったっけ?)だけのPCでしたよね?写真でしかみたことないです。でも今となっては写真でも見たことある人も少ないでしょうね。むちゃくちゃなつかしい!カセットテープに”ピーガー”とプログラムを保存(録音?)していた時代からえらく時代は進んだものです。自分も歳をとるのがわかります。(^^;)
Takoさんありがとうございます。
私はAB2使いです。
なかなか、APIの領域に入り込めません。
なにから勉強しようかなという感じです。
実は、RS-232Cからのデータを読み込んで、キーボードからの入力と
同じくしようという常駐型のアプリを作ろうと思ってたのですが。
APIがないと、この先ができなそうなことに気付き、これからAPIはじめようと
思います。
ご指導ありがとうございました。
Rs-232C系のコマンドを使用するには、AB2を使用する必要があります。
>
> http://www.activebasic.com/activebasic2.6/index.html
>
> AB3、AB4ではサポートしていません。(APIが必要です。)
> AB2でのRS232C制御(と言うより文字変数の取り扱い)は、いろいろと癖が有ります。
> 不可能では有りませんが、あまりお勧めしません。(特に送信が必要な時。)
> 昔の掲示板に対処方法を書き込みをした事がありますが、消えてしまったのかなぁ??
>
> あと、割り込み系のON Com 等は使用できません。
>
> 使った事はありませんが、99Basicや98エミュレーター等を検討するか、
> 前記に、せっかくAPIの書き込みが有るので、APIに挑戦してみては如何でしょう??
なかなか、APIの領域に入り込めません。
なにから勉強しようかなという感じです。
実は、RS-232Cからのデータを読み込んで、キーボードからの入力と
同じくしようという常駐型のアプリを作ろうと思ってたのですが。
APIがないと、この先ができなそうなことに気付き、これからAPIはじめようと
思います。
ご指導ありがとうございました。
Rs-232C系のコマンドを使用するには、AB2を使用する必要があります。
>
> http://www.activebasic.com/activebasic2.6/index.html
>
> AB3、AB4ではサポートしていません。(APIが必要です。)
> AB2でのRS232C制御(と言うより文字変数の取り扱い)は、いろいろと癖が有ります。
> 不可能では有りませんが、あまりお勧めしません。(特に送信が必要な時。)
> 昔の掲示板に対処方法を書き込みをした事がありますが、消えてしまったのかなぁ??
>
> あと、割り込み系のON Com 等は使用できません。
>
> 使った事はありませんが、99Basicや98エミュレーター等を検討するか、
> 前記に、せっかくAPIの書き込みが有るので、APIに挑戦してみては如何でしょう??
やってみました。
AB初心者です。
簡単なコードでRS232Cでデータを取り込めるとのことで
AB2にて下記コードを入力して、デバッグモードにて実行してみました。
結果、一行目に”型が違います”というエラーが出ました。
何が悪いのか分かりませんので教えてください。
> AB2でしたら、下記のコードで受信しファイル化できます。(試していませんが・・・)
>
> Open COM1 AS #1
> Open RX_File.CSV FOR OUTPUT As #2
> For Rx_Loop=1 To 10
> Line Input #1,Rx$
> Print Rx$
> Print #2,Rx$
> Next
> Close #2
> Close #1
簡単なコードでRS232Cでデータを取り込めるとのことで
AB2にて下記コードを入力して、デバッグモードにて実行してみました。
結果、一行目に”型が違います”というエラーが出ました。
何が悪いのか分かりませんので教えてください。
> AB2でしたら、下記のコードで受信しファイル化できます。(試していませんが・・・)
>
> Open COM1 AS #1
> Open RX_File.CSV FOR OUTPUT As #2
> For Rx_Loop=1 To 10
> Line Input #1,Rx$
> Print Rx$
> Print #2,Rx$
> Next
> Close #2
> Close #1