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代码如下:
- VB code
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
[解决办法]
http://download.csdn.net/detail/veron_04/1262066
[解决办法]
MSComm1.RTSEnable = True
Do Until (MSComm1.CTSHolding = True)
DoEvents
Loop
MSComm1.RTSEnable = False
试着把DoEvents用timer代替试试。
把sleep去掉
为什么MSComm1.InputLen不能加大些,记录数据到数组中,动态判断取值
[解决办法]
1.usb扩展出来的com口与机器自带的com口有什么区别吗?
//
不同的芯片以及不同的厂家,做出来的USB转COM是有区别的.
不少的转换头只实现了RXD,TXD及GND.
我以前做单片机编程及PLC编程时就发现有些线不能用,测试后发现CD,RTS,CTS这些都没有实现.
推荐选用PL2303芯片的转换头,我用着很稳定.
[解决办法]
要么把握手协议去掉,要么测试并选定 U 转串线提供给用户。选 U 转串时,查一下是否支持“全部信号”。
许多 U 转串仅仅实现了三线基本通讯功能。
至于在测试中出现的异常,等选定了 U 转串之后再调试。很可能是你现在用的 U 转串有毛病。