■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(1(左):あまり役立たない - 5(右):大変役立った):
■ ページの共有:
[ サイト内検索 ]
カスタム検索
#1326-0PDQCommの受信で・・・実行時にエラーが発生する時としない時がありますErica1999-09-01(水) 13:36
     #1327-0RE#1326:PDQCommの受信で・・・実行時にエラーが発生する時としない時があります匿名13271999-09-01(水) 13:58
     #1328-0RE#1326:PDQCommの受信で・・・実行時にエラーが発生する時としない時がありますMTS1999-09-01(水) 14:09
     #1331-0RE#1328:PDQCommの受信で・・・実行時にエラーが発生する時としない時がありますErica1999-09-01(水) 14:55
     #1335-0RE#1331:PDQCommの受信で・・・実行時にエラーが発生する時としない時がありますMTS1999-09-01(水) 15:57
     #1336-0RE#1335:PDQCommの受信で・・・実行時にエラーが発生する時としない時がありますMTS1999-09-01(水) 16:50
     #1339-0RE#1335:PDQCommの受信で・・・実行時にエラーが発生する時としない時がありますErica1999-09-01(水) 17:20
     #1345-0RE#1339:PDQCommの受信で・・・実行時にエラーが発生する時としない時がありますMTS1999-09-01(水) 18:34
     #1360-0RE#1345:PDQCommの受信で・・・実行時にエラーが発生する時としない時がありますErica1999-09-02(木) 09:16
     #1372-0RE#1360:PDQCommの受信で・・・実行時にエラーが発生する時としない時があります匿名13721999-09-02(木) 13:14
     #1404-0RE#1372:PDQCommの受信で・・・実行時にエラーが発生する時としない時がありますErica@自宅1999-09-02(木) 19:41
#1326-0
PDQCommの受信で・・・実行時にエラーが発生する時としない時があります
もうお手上げです。(TT)
エラーが出るときと出ない時があります・・・
あと ブレークをかけながらやるとエラーはでません。
ソースを拝見していただきたいです。

'もろもろは省略させていただきます
'受信するであろう文字列(Hex表記)
'      85 86 87 88 :バイトカウント
'・・・・・30 20 0D 88←チエックサム
' 87バイト目に 終端文字ODが
' 88バイト目に チエックサムが

Do
    
'PDQComm1の使用
 With PDQComm1

'受信処理
  If .InBufferCount Then
    '受信
    InpBin = InpBin + .InputB

        '終端文字<D>の検出
        For i = 1 To LenB(InpBin)
          '受信データをバイト単位で取り出す
          InpData = AscB(MidB(InpBin, i, 1))
          '終端文字 13の検出
            If InpData = 13 Then
              '13のバイト位置
              CheckSumPosition = i
            End If
        Next
 
        'チエックサム手前まで<終端文字まで>の文字列をCheckSumInpBinに代入
        CSBin = MidB(InpBin, 1, CheckSumPosition)
        '文字列長さを求める
        LengthCSBin = LenB(CSBin)
        '終端文字までの次の文字列までの長さ=チエックサムまで
        LengthCSBin = LengthCSBin + 1
        'チエックサムの値をReceiveCheckSumに
 エラー>ReceiveCheckSum = AscB(MidB(InpBin, LengthCSBin, 1))

Debugでは LengthCSBinに 88が入ってきます。
エラーは「プロシージャの呼び出したま引数が不正です」だそうです。
なにが間違ってるのか わかりません。よろしくお願いします。
#1327-0
RE#1326:PDQCommの受信で・・・実行時にエラーが発生する時としない時があります
> もうお手上げです。(TT)
> エラーが出るときと出ない時があります・・・
> あと ブレークをかけながらやるとエラーはでません。
> ソースを拝見していただきたいです。
> 
> 'もろもろは省略させていただきます
> '受信するであろう文字列(Hex表記)
> '      85 86 87 88 :バイトカウント
> '・・・・・30 20 0D 88←チエックサム
> ' 87バイト目に 終端文字ODが
> ' 88バイト目に チエックサムが
> 
> Do
>     
> 'PDQComm1の使用
>  With PDQComm1
> 
> '受信処理
>   If .InBufferCount Then
>     '受信
>     InpBin = InpBin + .InputB
   
        ↑
  この時点で、まだチェックサムコードを受信していない時にエラーになるのでは?
  このロジックでは、タイミングによっては終端コードまでしかはいっていない時があると思います。
#1328-0
RE#1326:PDQCommの受信で・・・実行時にエラーが発生する時としない時があります
> あと ブレークをかけながらやるとエラーはでません。

> '受信処理
>   If .InBufferCount Then

というように終了処理が1回しかやってないですね。
これなら時々スルッと抜けちゃう時があるので2重判定にしてみては?
後、受信速度(settingsプロパティで設定)も落としてみたほうがいいです。
ちゃんと動くようになってから受信速度を上げるのはいくらでもできますから。


 If .InBufferCount Then
     *ここで通常処理を実行
ELSE
     *ここで待機処理(WInAPI SLEEP関数などを使用)を実行
   If .InBufferCount Then
         *ここで通常処理を実行
     ELSE
         *ここでエラー処理を実行
    END IF
END IF

とかやってみては?

受信文字列がもっと長ければコントロールパネルのハンドシェーク設定や
FIFOバッファ使用ON/OFFの問題もあるのですが今回は受信文字列が短い
のでそれが原因ではないでしょう。

しかし、これ超初心者掲示板の質問ではないですよ(笑)
#1331-0
RE#1328:PDQCommの受信で・・・実行時にエラーが発生する時としない時があります
MTSさま匿名1327さま レスありがとおございますぅぅ。(TT)

> > '受信処理
> >   If .InBufferCount Then
> 
> というように終了処理が1回しかやってないですね。
> これなら時々スルッと抜けちゃう時があるので2重判定にしてみては?
> 後、受信速度(settingsプロパティで設定)も落としてみたほうがいいです。
> ちゃんと動くようになってから受信速度を上げるのはいくらでもできますから。
そうなんですそうなんです!!!スルッて ぬけちゃってて困ってたんです。


> ELSE
>      *ここで待機処理(WInAPI SLEEP関数などを使用)を実行
ほよよぉぉ? WinAPIとはなんぞや?? たまーこここで見かけるけど(その言葉)
ちょい勉強してきます。

で その WinAPIとやらを使わなきゃならないんでしょうか?
タイマーコントロールや Wait関数(使えるのかわからないけど・・)
で代用はできないんですかのう....?


> 受信文字列がもっと長ければ
88バイトは短い方ですか? ちなみに1200です。
#経験がないので こんな事聞いてスミマセン。
> しかし、これ超初心者掲示板の質問ではないですよ(笑)
いえいえっ VB半年の 超初心モノでございます。
とりあえず お勉強してきます!
#1335-0
RE#1331:PDQCommの受信で・・・実行時にエラーが発生する時としない時があります
> で その WinAPIとやらを使わなきゃならないんでしょうか?
> タイマーコントロールや Wait関数(使えるのかわからないけど・・)
> で代用はできないんですかのう....?
要は待機の時間が稼げればそれでいいんです。
しかし、空ループで
    FOR I=1 TO 100000
    NEXT I
とかして時間を稼ぐとマシンによって計算能力が異なるため、待機時間がまちまちに
なるのでおすすめできません。
Timer関数(タイマーコントロールとはちがう)とかTimeSerial関数とDo-Loop関数
を組み合わせて計算で待機処理を行う事も可能ですが、面倒くさいし
そのままでは午前0時をまたがって実行すると正しく計算されないので
例外処理を考えて.....とかやるとしんどいので

    待機処理は SLEEP API 関数が結局一番ラク(笑)

といえると思います



> > 受信文字列がもっと長ければ
> 88バイトは短い方ですか? ちなみに1200です。
バケツに水が入っていてそれをすくって取り出す場合を考えてみましょう。
元のバケツより大きいバケツを用意すれば1回すくえばOKですが、
小さいコップなのですくう時は何回かに分けてすくう必要があります。
バイナリ受信ではPDQCommのInBufferSizeプロパティは 3072以上に設定していると
思います。ここで 3072というのがすくう側のバケツの大きさです。
つまり、送信文字列バイトがこれより大きい時(10000バイトなど)は1回では受信
できないのです。
この時コントロールパネル→システム→デバイスマネージャ
→ポート→ポート設定→フロー制御が「ハードウェア」になっていて、詳細設定の
「FIFOバッファを使用」がチェックされてないと、受信処理が完了する前に
送信側がおかまいなしにどんどんデータを送るので受信データが欠落するのです。
今回は 3072 > 1200 ですから気にしなくていいでしょう。
ハンドシェークについてはPDQCommのマニュアルやヘルプに詳しく載っています。


> いえいえっ VB半年の 超初心モノでございます。
私も1年ちょい (^-^) (笑)
ではまた
#1336-0
RE#1335:PDQCommの受信で・・・実行時にエラーが発生する時としない時があります
小さいコップなのですくう時は何回かに分けてすくう必要があります。
→小さいコップなどですくう時は何回かに分けてすくう必要があります。
#1339-0
RE#1335:PDQCommの受信で・・・実行時にエラーが発生する時としない時があります
ちょいとお勉強して帰ってきましたぁぁ。

> とかして時間を稼ぐとマシンによって計算能力が異なるため、・・(省)・・
> ・・・・・そのままでは午前0時をまたがって実行すると・・・・・・
へー!知らなかった!(**)

>     待機処理は SLEEP API 関数が結局一番ラク(笑)
Ericaも調べて来ました。はっきりいって さわりしか見てません。(汗)
#でも今回は急いでるので許してぇぇ〜
で、 カンタンにできて カンドウしてます>SLEEP

で、今回は 最高88バイトを 受信するのですが、
On_Commを使おうか どうしようか迷ってます。 一応On_Comm使ってますが・・・・

で 前のように 組み直したのですが・・・
やはり あの問題の部分で たまぁ〜に ひっかかってしまいます。
あと、 プログラムを実行して フォームが現れてから コマンドボタンを押すと
うまく キレイに受信してくれて テキストに入ってくれますが、
2回目に コマンドボタンを押したら
 if.InbufferCount then 
   ・
   ・
  else
    MsgBox"エラー" →ここに入ってエラーとなります。
 endif
くやしいので何回もボタン押しますがうんともすんとも・・・・
またまた お手上げです、はい。(TT)
回避策はあるのでしょうか???
#1345-0
RE#1339:PDQCommの受信で・・・実行時にエラーが発生する時としない時があります
> On_Commを使おうか どうしようか迷ってます。 一応On_Comm使ってますが・・・・
私はいっつも使っていないのでOn_Comm使った時のロジックは分かりません

> やはり あの問題の部分で たまぁ〜に ひっかかってしまいます。
送信してすぐならまだデータが来ていないのかもしれませんよ。受信バッファ>0になってから
受信取得するとか

> くやしいので何回もボタン押しますがうんともすんとも・・・・
> またまた お手上げです、はい。(TT)
> 回避策はあるのでしょうか???
受信バッファをクリアしてから受信開始するとか?

#何にせよ制御PGMは、送信側の機器との相性との問題もあるのでなんともいえません
#1360-0
RE#1345:PDQCommの受信で・・・実行時にエラーが発生する時としない時があります
おはようございます Ericaでございます。

> 私はいっつも使っていないのでOn_Comm使った時のロジックは分かりません

On_Commは 1バイト受信したゴトにイベント発生にしてます。
PDQCommの取説では このやりかたは 速度が早い通信では効率が悪いとありました。
まあ 今回の場合は 1200なので いいのかなぁあ?と・・・

> 送信してすぐならまだデータが来ていないのかもしれませんよ。受信バッファ>0になってから
> 受信取得するとか
フォームロード時は コマンドボタンを押して 送信した直後に 受信バッファ=0に
してます・・・

> #何にせよ制御PGMは、送信側の機器との相性との問題もあるのでなんともいえません
本当にいままで お付き合い頂いてあいがとおございました。
今日1日悩みに悩んでみます。はははぁぁあ。
またきますぅぅ
#1372-0
RE#1360:PDQCommの受信で・・・実行時にエラーが発生する時としない時があります
 
> On_Commは 1バイト受信したゴトにイベント発生にしてます。
> PDQCommの取説では このやりかたは 速度が早い通信では効率が悪いとありました。
> まあ 今回の場合は 1200なので いいのかなぁあ?と・・・
> 
On_Commイベント発生後、いったんRThresholdプロパティを0としてやり、
受信処理の終了後、RThresholdプロパティを1に戻してやる、というのはどうでしょう?

On_Commイベントが複数回発生してしまった上で初回の読込により
InBufferCount=0となるまで読込み終了してしまっている、ということであれば
これで回避できると思うのですが。
#1404-0
RE#1372:PDQCommの受信で・・・実行時にエラーが発生する時としない時があります
#今日は残業しないであきらめて定時で帰ってきました。(´ヘ`;)ハァ

匿名 1372さま・・・レスありがとおございます。m(__)m

On_Commイベント発生すぐしたに追加してみました。>RThresholdプロパティを0
>受信処理の終了後、RThresholdプロパティを1に戻してやる
とりあえず、On_Commイベント終了ルーチン最後の方に追加しました。

だけど・・・ダメだった。むむむ!!

明日またきます。みなさま よろしくお願いします。
お探しの情報は見つかりましたか?お困りの問題は解決しましたか?
サイト内検索, 似た記事検索で見つからなくてもあきらめずに掲示板で質問してみましょう。
VB初心者友の会があなたのお役に立てれば幸いです。また、本ページの投稿者の方々にこの場を借りて感謝致します。
本ページは過去ログを集めて自動構成しています。よろしければこのページに関するフィードバックをお願いします。
(※ 構成の誤り、広告等の不適切な記事、リンク切れ、読めないページの報告など)