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と書いてありました。
> RS232cとMSCommで電波時計の時間などの情報を通信したいのですが
は、良く分かりませんが、
> 通信コマンドはTIME+CRLFと書いてありました。
これは、
「『TIME+CRLF』と言う文字列を送れ」、
ではなく、
「『TIME』と言う文字列と、複改行コードを送れ」
と言う意味の気が・・・
だとすると、
> Form1.MSComm1.Output = "TIME+CRLF"
は、
> Form1.MSComm1.Output = "TIME" + vbCrLf
では・・・
ご返答ありがとうございます。
ためしてみたいと思います。
(補足)使っている物は秋月電子の電波時計キットです。
http://www.tristate.ne.jp/rf-clock-v2.htm
キットの説明書にRSー232CD出力、通信プロトコルと通信コマンドが書いてあったのでVBで作ろうと思いました。
これで電波時計の時間などの情報を通信してVBで表示したいと…
あと、Outputの方はテキスト文字列で送っていいのか?バイト配列?ATコマンド?という感じです。
宜しくお願いします。
面白そうですね
成功祈ってます。
提示されたコードではどこにもポートオープンがないけど、
ポートオープンはしてますよね。
>Outputの方はテキスト文字列で送っていいのか?
提示されたURLにプロトコルが書いてあるので読めばわかると
思いますが、測定器も含めてこういった物は殆ど、
コマンドもレスポンスもテキストです。
というか、"TIME+CRLF"はテキストにしすぎ、
大吉末吉さんご指摘のようにやればレスポンスは返ってきます。
大吉末吉様、あん様、我龍院様ありがとうございました。
おかげで受信出来ました。
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
長くなりましてすみません。宜しくお願いします。
電波時計の時間をシステム時間にするのではだめですか?
一定時間おきに電波時間をチェックしてシステム時間を更新して
表示にはシステム時間を使うとか
よく考えたらそうですね。
システム時計を合わすだけで終わります。
システム時計を電波時計で合わすのはどうすればいいですかね?
教えてください。お願いします。
と言ったものの考えてみるとシステム時計を合わす方が難しいと…
1回電波時計から受信してそこからTimerを使おうと思いますが…
日付の設定は
Date = 電波時計から取得した日付
時刻の設定は
Time = 電波時計から取得した時刻
でできますよ。
無事作ることが出来ました。
あん様の言った通りにシステム時計を合わせて出来ました。
皆さんには本当に感謝しています。
本当にありがとうございました。
| ツイート |
|