mscommで通信するには?

解決


ben  2006-12-11 18:24:05  No: 134529

RS232cとMSCommで電波時計の時間などの情報を通信したいのですが
ポートは開くのですが送信しても何も反応がありません。
outputとOnCommの辺りが悪いと思うのですが修正点をご指摘して欲しいと思います。


Private Sub Form_Load()
'コントロールの初期設定
MSComm1.CommPort = 1
MSComm1.Settings = "9600,n,8,1"
MSComm1.RThreshold = 1
MSComm1.SThreshold = 1
MSComm1.InputLen = 0
End Sub

Private Sub Command2_Click()
If MSComm1.PortOpen = True Then
       Form1.MSComm1.Output = "TIME+CRLF"
       End If
End Sub

Private Sub MSComm1_OnComm()
Dim Buffer As Variant

       Select Case MSComm1.CommEvent
           Case comEvReceive
        
           Buffer = MSComm1.Input
           Text1.Text = Text1.Text & Buffer

       Case comEvSend
       Case comEvCTS
       Case comEvDSR
       Case comEvCD
       Case comEvRing
       Case comEvEOF
       
       Case comEventBreak
          MsgBox "中断信号を受信"         
       Case comEventCTSTO
          MsgBox "CTSタイムアウト"
       Case comEventDSRTO
          MsgBox "DSRタイムアウト"
       Case comEventFrame
          MsgBox "ポートオーバーラン"
       Case comEventCDTO
          MsgBox "CDタイムアウト"
       Case comEventRxOver
          MsgBox "受信バッファオーバーフロー", vbCritical
       Case comEventRxParity
          MsgBox "パリティエラー"
       Case comEventxFull
          MsgBox "送信バッファがいっぱい", vbCritical
       Case comEventDCB
          MsgBox "予期しないDCBエラー"
       Case Else
          MsgBox "その他の通信エラー"
      End Select
End Sub

通信コマンドはTIME+CRLFと書いてありました。


大吉末吉  2006-12-11 19:14:43  No: 134530

> RS232cとMSCommで電波時計の時間などの情報を通信したいのですが
は、良く分かりませんが、

> 通信コマンドはTIME+CRLFと書いてありました。

これは、
「『TIME+CRLF』と言う文字列を送れ」、
ではなく、
「『TIME』と言う文字列と、複改行コードを送れ」
と言う意味の気が・・・

だとすると、
> Form1.MSComm1.Output = "TIME+CRLF"
は、
> Form1.MSComm1.Output = "TIME" + vbCrLf
では・・・


ben  2006-12-11 20:15:00  No: 134531

ご返答ありがとうございます。
ためしてみたいと思います。

(補足)使っている物は秋月電子の電波時計キットです。
http://www.tristate.ne.jp/rf-clock-v2.htm

キットの説明書にRSー232CD出力、通信プロトコルと通信コマンドが書いてあったのでVBで作ろうと思いました。

これで電波時計の時間などの情報を通信してVBで表示したいと…

あと、Outputの方はテキスト文字列で送っていいのか?バイト配列?ATコマンド?という感じです。

宜しくお願いします。


あん  2006-12-12 14:41:36  No: 134532

面白そうですね
成功祈ってます。


我龍院  2006-12-12 19:04:18  No: 134533

提示されたコードではどこにもポートオープンがないけど、
ポートオープンはしてますよね。

>Outputの方はテキスト文字列で送っていいのか?
提示されたURLにプロトコルが書いてあるので読めばわかると
思いますが、測定器も含めてこういった物は殆ど、
コマンドもレスポンスもテキストです。
というか、"TIME+CRLF"はテキストにしすぎ、
大吉末吉さんご指摘のようにやればレスポンスは返ってきます。


ben  2006-12-13 21:56:01  No: 134534

大吉末吉様、あん様、我龍院様ありがとうございました。
おかげで受信出来ました。
bb="T"
cc="I"
という感じでご指摘通りテキスト文字で1つずつ分けると出来ました。

すみませんがもう1つ問題が発生しまして…
取り出した時間はLabelに表示されるだけなので
それを1秒ごとに(普通の時計)動かしたいのですが
どうすればいいのか教えて欲しいです。

最終的にはvbで作ったアナログ時計を電波時計で受信した時間で
動かそうと思っています。

今のデジタル時計は
Label1.Caption = Format(Now, "hh:nn:ss")
動きますけどこれじゃあ電波時計の意味がないので…

アナログの方は参考資料から引っ張ってきて動かしていますが
電波時計の意味がないので…
Static varTimeOld   As Variant
    Dim varTime         As Variant
    Dim deg             As Double
    Dim sngWidth        As Single
    Dim sngHeight       As Single
    Dim sngRound        As Single
    Dim sngDefix        As Single
    Dim iSecond         As Integer
    Dim iMinute         As Integer
    Dim iHour           As Integer
    
    '現在の時間を代入します
    'Time関数を毎回参照していると
    '処理中に時間が進んでしまうで
    '値が変動しないようにするため代入しています
    varTime = Time
    
    '現在の時間と前に保存していた時間を見比べる
    '同じであれば、時間の針を動かす必要がないので、
    'このプロシージャから出ます
        If varTime = varTimeOld Then
    
        Exit Sub
    End If
    '再度、時間を見比べるときに使う
    varTimeOld = varTime
    
    'SinやCosの引数をラジアン値に
    '変換するために使用する値の代入
    deg = 3.14159265358979 / 180
    
    '秒、分、時間を代入します
    iSecond = Second(varTime)
    iMinute = Minute(varTime)
    '24時間周期を12時間周期にします
    iHour = Hour(varTime) Mod 12
    
    sngWidth = Shape1.Width
    sngHeight = Shape1.Height
    
    '秒針の針を動かす
    sngRound = (iSecond * 6 - 90) * deg
    Byou.X1 = Byou.X2 + Cos(sngRound) * 100
    Byou.Y1 = Byou.Y2 + Sin(sngRound) * 100
    
    '分針の針を動かす
    sngDefix = iSecond / 10 '分針は、60秒/6度 → 10秒に1度進みます
    sngRound = (iMinute * 6 - 90 + sngDefix) * deg
    Hun.X1 = Hun.X2 + Cos(sngRound) * 100
    Hun.Y1 = Hun.Y2 + Sin(sngRound) * 100
    
    '時針の針を動かす
    sngDefix = iMinute / 2 '時針は、60分/30度 → 2分に1度進みます
    sngRound = (iHour * 30 - 90 + sngDefix) * deg
    Ji.X1 = Ji.X2 + Cos(sngRound) * 45
    Ji.Y1 = Ji.Y2 + Sin(sngRound) * 45

End Sub
長くなりましてすみません。宜しくお願いします。


あん  2006-12-13 22:28:47  No: 134535

電波時計の時間をシステム時間にするのではだめですか?
一定時間おきに電波時間をチェックしてシステム時間を更新して
表示にはシステム時間を使うとか


ben  2006-12-13 22:46:51  No: 134536

よく考えたらそうですね。
システム時計を合わすだけで終わります。

システム時計を電波時計で合わすのはどうすればいいですかね?
教えてください。お願いします。


ben  2006-12-14 00:31:09  No: 134537

と言ったものの考えてみるとシステム時計を合わす方が難しいと…

1回電波時計から受信してそこからTimerを使おうと思いますが…


あん  2006-12-14 01:00:12  No: 134538

日付の設定は
Date = 電波時計から取得した日付
時刻の設定は
Time = 電波時計から取得した時刻
でできますよ。


ben  2006-12-14 23:36:07  No: 134539

無事作ることが出来ました。

あん様の言った通りにシステム時計を合わせて出来ました。
皆さんには本当に感謝しています。
本当にありがとうございました。


※作成する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。







   このエントリーをはてなブックマークに追加