HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
1122
〆さばUSBシリアル(RS-232C)から信号を受信58解決


〆さば

リンク

2021/11/22(Mon) 22:19:15|NO.94434

現在、ON/OFFの切り替え専用のスイッチを上記のケーブルを使ってパソコンに繋ぎ、スイッチの状態がONであるかOFFであるかの信号を受信したいのですが、
USBの入力デバイスとしてポートは認識されているものの、その後の信号の受信方法がわかりません。
モジュールはhapextを使っていて、一応comstatやcomgetcなどの命令も使いましたが、私自信あまり理解できておらず、結果も値が0から変わりません。
4番ピンと6番ピンのみコードを繋いでいる状態です。
シリアル通信はおろかhspの経験自体浅いですので色々調べてみたところ、どれも私の想像しているものとは違っていてしっくりきませんでした…

そもそもシリアル通信でON/OFFの判断はできないものなのでしょうか。その辺を含めてわかる方、ヒントをくださると嬉しいです。
どうぞよろしくお願いします。



この記事に返信する


zezenana

リンク

2021/11/23(Tue) 09:59:34|NO.94442

〆さば さん

USBシリアルとはCOMポートの無いPCなどで利用するUSB-RS232C変換ケーブルのことでしょうか?
説明されている内容がざっくりしているので私の解釈があっているか分かりませんが幾つかアドバイスさせて頂きます(HSPにあまり関係ありませんが。。)

想定するハード構成について:
[謎のSWデバイス]<--RS232Cケーブル(ここは不明)-->[(COMポート)USB変換ケーブル(USBポート)]<--(ここは認識されている)-->[(USBポート)利用するPC]

事前に確認することについて:
・SWデバイスのD-SUB9pinの信号仕様はあっていますか?(4番と6番と言われてもポート仕様が分かりません。最低限としてRxD、TxD、GND(SG)の3信号は必要)

・SWデバイスとUSB変換ケーブルの接続仕様はあっていますか?(クロス接続、ストレート接続)

・USB変換ケーブルのCOMポート設定はあっていますか?(SWデバイスの通信仕様に合わせる必要があります。ポート番号、転送スピード(bps)、データ数(bit)など)

・古参TeraTermなどのターミナルソフトを使用してSWデバイスとの送受信はできていますか?(SWデバイスの通信仕様がキャラクターデータの送受信方式ならこれで確認できます。バイナリ送受信方式なら他のツールが必要かも。。)

多分上記の確認が全て出来ている状態じゃないと通信の問題かスクリプトの問題かを切り分けることは出来ないと思います。
ちなみにHSP付属のサンプルは sample\hspext\terminal.hsp があります。



zezenana

リンク

2021/11/23(Tue) 11:05:07|NO.94444

〆さば さん

踏み込んだ話かつ初歩的すぎて聞いていいか悩みましたが、

・USB-RS232C変換ケーブルは一般的に市販されているのものでしょうか?

・「ON/OFFの切り替え専用のスイッチ」と呼んでいる謎のRS232C「SWデバイス」は一般的に市販されているのものでしょうか?

・その「SWデバイス」は電源供給(電池やACアダプタなどで)されていますか?(一般的なUSB-RS232C変換ケーブルには電源供給の機能はありません)

ここが明らかにならないと、前述したアドバイスそのものが無意味になってしまうので確認させて頂きました。



うよ

リンク

2021/11/23(Tue) 11:26:30|NO.94445

市販されており、電源供給はされていません。
ただのスイッチなので画面とかもついてないです。
なのでarduinoなどとの関連性が分からず、プログラムを書けていない状態です…



zezenana

リンク

2021/11/23(Tue) 12:05:02|NO.94446

うよ さん

返信コメントありがとうございます。
〆さば さんと同一の方でしょうか?それともご家族の方でしょうか?

何に対しての返信コメントなのかすごく分りにくいのですが、
「市販されてる電源供給されていないただのスイッチ」とは、
まさか1個数十円から百数円で購入できるスイッチのことでしょうか?
メーカーと製品の型番教えてもらってもよろしいですか?

「Arduino」のキーワードからすると、パソコンとUSB変換ケーブルのRS232Cで接続するのはArduinoワンボードマイコンでしょうか?

だとすると想定するハード構成は以下になりますが正しいですか?

[ON/OFFスイッチ]<---->[(I/Oポート)Arduino(COMポート)]<--RS232Cケーブル-->[(COMポート)USB変換ケーブル(USBポート)]<---->[(USBポート)利用するPC]

以下間違っていたら聞き流してもらって構いませんが、
まさかON/OFFスイッチを直接USBシリアル変換ケーブルの信号ピンに繋いでいるなんてことはないですよね。。だとすればHSP云々というより電子回路について覚える必要がありそうですが。。



うよ

リンク

2021/11/23(Tue) 13:09:39|NO.94447

失礼しました。名前変えてしまっていましたね。
Arduinoをなぜ出したかというと、シリアル通信のために拡張入出力制御命令を使う際にこれを使う必要があるのかなと思って名前を出しただけで、
スイッチは直接ケーブルに繋いでいます。
型番については詳しくは不明ですが、スイッチを押すと回路が繋がる(はず)ので、何らかの信号が発せられるのかなと思っていて…



うよ

リンク

2021/11/23(Tue) 13:28:13|NO.94448

まず何から勉強した方が良さそうですか…



usagi

リンク

2021/11/23(Tue) 14:25:16|NO.94449

こんにちわ。
まずWindowsのデバイスマネージャーを開いた状態でUSBシリアルを挿してみては如何でしょうか。

正しく認識していればCOMとしてリストアップされると思います。
ドライバなど何か接続に不具合があれば?とアイコンが追加されるはずです。

COMとして認識されていればプログラムの方に問題があるのかと思われます。
(ポートとか速度とか)

COMとして認識できなければ、それはもう電気が流れるだけのただのスイッチかも。。。

ハード触り出すとソフトだけでは分からないところもあると思うので、
入力から出力側へとひとつひとつ確認していった方が問題点の把握がしやすいと思います。

あと、マイコンとか始められる場合は型番はメモしておくと良いですよ。
(問題解決に情報が必要になってくるので)



うよ

リンク

2021/11/23(Tue) 14:50:49|NO.94451

usagiさま
USB入力デバイスとして、Prolific USB-to Serial Comm Port (COM3)
としては認識されているようです。
型番について調べてみたところ、パナソニックの押しボタン WS3400Kのようです。



zezenana

リンク

2021/11/23(Tue) 16:01:03|NO.94452

うよ さん

まさかとは思っていましたが、ここまで来るともはやRS-232Cは関係無いみたいです。。

以下、説明させて頂きます。

あなたが現在行っていることは、例えるなら小3理科で習う豆電球に明かりをつける内容で、電池の代わりにスイッチを取り付けたけど、光らないのですが教えて下さいと言っているようなものです。

もちろん電池がなければ電球は光ることはありません。そこで電池の代わりにUSBシリアル変換ケーブルから信号(電力)を送信(出力)してもらう必要があります。

RS-232Cにはループバックという信号処理があります。
これは自分で送信した信号を自分で受信するというものです。

この送受信の信号線にスイッチを介入させることで自分で出した信号を通過させること(ON)や遮断すること(OFF)が出来ます。

RS-232Cの出力信号はデータ線を除くとDTRとRTSがあります。
RS-232Cの入力信号はデータ線を除くとCTSとDSRとRLSD(CD)があります。
各信号の場所はUSBシリアル変換ケーブルの説明書を調べて、その場所にスイッチを繋いでください。

それらをスクリプトで実現するには「自分で出力信号を送信すること」「その出力信号を入力受信すること」となります。

COMポート番号があっていることが前提条件です。COM3なら comopenで指定してください。データ通信を行わないのでその他の設定は適当でも良いと思います。

HSPのシリアルポート制御には信号出力の comcontrolと信号入力の comstatがありますので、これをスイッチ状態の取得に利用してください(機能についてはHSPヘルプを参照)

>パナソニックの押しボタン WS3400Kのようです。

これって電子スイッチじゃなくて普通にドアベルとかで使うようなボタンですよね。。これだとボタン規格や接続ケーブル規格などによって信号が弱くなったりチャタリングが発生しないか不安ですが、まあいい勉強になるので試してみたらどうでしょう(私は一切保証もしませんし責任も持ちませんが。。)

余談ですが、ON/OFFだけならUSBゲームパッドを買ってきて分解して、どこかのボタンの信号線に繋ぐという方法もあります。パッドのボタンを変えるだけなので動作するはずです(まあ上記のボタンの規格問題は解消されませんが)



うよ

リンク

2021/11/23(Tue) 16:20:49|NO.94453

zezenanaさま
comopenまでの構文は出来上がっていますが、comstatの値がすべて0となっており、信号が受信できていないものと思われます。
ON/OFFの切り替えをした時に信号が送られてくるようにしたいと思って質問させていただきました。
今まで具体性がなく申し訳ありません。



usagi

リンク

2021/11/23(Tue) 16:23:31|NO.94454

詳細はzezenanaさんが詳しく教えて下さってますので、私からは基本的な部分として

おそらく型番を見るに、通常のswitchなので

・Prolific USB-to Serial Comm Port (COM3)
から
・何かのマイコンの4,6番ピン

・パナソニックのスイッチ
が繋がってるのかと思います。

まずは、"何か"の部分が分かればもう少し状況がわかるかもです。
また、スイッチを繋ぐときは4番ピンを入力にするならもう片方は
VCC(+電源)かGnd(-グランド)に繋がないと電気が流れません。

多分、VCCに繋げばスイッチを押すと4番ピンに電気が流れますので、
"何か"側で検してcom通信するプログラムが必要な気がしてます。



うよ

リンク

2021/11/23(Tue) 17:37:36|NO.94455

usagiさま
スイッチとケーブルは直接半田付けして接続させています。



usagi

リンク

2021/11/23(Tue) 17:42:30|NO.94456

ケーブル(銅線かなにか?)はスイッチから
おそらく、2本半田付けしてると思われるのですが、
何に繋がってますか?



うよ

リンク

2021/11/23(Tue) 18:22:29|NO.94457

usagiさま
RS-232Cの4番ピン・6番ピンとスイッチを導線で直接です。



うよ

リンク

2021/11/23(Tue) 18:23:11|NO.94458

その状態で信号を送受信したいと思っているのですが…



usagi

リンク

2021/11/23(Tue) 18:55:08|NO.94459

直接RS-232Cのメス側に繋いでいるってことですね。

それではシリアル通信は出来ませんので、
HSPの問題と言うより、ハード的な設計で出来ないと回答します。

シリアル通信がとういったものなのか一度調べてみるとよいと思います。



うよ

リンク

2021/11/23(Tue) 19:15:38|NO.94462

usagiさま
では、使用材料を変えずにDSR信号・DTR信号をHSPで取得する他の方法等はあるのでしょうか。
初歩的な質問ですみません。



usagi

リンク

2021/11/23(Tue) 19:38:14|NO.94464

仕様材料を変えないと出来ないですね。
まずはシリアル通信をする必要があるので、
そのスイッチではシリアル通信の企画の信号を送ることは難しいです。



zezenana

リンク

2021/11/23(Tue) 20:47:21|NO.94471

うよ さん

すみません、情報が毎回小出しなので少し困っています。
回答者のために出来る限り詳細な情報を提供して下さい。

現状ではUSBシリアル変換ケーブルのメーカー名と製品型番、オンラインマニュアルなどの情報が無いと説明が出来ないと感じています。

以下に動作確認方法を記載します。
環境がないのですべて自分の想定で書かせて頂きます。

・まず、RS-232CのD-SUB9pinが以下であることが前提条件です。オスコネクタとメスコネクタでは配置が逆になることは必ず確認して下さい。

ピン1 DCD(ピン5の逆位置)
ピン2 RxD(ピン4の逆位置)
ピン4 DTR
ピン5 GND(SG)
ピン6 DSR
ピン9 RI (ピン6の逆位置)

・USBシリアル変換ケーブルをPCに接続するだけにしてスイッチは接続しないで下さい。デバイスマネージャーなどでCOMポートとして認識されていることを確認して下さい。

・テスターを準備して下さい(ググれば写真が出てきます。所有していることが前提です)これで DTR(+)とGND(-)のDC-VOLTを確認します。現時点では0Vが計測されると思われます。

・私が記載した「自分で出力信号を送信すること」をスクリプトにて行って下さい。具体的にはHSPシリアル制御 comcontrolにてDTRを送信して下さい。これによってUSBシリアル変換ケーブルから電気信号が出力されると予想されます。

・テスターにて DTR(+)とGND(-)のDC-VOLTを確認します。正常に信号が出力されていれば+2〜5Vに近い値が計測されると思われます。0Vであればピンの場所に問題があるかUSBシリアル変換ケーブルに問題があるかスクリプトに問題があります。

ここまで確認できれば、その+2〜5Vを DSRに入力させればよいのでDTRとDSRをジャンパー線などで接続して comstatのDSR状態の変化を確認してください。



usagi

リンク

2021/11/23(Tue) 22:30:57|NO.94473

>zezenanaさん
なるほど、comcontrolでDTR信号を送信して(ピットを立てて電機流す)
そのままスイッチ経由して、押していれば、DSRに信号が流れますので装置の接続確認ができる。
これをループで検知してスイッチのON,OFF判定に利用するということですね。

これなら、送受信(シリアル通信でのデータ通信)とは違いますが、
うよさんの目的のスイッチを押しているかの判定は出来そうです。
今回のうよさんからの条件であれば私も賛成です。

指摘されていたチャタリングはHSPのawait等でループで判断するなら気にならないかもですね。
(ホントはコンデンサを並列につなぎたい。。。)

RS-232Cのピンに直半田とは思わなかったので、私も混乱してしまいましたが解決が見えてきた気がします。

>うよさん
方法が無いと答えてしまいましたが、zenzennanaさんが仰られている方法が、現状では早そうかと思います。
ハードウエアを使うならテスタやオシロ(はじめは安っすいので良いです)は必要になってきますので、
これを機会に検討して、信号確認に使うと良いと思います。
(デバックで1日、時間かかるくらいなら、3000円くらいの買ってしまった方が時給で考えてもお得ですよ)

火事だけは気を付けてくださいね。(私もショートさせて火傷したり、何回も失敗やらかしてますので)
これにて失礼いたします。



zezenana

リンク

2021/11/24(Wed) 08:30:52|NO.94479

■usagi さん

若干、独り言のような感じになっていたので、ご理解いただけたようで助かります。
やっていることはシリアルデータ通信を全く無視した入出力ポートの処理だけです。通常はこんなに贅沢なハードの使い方はしませんが、スイッチ1つだけですしアイデア活用というところですね。

パナのスイッチへの信号対策は本来したいですが、まずは今やっている電気的なことが本当に正しいのかに焦点を合わせた感じです。
そいや簡易デジタルオシロって調べてみたらだいぶ安くなっているのですね。。

■うよ さん

前述の動作確認方法はだいぶ初心者向けに書いたつもりですが、ある程度の知識がないと解りにくいかもしれません。
やっていることは単純なことですのでまずは1つ1つ確認してみて下さい。テスターが無ければホムセンやネットで簡易的なものが安く入手できると思います。

ちなみに最初から持っている疑問なのですが、USBシリアルの4番ピンと6番ピンにスイッチを繋ぐとON/OFFの判断が実現できるという情報はどこから得たものでしょうか?



うよ

リンク

2021/11/24(Wed) 17:34:08|NO.94487

zezenanaさま
4番6番ピンでのオンオフ検出については、私の知人が実際にやっていた方法で、
どのようにプログラムを開発したのかはわからない状態で…
使用している言語がhspではないと思われ、私が個人的に取り組んでいる途中なものです…
(ボタンを押した際にボタン側で4番に繋いだ銅線と6番に繋いだ銅線が接触してDSR信号が送られる?)

そして上記にあるcomstatについてですが、使用方法がよくわからず、うまく検出できないので添削をお願いしますm(_ _)m


#include “hspext.as” onexit *exit comopen 3, “” if stat=1 : dialog “Port error” : end *main gosub *rs232c await 100 goto *main *rs232c comcontrol 5 //(ここまで理解できています) comstat a //(ここから先の書き方・DSR信号の受信方法がわからないです) title “”+a return *exit comclose end

ここまで色々と助言をいただいてありがとうございます。
もう少しまともに会話できるよう引き続きhsp頑張ります…



usagi

リンク

2021/11/24(Wed) 19:17:36|NO.94491

(失礼しますと言いながら)乗り掛かった船で。。。
comstatのマニュアルは”配列で情報が代入されます”とありますので、


title ""+a.1

ではないですかね。(何か値が変化しませんか?)

※もし配列が分からなければHSPのリファレンスマニュアルで配列と検索すると良いと思います。



うよ

リンク

2021/11/24(Wed) 20:55:42|NO.94493

zezenanaさま
お返事ありがとうございます。
あいにくテスターを持っていないのですが、知人の持っている別のソフトでは読み込み・反応がありました。
そのため、スイッチ側に問題はないようですが、私のスクリプトではまだまだですね…
なおそのソフトのコードが私にもわからなくて…(そもそもhspではなさそう?)
申し訳ないです…

usagiさま
お返事ありがとうございます。
おかげさまでcomstatまでの読み込みはできましたが、肝心の値に変化が見られないです…
何が原因なのかわからなくなってきました💦
(諦めた方がいいのかな( ´△`))

何度も手間をかけてしまってすみません…



うよ

リンク

2021/11/24(Wed) 21:46:01|NO.94494

追加で報告です。
スイッチをパソコンに繋いで何も操作せずにコンパイル・実行すると、
初めはタイトルはhspのままで、スイッチを押したらタイトルが0に変わりました!
ただ、その後はスイッチを離しても信号は変わらないままです…
(少し進歩しましたね笑)



zezenana

リンク

2021/11/24(Wed) 22:03:32|NO.94495

うよ さん

ピン配線は知人の方の方法を利用されたとのことで理解しました。ハードに精通されている方かもしれませんね。

知人のソフトで動作してこちらでは変化が見られないとのことで、少し深く調べてみました。

どうやら、COMポートの初期設定が「DSR信号を使用しない」となっているようでして、この状態だとDSRに信号が送信されても変化しないみたいです。

ですので comopenの設定値が未設定("")では動かないようです。。すみません。

comopenの設定を("odsr=on")にしてみて下さい。
これでDSR信号を使用出来るようになると思われます。

ちなみにDTR信号の初期値も設定できるようですので
("dtr=on odsr=on")でも良いかもしれません。

環境がないので、あくまで想定なのが申し訳ないのですが
ご確認のほどよろしくお願いします。



うよ

リンク

2021/11/24(Wed) 22:43:09|NO.94497

zezenanaさま
わざわざ調べていただきありがとうございますm(_ _)m
そこで以下のようにスクリプトを変えてみました。


#include “hspext.as” onexit *exit comopen 3, “dtr=on odsr=on” if stat=1 : dialog “Port error” : end *main gosub *rs232c await 100 goto *main *rs232c comcontrol 5 dim a, 4 comstat a title “”+a.1 return *exit comclose end

これでやってみたところ、スイッチを押している・いないに関わらずタイトルの数字は2に変化しました!
この2について調べてみたら、DTR信号のデフォルト値のようです。
そして、スイッチとパソコンを繋いで一回でもスイッチを押したらその後はずっと2のまま変化がない状態です。
そこで、スイッチが離れた時(押されていない時)を検出すれば実質スイッチのオンオフ検出ができる気がするのですが、
ここまでの考え方に間違いはないでしょうか…??



zezenana

リンク

2021/11/24(Wed) 23:12:09|NO.94498

うよ さん

進展があったみたいで何よりです。

2になるのはDSR信号が「アクティブLOW」なのかもしれません。つまり押すと0になるとか。

では、"dtr=on"を外すか "dtr=off"ではどうでしょうか?

comcontrol 5 を外してみてはどうでしょうか?



うよ

リンク

2021/11/25(Thu) 00:02:02|NO.94500

zezenanaさま
どちらも2から変わらずです…
こちらでももう少し試してみますのでいい案ありましたら返信くださると嬉しいです。
よろしくお願いします。



うよ

リンク

2021/11/25(Thu) 01:02:21|NO.94501

失礼しました。一応報告です。
その後comcontrolやodsrを消すなどいくらやっても変わらなかったので疑問に思って調べ直したら、2について誤認識していたようで、RLSD信号待ちとのようです…
ただもちろん1番ピンには繋いでいないため、こちらの信号は関係ないですがね…

そこで、DSR信号を受信できていることを示すコードを考えてみます。



usagi

リンク

2021/11/25(Thu) 02:23:12|NO.94503

comopen のプロトコル指定文字列の説明はこちら。
ちょっとこれを元に色々設定してみてもらえれば。。。
https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/mode



zezenana

リンク

2021/11/25(Thu) 08:09:22|NO.94505

うよ さん

色々と試行錯誤されているみたいですね。。

現在悩んでいる状況ってテスターがあればものの数分で解決しそうなのですが、
パナのスイッチをどのピンに接続しているか?はんだ付け状況は?という本人にしかわからない「不確定要素」がある限り、こちらではどのような状況になっているか判断できません(撮影画像でもあれば分かりやすんですけどね。。)

とりあえず、書き込まれた情報について解いていきます。

・a.1の戻り値について
comstatのHSPヘルプを見る限り 2は bit1なので("odsr=on")による ON(=2)の場合は DSR待ち状態となっているので正しいです。

試しに("odsr=on octs=on")とすることでbit0とbit1で 3になると思います(追加でDSR/CTS待ち状態となる)

※bit1と書いているのは2進数のことなので10進数にすると ONで2となります。bit0は ONで 1となります。これらを足すと 3になります。

本来このDSR信号線にDTR信号の送信(comcontrol 5)によって+2〜5Vの電気信号が入力されれば待ち状態が解除される(OFF=0)はずなのですが、電気的な問題なのかスクリプトの問題なのか切り分けて判断することができません。

試しにピン4(DTR)とピン6(DSR)を半田もしくは導線(ジャンパー線)で直接繋いでもらえませんでしょうか?そうすることで少なくとも不確定要素が消えると思います。

それとDTR信号をボタンでON/OFF出来るようにしてみてはどうでしょうか(以下修正分)


;---[onexit *exit]の次に追加 button gosub "DTR=x",*onoff_dtr:idbtn=stat ;---[*rs232c]直下の comcontrol 5 をコメントアウト ;comcontrol 5 ;---最下段に追加 *onoff_dtr if(dtron):comcontrol 6:dtron=0:else:comcontrol 5:dtron=1 objprm idbtn,"DTR="+dtron return

ピンを直接繋いでいれば、ボタンを押すごとに送信した DTR信号によって 2と 0の変化があると思われます。



usagi

リンク

2021/11/25(Thu) 16:54:53|NO.94507

手元にUSBシリアル(型番:FT232RL)があったので、試してみたのですがcomstatだとダメですね。

実験として、電気的な問題か配線か分からないので、試しに以下実行すると
16(CTS)とか32(DSR)とか値が変わりませんか?
私の環境ではスイッチ検知できます。


#include "kernel32.as" #module #define NULL 0 #define OPEN_EXISTING 3 #define GENERIC_READ 0x80000000 #define GENERIC_WRITE 0x40000000 #define FILE_ATTRIBUTE_NORMAL 0x00000080 #define INVALID_HANDLE_VALUE 0xffffffff #define MAXDWORD 0xffffffff #define SETDTR 5 #define CLRDTR 6 #define global comopen(%1, %2="") comopen_ %1, %2 #deffunc comopen_ int _port, str _proto if _port > 0 { path = "\\\\.\\COM" + _port } else { path = "LPT1" } CreateFileA path, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL comHandle = stat if comHandle == INVALID_HANDLE_VALUE : return -1 dim dcb, 7 GetCommState comHandle, varptr(dcb) if stat == 0 : return -1 if strlen(_proto) > 0 { BuildCommDCB _proto, varptr(dcb) if stat == 0 : return 3 } ;dcb.2 |= 0b11101;念の為動かないらこれをいれる SetCommState comHandle, varptr(dcb) if stat == 0 : return -1 dim timeouts, 5 timeouts(0) = MAXDWORD SetCommTimeouts comHandle, varptr(timeouts) EscapeCommFunction comHandle, SETDTR return 0 #deffunc comclose onexit EscapeCommFunction comHandle, CLRDTR CloseHandle comHandle comHandle = NULL return #deffunc commodemstat GetCommModemStatus comHandle, varptr(modemstat) return modemstat #global // ここからテスト ---------- comopen 3, "dtr=on odsr=on octs=on"//念のためCTSも if stat : dialog "シリアルポートは使えません" : end *main commodemstat title ""+stat await 100 goto *main



うよ

リンク

2021/11/25(Thu) 17:24:42|NO.94508

zezenanaさまのスクリプトを試していたときにちょうどusagiさまのコードも…
ありがたい限りです。

zezenanaさま
返信遅くなりまして申し訳ないです。
ボタンでDTRのオンオフを切り替えるのはとてもいいなと思って4番ピン・6番ピンを直接繋いでやってみたのですが、タイトルはずっと3のままでした…

usagiさま
午前3時ごろにお返事をいただいていたようですが、新しいスクリプトありがとうございます。
外出中で環境がなく最初のスクリプトは実行できていないですが、今さっき送っていただいたものを試してみたところ、
スイッチを接続してすぐのタイトルがhspのものから信号の値に変わる前にスイッチを押した場合に一瞬だけ32が表示されました!
スイッチを押さずに放置しておくと32にはならずに0に変わりました。

(私モジュールの読み方がいまいちわからないのでこの一瞬の32がなぜ表示されているのかさっぱりです…苦笑)

お二方本当にお付き合いいただいてありがとうございます😭



うよ

リンク

2021/11/25(Thu) 17:30:47|NO.94509

連投失礼します。
usagiさまのスクリプトについてまとめてみると、
・スイッチをパソコンに繋いで、読み込み?が終わる前(タイトルがhspから数字に変わる前)にスイッチを押すと一瞬だけ32表示
・スイッチを繋いだままスイッチを触らなかった場合は読み込み?が終わると0に変化
・それ以降はスイッチを押しても押さなくても0表示

このような感じです。よろしくお願いします……



usagi

リンク

2021/11/25(Thu) 18:24:06|NO.94510

>うよさん
すみません。夜中に送ったスクリプトはコピペミスでエラー出てたので修正しました。


今回の意図としては、配線や電圧が正しいか見たかったもので、
私の環境ではスイッチで電圧下がると動作しなかったです。(3Vくらいで試したかも)

動作したとの事で、うよさんのスイッチは正しく4番6番ピンに接続され、
スイッチでの電気的な影響もなかったのかと想定してます。

ただ、以下がまだ状況が分からないですねぇ。。。


>・スイッチをパソコンに繋いで、読み込み?
私の環境だとすぐ動作しますので、メインループですぐにタイトルが書き換えられて'0'になりますね。
これは、うよさんの環境の問題なのかと思います。


>スイッチを繋いだままスイッチを触らなかった場合は読み込み?が終わると0に変化
上記、同様で実行に時間がかかっているのかもしれません。


>それ以降はスイッチを押しても押さなくても0表示
想定と違いますね。こちらでは

押してない=電気流れていない=0
押している=電気流れていいる=32

です。
秒間5回とか連打しても0,32,0,32,0,32...と変わってます。


>(私モジュールの読み方がいまいちわからないのでこの一瞬の32がなぜ表示されているのかさっぱりです…苦笑)
あくまで環境を見たかったので、モジュールは無視して頂いて大丈夫かと思います。
※ご興味があればいろいろ試してみてもらえらば。

32はマイクロソフトが決めた値なので、そういうルールと思ってもらえればと思います。
※DSRに電気が流れている場合GetCommModemStatusの値が32になるというもの

>スイッチを接続してすぐのタイトルがhspの
USBにスイッチを接続した状態で、実行してもダメですか?
接続が正しい状態でプログラムを実行する必要がありますので。



うよ

リンク

2021/11/25(Thu) 19:07:48|NO.94511

文章が分かりにくくてすみません💦
それでも理解していただけたようで何よりです。

こちらでも少し勉強してモジュールの解析して実験してみますね。
(いい案があったら是非教えてください笑)



うよ

リンク

2021/11/25(Thu) 19:35:07|NO.94513

念のためそのスクリプトを知人に送ってみたらその知人は正しい反応のようでした。
(私と知人のUSBシリアルの型番が違うのかもしれませんが…)

なのでusagiさまのスクリプトではなく私の環境に問題があるようですね…

私の方でも動作したら解決ということで改めて報告させていただきますね!



usagi

リンク

2021/11/25(Thu) 20:29:09|NO.94516

使っているUSBシリアルが分からないので、
一応、サポートしている機能は以下コピペで確認できます。

>#globalの上に

#deffunc comdebagprint color 255,255,255:boxf:color pos 0,0 mes "■シリアルポートの状態" mes "レート: "+dcb(1);BaudRate mes "バイナリ :"+(dcb(2)>>0&1);fBinary mes "パリティ :"+(dcb(2)>>1&1);fParity mes "CTS監視  :"+(dcb(2)>>2&1);fOutxCtsFlow mes "DSR監視  :"+(dcb(2)>>3&1);fOutxDsrFlow mes "DTR制御  :"+(dcb(2)>>4&3);fDtrControl mes "DSR感度  :"+(dcb(2)>>6&1);fDsrSensitivity mes "fTXContinueOnXoff:"+(dcb(2)>>7&1) mes "fOutX   :"+(dcb(2)>>8&1) mes "fInX   :"+(dcb(2)>>9&1) mes "fErrorChar:"+(dcb(2)>>10&1) mes "fNull   :"+(dcb(2)>>11&1) mes "RTS制御  :"+(dcb(2)>>12&3);fRtsControl mes "fAbortOnError:"+(dcb(2)>>14&1) mes "XonLim  :"+(dcb(3)>>16&0xFFFF) mes "XoffLim :"+(dcb(4)&0xFFFF) mes "ByteSize :"+(dcb(4)>>16&0xFF) mes "Parity  :"+(dcb(4)>>24&0xFF) mes "StopBits :"+(dcb(5)>> 0&0xFF) mes "XonChar :"+(dcb(5)>> 8&0xFF) mes "XoffChar :"+(dcb(5)>>16&0xFF) mes "ErrorChar:"+(dcb(5)>>24&0xFF) mes "EofChar :"+(dcb(6)>> 0&0xFF) mes "EvtChar :"+(dcb(6)>> 8&0xFF) pos 300,0 dim commprop, 14 GetCommProperties comHandle, varptr(commprop) mes "■シリアルポートのプロパティ" mes "サービス: "+commprop(1) mes "最大送信バッファサイズ: "+commprop(3) mes "最大受信バッファサイズ: "+commprop(4) mes "最大通信速度: "+commprop(5) mes "デバイスの種類: "+commprop(6) mes "設定可能パラメータ: "+commprop(8) mes "設定可能最大通信速度: "+commprop(9) mes "設定可能データサイズ: "+(commprop(10)&0xFFFF) mes "設定可能ストップビット&パリティ: "+(commprop(10)>>16&0xFFFF) mes "送信バッファサイズ: "+commprop(11) mes "受信バッファサイズ: "+commprop(12) mes "■サポートされている機能" mes "DTR/DSR機能: "+(commprop(7)>>0&1) mes "RTS/CTS機能: "+(commprop(7)>>1&1) mes "CD機能: "+(commprop(7)>>2&1) mes "パリティチェック: "+(commprop(7)>>3&1) mes "XON/XOFFのフロー制御: "+(commprop(7)>>4&1) mes "XON/XOFF機能の設定: "+(commprop(7)>>5&1) mes "経過時間のタイムアウト: "+(commprop(7)>>6&1) mes "インターバルタイムアウト: "+(commprop(7)>>7&1) mes "特殊文字: "+(commprop(7)>>8&1) mes "16ビットのデータモード: "+(commprop(7)>>9&1) return
>title ""+stat の下に

comdebagprint



うよ

リンク

2021/11/25(Thu) 22:31:57|NO.94518

何度も失礼します…
DSR感度の部分が0ですね…

知人にも送ったところ、知人の場合はタイトルが32から変化しなくなったようで……

(理解が追いつきません💦)

写真が送れればいいのですが…気になる数値があれば教えてください。



zezenana

リンク

2021/11/25(Thu) 22:34:32|NO.94519

■うよ さん

テストコードは usagiさんのもので良いと思います。これだと comopenの 設定なし("")でも動作しそうですね。

また文章の読み解きしか出来なくてすみません。

-----
・直接配線によるスクリプト修正版での確認

>4番ピン・6番ピンを直接繋いでやってみたのですが、タイトルはずっと3のままでした…

修正スクリプト画面上のDTRボタンを何回かクリックして[DTR=0]や[DTR=1]に変化させても 3のままだったとすると、電気的に6番ピンに信号が来ていない気がします(ピン配線もしくはUSBシリアルの問題?)
usagi さんのスクリプトにDTRボタンを追加修正して上記の確認をしてみるのも良いかもしれません。

-----
・usagi さんのスクリプトでの確認

>・スイッチをパソコンに繋いで、読み込み?が終わる前(タイトルがhspから数字に変わる前)にスイッチを押すと一瞬だけ32表示
>・スイッチを繋いだままスイッチを触らなかった場合は読み込み?が終わると0に変化
>・それ以降はスイッチを押しても押さなくても0表示

この動作確認方法については usagiさんも指摘の通り、自分の想定とも異なっていると感じています。

・「タイトルがhspから数字に変わる」近年のPCスペックならスクリプト実行直後にタイトルが書き換えられて「Hot Soup Processor ver.3.6」の表示を見ることは出来ない。

・「スイッチを押すと一瞬だけ32表示」6番ピンに電圧がかかった瞬間以降は他の負荷に信号が吸われている可能性(USBシリアルの問題?)

・「それ以降はスイッチを押しても押さなくても0表示」これも上記の他の負荷の可能性(スイッチ自体の負荷もしくはUSBシリアルの問題?)

以下について差し支えなければ教えてもらえますか?
・使用しているUSBシリアルのメーカー名と型番(Prolific社のチップを使っていることまではわかります)
・使用しているPCのスペックとWindowsのバージョン
・使用しているHSPのバージョン

知人のソフトで今試しているUSBシリアルとスイッチが動作しているとのことでしたが、それは同じPCで動作するWindowsのソフトでしょうか?

■usagi さん

FT232RL調べてみたら随分とマニアックなUSBシリアルデバイスですね。。
comstat(中身はClearCommError)では動きませんでしたか。。まあ今回の目的としては GetCommModemStatusを使うのが適切ですね。



zezenana

リンク

2021/11/25(Thu) 22:58:28|NO.94520

うよ さん

>DSR感度の部分が0ですね…

usagi さんが現状動作すると言っていたので関係ないとは思いますが、気になるのであれば comopenの設定に("idsr=on")を追加して下さい。



うよ

リンク

2021/11/25(Thu) 23:06:42|NO.94521

zezenanaさま
使用しているものは
E101344 STYLE 2725 VW-1 80℃ 30V SPACE SHUTTLE-C
Windows 10 / Intel Core i7-4712MQ CPU / 8.00GB
HSP: ver3.6
です。



うよ

リンク

2021/11/25(Thu) 23:09:30|NO.94522

idsr=onを追加したところ、DSR感度は1に変わりましたがタイトルは0ですね…
色々すみません…



usagi

リンク

2021/11/25(Thu) 23:29:18|NO.94523

>うよさん
32から変化しないという事は、電気が流れ続けているという事なので、
ハードの問題かなぁと思うのですが、実はラッチスイッチだったりしますかね?
あとは、自前なので、半田が甘かったり、別の端子に触れてしまっていたりして、
思っている電気の流れと違うのかもです。

無いとは思うのですが、何かしらの状況で実行速度が遅すぎるとかですかね。
(タイトルが変わるまで時間がかかるようなので)

DSR感度は0でも動作してますね。
DSR監視、DTR制御、DTR/DSR機能の値がどうなのかは気になってます。
(おそらく1にはなっていると思います)

>zezenanaさん
ホントは comstat で出来たら良かったのですが、
dllのソースちゃんと見てないので憶測ですが何か問題あるのかなぁと思って、
仰るとおり今回は GetCommModemStatus が適切かと思い使ってみました。

PCのUSB->USBシリアル->DTR,DSR端子にタクトスイッチで問題なく動いてました。

たぶん、ハード的な部分に相違があって、動いているプログラムと言うのは、
別の方法をとっているのでは?とも思ってます。



うよ

リンク

2021/11/25(Thu) 23:43:19|NO.94524

usagiさま
私の場合は0から変化せず、知人の場合は32から変化しないようです。
DSR監視、DTR制御、DTR/DSR機能はすべて1です。



usagi

リンク

2021/11/26(Fri) 00:07:57|NO.94525

あら、なかなかカオスな状況ですね。。。
同じスクリプトで結果が違うという事は、やはりハードの部分なんでしょうね。。。

1との事で機能的には問題なさそうなので、テスタがあれば
>私の場合は0から変化せず
1)DTRから電気が流れ出ているか?
2)スイッチを押すとDSRに電気がながれているか?

>知人の場合は32から変化しないようです。
3)スイッチを外すと0になるか?
 ※ならなければDTR/DSRがつながってしまってる。

ですかねぇ。
(テスタがなければ、あればLEDつないでみて光るかでもいいかもしれません。)



zezenana

リンク

2021/11/26(Fri) 00:27:50|NO.94526

うよ さん

ご回答ありがとうございます。

>Windows 10 / Intel Core i7-4712MQ CPU / 8.00GB
>HSP: ver3.6

HSPも最新ですし通常のスペックです(i7モバイルCPU)
これでスクリプトの実行遅延が起きているのは少し気になります。

>E101344 STYLE 2725 VW-1 80℃ 30V SPACE SHUTTLE-C

検索したところ普通の中継USBケーブルなのですが、
これと接続されているUSBシリアル本体はどのような型番でしょうか?

ちなみにスイッチの接続はUSBシリアル本体に直付けではなく
D-SUB9pinのオスコネクタにハンダ付けしているのですよね?

usagi さん

リビジョンが古いかもしれませんが、hspextのCOM部ソースです。
http://dev.onionsoft.net/trac/openhsp/browser/trunk/plugins/win32/Hspext/comport.cpp

スイッチWS3400WKは常開型です。AC規格のボタンなのが少々不安ですが。
https://www2.panasonic.biz/scdw/a2A/Viewer?URL_SITEI=%2Fideacontout%2F2017%2F06%2F20%2F2017062000220087.PDF



うよ

リンク

2021/11/26(Fri) 00:37:00|NO.94527

zezenanaさま
先ほどあげたケーブルがUSBシリアルの本体のようで、おっしゃる通り直ではなくオスコネクタに半田付けしています。

usagiさま
本日時間の都合が付く見込みがないので、夜になるかもしれませんが試すことができれば試してみますね。。
(もしかしたら知人と同じケーブルをゲットできるかもしれないのでその場合はそちらで繋いで先ほどのスクリプトで実験してみます。)



zezenana

リンク

2021/11/26(Fri) 07:36:10|NO.94530

うよ さん

>先ほどあげたケーブルがUSBシリアルの本体のようで

見る人が見ればすぐ分かるのですが、これはUSBケーブルの中に入っている電線の規格品質の名称です。大体の複線式ケーブルには書かれています。

>E101344 STYLE 2725 VW-1 80℃ 30V SPACE SHUTTLE-C
たぶんUSBやLANやモニターなどで利用する汎用の電線名のことで
「VW-1 80℃ 30V」は難燃性の規格、30Vの電圧で80度まで使えること、
「SPACE SHUTTLE-C」は台湾の電線メーカーのケーブルの意味です。
http://www.spaces.com.tw/

USBシリアル本体名がわからないということは、購入は中華製か何かの無名品ですか?
レシートやパッケージ、デバイスマネージャーで製品名が見つかりませんか?
Google画像検索で「prolific usb serial」としてみて同じ見た目のUSBシリアルが出たらそれを教えて頂けませんでしょうか?(多分ヒントくらいにはなるかも)

ここまで来るとそちらで接続やハードを確認してもらうしか方法が無いかもです。。

>usagi さんの書き込みNO.94525
>(テスタがなければ、あればLEDつないでみて光るかでもいいかもしれません。)
テスターが入手できない事情(店舗がないなど土地的・移動手段・金銭面?)がわかりませんが、usagi さんが言っている LEDをつないで光るかの確認しかないかもです。
ある程度の工作スキルがあれば 100均とかで売っている単4電池3本くらい(1.5Vx3本=4.5V、電池1-2本のものは多分アウト)のLEDライトなどが使えるかもしれません。

>もしかしたら知人と同じケーブルをゲットできるかもしれない
これも「不確定要素」の切り分けになるのでハードとスクリプトの実験よろしくおねがいします。

数日でレスがこんなに伸びるとは思っても見ませんでした。。
HSP以外の話が続くのであれば警告?が来るかもしれません。
早く解決したいですね。



usagi

リンク

2021/11/26(Fri) 07:51:14|NO.94531

ケーブルが謎ですねぇ。。。
これはハードウェアがどうなっているのか当てるナゾナゾな気がしてきました。

こういう見た目のケーブルですか?

・USBの先がD-Sub9(オス or メス?)になっている。 (アマゾンとかで買われている?)
https://www.elecom.co.jp/products/UC-SGT1.html

・USBケーブルの先をこういった電子部品に繋いでる? (電子部品屋とかで買われている?)
https://akizukidenshi.com/catalog/g/gK-06894/



usagi

リンク

2021/11/26(Fri) 08:17:01|NO.94532

>zezenanaさん
そうですね。ちょっとHSPの話題とはそれてしまったかもです。すみません。
なんとか情報を引き出し解決して、電子工作に興味をもってもらえたら
嬉しいと思っていたのですが、スレ伸びすぎましたね。気を付けます。

HSPの話題としては、”USBtoSerial を使いDTR出力とDSR入力検知がしたい”という内容だとすると
"kernel32.as"読み込んで"GetCommModemStatus"を使うで解決なのかとは考えてます。
(あとはhspext.dllに機能追加してもらうとか。。。)

うよさんの実験を待ちたいと思います。



うよ

リンク

2021/11/26(Fri) 10:36:30|NO.94535

zezenanaさま
http://tss.ram.ne.jp/product/usbserial_prolific.html
これのようです。

usagiさま
>USBの先がD-Sub9(オス or メス?)になっている
ですね。

実験についてはもうしばらくお待ちください…



うよ

リンク

2021/11/26(Fri) 19:44:44|NO.94536

知人と同じものと思われるケーブルで繋いでスクリプトを実行したところ、オンオフで0と32の切り替えができました!
コマンドプロンプトで確認したところ、

USB Serial Port (COM4)

でした。

共通のソフトでは私のものでも知人のものでも動作するのになぜできないのでしょうね…

一応お二方の見解だけ聞いたら解決ということにしましょうか…お願いしますm(_ _)m



usagi

リンク

2021/11/26(Fri) 21:46:59|NO.94538

動作したようでよかったです。私からの見解としては、

うよさんが説明される条件であればソフトの問題はなくハードかと思ってます。
(各ピンの電圧を測り、意図した信号、電圧が出ているか、他の端子に影響していないかなど未確定なので)
私の環境で、ショートさせたり、電圧下げたら値が変化しなくなったのでそう言った事も考えられそうです。

共通のソフトで動作するという点では、実は別の方法で判定しているなど(CTS,RINGなど)
ですかね。

また、起動が遅いようなので、チップセット、ドライバーの相性とかもあるかもしれません。


1点、モージュールは検証用で、hspextとは同時使用できませんのでお気を付けくださいませ。
※hspextで同様におこなうには"GetCommModemStatus"という命令を追加して頂く必要があります。

おつかれさまでした。



うよ

リンク

2021/11/26(Fri) 22:49:44|NO.94539

usagiさま
長い間お付き合いいただいて本当にありがとうございました。
お陰様で電子工作やプログラミング等いろいろなことを勉強させていただきました。
これらの成果に自信を持ってこれからも頑張りますね笑



zezenana

リンク

2021/11/26(Fri) 23:41:43|NO.94540

うよ さん

無事動作確認できたとのことで良かったです。

共通のソフト?では動作するとのことですが、我々としては中身が見れない以上明確な回答はできないかなと思っています。

私も usagi さんと同意見で、スイッチ本体や結線やUSBシリアルなどのハードの問題を疑っています。

USBシリアルのリンクを見ましたが、内部で使用している
Prolific社のチップ PL2303は、各所に中国コピー品の偽チップが出回ったため
メーカー自体が警告を出しています(以下URLの英文)
http://www.prolific.com.tw/US/ShowProduct.aspx?p_id=155&pcid=41

動作不良もある粗悪品らしくて撲滅させるために廃盤にしたらしいです(コピー品は今でも流通?)

知人のUSBシリアルに変更してスクリプト実行の遅さが解消されているのならこれの影響の可能性が高いでしょう。

それとWindows10では正規ドライバがなく動作保証外となっているのも気になりました。
まあ安かろう悪かろうの代表例と言ったところでしょうか。。

スクリプトとしては usagi さんの NO.94507がすべてです。
細かいことを言えば commodemstatが直にDSR信号を受け取っているので comopenで記載している設定は必要ありません。
usagi さん自家製の comopenでは親切に DTR信号もONにしていますし、終了時には OFFしています(逆に言うと今回のスイッチ処理専用です)

おつかれさまでした。制作頑張ってください。



うよ

リンク

2021/11/26(Fri) 23:51:45|NO.94541

zezenanaさま
長い間様々なアドバイスをくださりありがとうございました!
やはりおっしゃる通りメーカーの違いが影響している可能性が濃厚になってきました…
FTDI?の方は上手く通信できますが、Prolificの方はできないようで…

制作頑張りますね!応援ありがとうございました😭



ONION software Copyright 1997-2023(c) All rights reserved.