使用mscomm进行串口通信 (200分)

  • 主题发起人 主题发起人 benserver
  • 开始时间 开始时间
B

benserver

Unregistered / Unconfirmed
GUEST, unregistred user!
兄弟们:
小弟最近在使用mscomm控件在进行串口通讯的时候,遇到一点小问题,但是实在没有解决,请各位大哥帮帮忙!
操作系统:windows xp
开发控件:vb
问题:在使用MSComm控件实现与串口仪器的数据传送和接收时,当端口打开后,主站向仪器中发送一个Modbus"包",其格式为:
从属地址 11(十六进制,下同)
功能码 04
数据启动地址-hi 40
数据启动地址-lo 50
注册号-hi 00
注册号-lo 03
CRC-lo A7
CRC-hi 4A
我主要的传送代码为:
Dim i As Integer
Dim data_out(8) As Byte
Dim buffer As Variant

MSComm1.InBufferCount = 0
MSComm1.OutBufferCount = 0
data_out(0) = &H11
data_out(1) = &H4
data_out(2) = &H40
data_out(3) = &H50
data_out(4) = &H00
data_out(5) = &H03
data_out(6) = &HA7
data_out(7) = &H4A
Dim temp(8) As Byte
For i = 0 To 7
temp(i) = data_out(i)
Next i
MSComm1.Output = temp

当运行程序时,不能够触发OnComm()事件,我设置断点跟踪了一下,感觉到是没有将数据传入仪器.在这里我只是测试能否与仪器进行交互,是使用的一个示例,所以有关CRC校验的东西还为考虑,但是任凭我怎么想办法,始终不能够触发事件,请问该如何解决,怎样才能够取得仪器中的数据.
由于我是刚接触串口编程,所以很多的问题还不是行清除,如果方便请给小弟较为详细的说明,万分干些!

使用delphi也可以,只要能够解决问题就行.
 
Select Case MSComm1.CommEvent
' 各 Case ステートメントの後にコードを記述して、
' 該当するイベントまたはエラーを処理してください。

' エラー
Case comEventBreak ' 中断信号
Case comEventFrame ' FrameError
Case comEventOverrun ' 数据丢失
Case comEventRxOver ' 受信缓冲溢出
Case comEventRxParity ' 校验错误
Case comEventTxFull ' 送信缓冲里内容满了
Case comEventDCB ' Device Control Block
' 错误

' イベント
Case comEvCD ' CD ラインの状態が変化しました。
Case comEvCTS ' CTS ラインの状態が変化しました。
Case comEvDSR ' DSR ラインの状態が変化しました。
Case comEvRing ' リング インジケータの状態が変化しました。
Case comEvReceive ' RThreshold プロパティで指定された数のバイトを
' 受信しました。
Case comEvSend ' 送信バッファに SThreshold プロパティで指定された
' 数のバイトが入っています。
Case comEvEof ' 入力ストリーム内に EOF 文字が検出されました。
End Select


Private Sub Form_Load ()
' 入力文字列用バッファ。
Dim Instring As String
' COM1 を使用します。
MSComm1.CommPort = 1
' 9600bps、パリティなし、データ長 8 ビット、およびストップ ビット長 1。
MSComm1.Settings = "9600,N,8,1"
' Input プロパティ使用時に、バッファ全体を読み取るように設定します。
MSComm1.InputLen = 0
' ポートを開きます。
MSComm1.PortOpen = True
' モデムに AT コマンドを送信します。
MSComm1.Output = "ATV1Q0" &amp
Chr$(13) ' モデムが
' "OK" と応答するのを確認します。
' データがシリアル ポートに戻るのを待ちます。
Do
DoEvents
Buffer$ = Buffer$ &amp
MSComm1.Input
Loop Until InStr(Buffer$, "OK" &amp
vbCRLF)
' シリアル ポートで "OK" 応答データを読み取ります。
' シリアル ポートを閉じます。
MSComm1.PortOpen = False
End Sub

既然是通讯,因为与你通信的机器是死的,如果不加crc校验,可能对方不认
你发的玩意,如果同时也没返回也很正常阿
 
楼上的是日本人嘛?
 
接受答案了.
 

Similar threads

后退
顶部