读书人

vb的mscomm控件的通信有关问题

发布时间: 2012-08-28 12:37:01 作者: rapoo

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 转串有毛病。

读书人网 >VB

热点推荐