vb的mscomm控件的通信问题
VB通过mscomm控件与单片机通信,先发握手信号&84,握手成功则接收单片机传送过来的数据,通信采用五线制,握手成功后单片机每发一次数据,得判断一次RTS/CTS状态,才能进行数据传送。
现在遇到的问题是,无论用轮询法或者是用控件的MSCOMM控件,单片机的232接口与上位机的com口直接通信则正常,但是由于现在的笔记本多数都没有了com口,工程上要用usb扩展出com口,我用usb扩展出的com口(com5)与单片机的232接口直接连,则不能完成握手,单步调试的时候,在上位机发出&84握手信号后CPU占用一直100%,进入假死状态,程序中只是把com1换成了com5,其余任何都没做改动,为什么会出现这样的情形搞不明白,希望得到帮助,多谢!
问题:1.usb扩展出来的com口与机器自带的com口有什么区别吗?
2.在用mscomm控件的时候,我使用的inputlen=1,但有时候触发oncomm事件的时候,会一下子接收到两个字节(比如说31 3a),而且下一次触发oncomm事件时,还会再一次接收上一次已经接收过的3a, 我在AD = MSComm1.Input后面增加了再清空接收缓冲区的语句,没有再出现这个问题
'读取完成后直接清空接收缓冲区
MSComm1.InBufferCount = 0
,但我没搞明白是为什么?一般不用再次清空吧?
我用mscomm控件写的vb6.0代码如下:
Option ExplicitDim a1 As String '定义a1为全局变量Dim i, j As IntegerDim bufferDim buffDim IsReceiving As BooleanDim RecData Dim TestData Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)Private Sub cmdSend_Click() MSComm1.RTSEnable = TrueDo Until (MSComm1.CTSHolding = True) DoEventsLoopMSComm1.RTSEnable = False Dim DA() As Byte ReDim DA(0)DA(0) = &H84 MSComm1.Output = DA() Debug.Print "asdfdsf" End SubPrivate Sub Command1_Click()CommonDialog1.ShowSaveRecData = Mid(RecData, 6)RichTextBox1 = RecDataRichTextBox1.SaveFile CommonDialog1.FileName, 1End SubPrivate Sub Command2_Click()MSComm1.PortOpen = FalseEndEnd SubPrivate Sub Form_Load()Text1 = ""Text2 = ""RichTextBox1 = "" MSComm1.CommPort = 1 'COM端口,用USB扩展的口为com5 MSComm1.Settings = "9600,n,8,1" MSComm1.InputMode = comInputModeBinary '采用二进制传输 MSComm1.InBufferCount = 0 '清空接受缓冲区 MSComm1.OutBufferCount = 0 '清空传输缓冲区 MSComm1.InputLen = 1 '缓冲区每次读一个数 MSComm1.RThreshold = 1 '产生MSComm事件 MSComm1.PortOpen = True '打开端口End SubPrivate Sub MSComm1_OnComm()Dim AD() As ByteDim Ik As Long'Dim ttwo As BooleanSelect Case MSComm1.CommEventCase comEvReceive Sleep (1) AD = MSComm1.Input '读取完成后直接清空接收缓冲区 MSComm1.InBufferCount = 0 For Ik = 0 To UBound(AD) Text1.Text = AD(i) RecData = RecData & AD(i) & Space(2) j = j + 1 Text2 = j 'RichTextBox1 = RecData NextMSComm1.RTSEnable = TrueDo Until (MSComm1.CTSHolding = True) DoEventsLoopMSComm1.RTSEnable = FalseEnd SelectEnd Sub