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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0423
tamar2つ(複数)のシリアル通信を維持したい。監視したい。10解決


tamar

リンク

2020/4/23(Thu) 00:18:48|NO.90158

こんにちは

hspext.asのcomopenを例えばcom 1とcom 2 同時に監視するということをやりたいです。


センサの情報をarduinoからシリアルで受け取って別のマイコン(arduinoやmbedなど)を制御するGUIを慣れているHSPで作ろうと思ってます。
hspext.asとarduino.asを同時に使ったところ、片方のシリアル通信しか維持できないということはわかりました。
なんとか同時にcomopenする方法はありませんでしょうか。。。



この記事に返信する


f(休日出勤)

リンク

2020/4/25(Sat) 11:03:49|NO.90174

昔そういうプラグイン作って配布していたが
ゲオが廃止されてしまってな…

どこかいい引っ越し先無いかしら…



mikumo

リンク

2020/4/25(Sat) 16:47:43|NO.90182

hspextのソースが公開されてるので、これをもとに書いてみたらどうでしょうか。
http://dev.onionsoft.net/trac/openhsp/browser/trunk/plugins/win32/Hspext/comport.cpp
ポートのハンドルをもつ変数が1つしかないようですので、これさえ直せば複数できそうですが。
勉強がてらソースをそのままHSPに落としてみました。参考までに。
使ってみてないけれど案外動くんじゃないかなあ

#module ModSerial comHandle // シリアルポート通信モジュール // 使い方 // 通常のcom*系命令の第一引数にモジュール型変数を指定、残りの引数には同じものを指定 #uselib "kernel32.dll" #cfunc CreateFileA "CreateFileA" sptr, int, int, int, int, int, int #func WriteFile "WriteFile" int, sptr, int, int, int #func ReadFile "ReadFile" int, int, int, int, int #func CloseHandle "CloseHandle" int #func GetCommState "GetCommState" int, int #func SetCommState "SetCommState" int, int #func BuildCommDCB "BuildCommDCBA" sptr, int #func SetCommTimeouts "SetCommTimeouts" int, int #func EscapeCommFunction "EscapeCommFunction" int, int #func ClearCommError "ClearCommError" int, int, int #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, %3="") comopen_ %1, %2, %3 #modfunc comopen_ int _port, str _proto if _port > 0 { path = "\\\\.\\COM" + _port } else { path = "LPT1" } comHandle = CreateFileA(path, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL) 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 } SetCommState comHandle, varptr(dcb) if stat == 0 : return -1 dim timeouts, 5 timeouts(0) = MAXDWORD timeouts(1) = 0 timeouts(2) = 0 timeouts(3) = 0 timeouts(4) = 0 SetCommTimeouts comHandle, varptr(timeouts) EscapeCommFunction comHandle, SETDTR return 0 #modfunc comclose EscapeCommFunction comHandle, CLRDTR CloseHandle comHandle comHandle = NULL return 0 #modfunc comput str _s numWritten = 0 WriteFile comHandle, _s, strlen(_s), varptr(numWritten), 0 if stat == 0 : return 0 return -numWritten #modfunc computc int _byte sdim sd, 4 numWritten = 0 poke sd, 0, _byte WriteFile comHandle, sd, 1, varptr(numWritten), 0 if stat == 0 : return 0 return -numWritten #modfunc computb var v, int _size numWritten = 0 WriteFile comHandle, varptr(v), _size, varptr(numWritten), 0 if stat == 0 : return 0 return -numWritten #modfunc comget var v, int _size sdim v, _size + 1 numRead = 0 if _size == 0 : size = 64 : else : size = _size ReadFile comHandle, varptr(v), size, varptr(numRead), 0 if stat == 0 { v = "" return 0 } poke v, numRead, 0 return -numRead #modfunc comgetc var v numRead = 0 sdim buf, 10 ReadFile comHandle, varptr(buf), 1, varptr(numRead), 0 v = peek(buf, 0) return -numRead #modfunc comcontrol int _fn EscapeCommFunction comHandle, _fn if stat == 0 : return -1 return 0 #modfunc comstat var v dim v, 4 ClearCommError comHandle, varptr(v), varptr(v) + 4 if stat == 0 : return -1 return 0 #global /* newmod com1, ModSerial comopen com1, 1 */



tamar

リンク

2020/4/29(Wed) 21:34:17|NO.90234

返事ありがとうございます。なるほどです。ちょっと変数増やして書き直してみます。



tamar

リンク

2020/6/13(Sat) 06:37:05|NO.90754

長く時間が空いてしまいました・・・

mikumoさんが書き出してくれたコードのモジュール関数comopenの中で
comHandle = CreateFileA(path, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)
とありましたので、CreateFileA()の中で定義されている定数を別に増やしてやればできそうだなーというところまでは理解しました。

そこまできての質問なのですが
#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
の部分で定義されているこの数字やアドレスがCreateFileA()に対してどうやって決まっているのかが分かりません。
どのように調べれば、この部分に何を入れればいいか分かるようになるでしょうか
勉強の仕方を教えていただけると助かります。



kanamaru

リンク

2020/6/13(Sat) 07:20:11|NO.90755

詳しくプログラムを読んでないのでわからないですが、
多分その定数は自分で決めたわけではなくwindowsが決めた定数だと思います。
定数を増やすのではなく、
CreateFileAの結果をreturn文で返すようにして
他の命令、関数の第一引数にでもハンドルを指定するようにすれば、
できそうな気がします。
勉強といっても、
定数をHDLで検索できるようにするのがこの掲示板で公開されていたと思うので
それを利用すればいいとは思います。
何ならasファイルも公開されているのでそれを使ってもいいと思います。
(対応していない定数もあるのかもしれませんが)



kanamaru

リンク

2020/6/13(Sat) 07:25:35|NO.90756

連続投稿すいません。
ソース読んでいて気づいたんですけど、
もしかしたらこれ既に複数対応しているかもしれません。
接続ごとに別のcom型変数を用意すればいいのでは?
comhandleは一つしかないですけど、
一行目の見る限り
com型変数の仕様上newcomの呼び出しごとに
独立しているはず。



TOMATO

リンク

2020/6/13(Sat) 11:57:15|NO.90758

>com型変数の仕様上newcomの呼び出しごとに

newcomのcomは、シリアル通信のCOMではなく、
Component Object ModelのCOMなので同じ名前ですが別物です。

Component Object Model
https://ja.wikipedia.org/wiki/Component_Object_Model

シリアルポート(COMポート)
https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E3%83%9D%E3%83%BC%E3%83%88



TOMATO

リンク

2020/6/13(Sat) 12:04:04|NO.90759

というか、
モジュール型なのでソースを直さなくても、
以下のような感じにすれば、動くと思いますよ。


newmod com1, ModSerial comopen com1, 1 newmod com2, ModSerial comopen com2, 2



tamar

リンク

2020/6/14(Sun) 22:25:24|NO.90776

kanamaruさん、TOMATOさん、ありがとうございます。
同名の別物ってあるんですね・・・使い方も併せてありがとうございます。
貼っていただいたリンク含めて勉強します。ありがとうございます!



tamar

リンク

2020/6/14(Sun) 22:26:36|NO.90777

疑問解消しましたので解決扱いにさせていただきます。ありがとうございました!



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