有关mscomm控件的程序看不懂

liu_xy13 2004-05-11 09:38:06
看不太懂,哪位大侠能否帮我解释一下。可以再给分的:)

最好加注释,或者给个流程图:P 谢谢~~~~

MSComm1.Settings = "9600,M,8,1"
If Not MSComm1.PortOpen Then MSComm1.PortOpen = True
MSComm1.InBufferCount = 0
Dim address(1 To 1) As Byte
address(1) = 129 '130=82H 129=81H
MSComm1.Output = address
MSComm1.Settings = "9600,S,8,1"
Do Until MSComm1.InBufferCount > 0
DoEvents
Loop
getbyte = MSComm1.Input
For m = LBound(getbyte) To UBound(getbyte)
b(1) = getbyte(m)
Next m
If (b(1) <> 129) Then GoTo start

MSComm1.InBufferCount = 0
Dim command(1 To 1) As Byte
command(1) = 1 '01H
MSComm1.Output = command
Do Until MSComm1.InBufferCount > 0
DoEvents
Loop
getbyte = MSComm1.Input
For m = LBound(getbyte) To UBound(getbyte)
b(1) = getbyte(m)
Next m
If (b(1) <> 1) Then GoTo start

MSComm1.InBufferCount = 0
Dim D(0 To 14) As Byte

Dim f As Integer
f = 255
For J = 1 To 13
D(J) = C(i, J - 1)
check = check + D(J)
Next J
D(0) = 0
D(14) = check And f
MSComm1.Output = D
Do Until MSComm1.InBufferCount > 0
Loop
getbyte = MSComm1.Input
For m = LBound(getbyte) To UBound(getbyte)
b(1) = getbyte(m)
Next m
If (b(1) <> D(14)) Then GoTo start
'If (b(1) <> 255) Then GoTo start
'MsgBox "ok"
MSComm1.PortOpen = False

Dialog.pbrDownload.Value = i
Next i
Unload Dialog

'MSComm1.PortOpen = False
...全文
175 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiang8360 2004-07-18
  • 打赏
  • 举报
回复
up
lshuzhou696 2004-07-12
  • 打赏
  • 举报
回复
看看这段话对你有帮助。在读和串口具体通信的单片机协议:
在Windows系统环境下,微机系统完全接管各种硬件资源,不允许用户直接控制串行口的中断管理。因此在Windows环境下开发微机的底层资源,一种是使用API进行编写,另一种方法是使用串行通信控件。我们这里使用VB所带的Active X控件Microsoft Comm Control,简称MSCOMM控件,把它导入到C++ Builder中,具体导入方法可以参照有关书籍。
根据单片机多机通信特点, PC 机如果要与指定的单片机实现点对点通信,必满足下列条件: PC 机串口信息帧格式应同单片机一致,包括 1 位起始位, 1 位停止位, 8 位数据位,1个第9位。第 9 位应为地址 / 数据位,即可通过编程灵活进行设置。MSCOMM控件在串行通信程序中应用非常广泛,但大都没有使用第9位,我们经过对MSCOMM控件说明的仔细研究,发现可以通过灵活设置Settings属性来设置第9位。MSCOMM控件的Settings属性是用来设置并返回波特率、奇偶校验、数据位、停止位参数,它的值由四个设置值组成,有如下的格式:"BBBB,P,D,S",其中BBBB 为波特率,P 为奇偶校验,D 为数据位数,S 为停止位数,Settings缺省值是"9600,N,8,1" ,我们要进行单片机的多机通讯,可以使用奇偶校验位来模拟设置数据帧中的第9位。因为Settings中的“P”可以设为5种值:E(偶校验),M(标记),N(无校验),O(奇校验),S(空格),一般PC机作为多机通讯系统的命令发起者,只需要模拟实现多机通讯地址位bit8的发送,而不需要考虑该位的接收,这样我们可以有两种方法来设置数据帧中的第9位。
1. 可以使用奇校验(O)或偶校验(E)来模拟设置数据帧中的第9位,我们只要使用校验位是1的数值作为地址帧,而校验位是0的数值作为数据帧,这样能使用的从机地址有限,只有128个,而且数据位(控制指令)也有限,且不能和地址码重复,所以这种方法只适用于从机个数少,控制指令少的情况。使用这种方法的好处是在程序中不用变换MSCOMM控件属性的设置。
2.可以使用Mask位,将Settings设置为"9600,M,8,1",这样发送的都是地址位,设置"9600,S,8,1",这样发送的都是数据位,,不过不关闭串口也可以改变Settings的值,这样切换地址或数据只要不停的切换Settings的值就能实现数据帧中的第9位的设置。


flc 2004-07-07
  • 打赏
  • 举报
回复
多看MSDN
AKillGodKillBuddha 2004-06-23
  • 打赏
  • 举报
回复
OnComm 事件示例
下例说明如何处理通讯错误和事件。可以在相关的 Case 语句之后插入代码来处理特定的错误或事件。

Private Sub MSComm_OnComm ()
Select Case MSComm1.CommEvent
' Handle each event or error by placing
' code below each case statement

' 错误
Case comEventBreak ' 收到 Break。
Case comEventCDTO ' CD (RLSD) 超时。
Case comEventCTSTO ' CTS Timeout。
Case comEventDSRTO ' DSR Timeout。
Case comEventFrame ' Framing Error
Case comEventOverrun '数据丢失。
Case comEventRxOver'接收缓冲区溢出。
Case comEventRxParity' Parity 错误。
Case comEventTxFull '传输缓冲区已满。
Case comEventDCB '获取 DCB] 时意外错误

' 事件
Case comEvCD ' CD 线状态变化。
Case comEvCTS ' CTS 线状态变化。
Case comEvDSR ' DSR 线状态变化。
Case comEvRing ' Ring Indicator 变化。
Case comEvReceive ' 收到 RThreshold # of
chars.
Case comEvSend ' 传输缓冲区有 Sthreshold 个字符 '
'
Case comEvEof ' 输入数据流中发现 EOF 字符
'
End Select
End Sub

AKillGodKillBuddha 2004-06-23
  • 打赏
  • 举报
回复
MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。

语法

MSComm

说明

MSComm 控件提供下列两种处理通讯的方式:

事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如,在 Carrier Detect (CD) 或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。在这些情况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。OnComm 事件还可以检查和处理通讯错误。所有通讯事件和通讯错误的列表,参阅 CommEvent 属性。


在程序的每个关键功能之后,可以通过检查 CommEvent 属性的值来查询事件和错误。如果应用程序较小,并且是自保持的,这种方法可能是更可取的。例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。
每个使用的 MSComm 控件对应着一个串行端口。如果应用程序需要访问多个串行端口,必须使用多个 MSComm 控件。可以在 Windows“控制面板”中改变端口地址和中断地址。

尽管 MSComm 控件有很多重要的属性,但首先必须熟悉几个属性。

属性 描述
CommPort 设置并返回通讯端口号。
Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。
PortOpen 设置并返回通讯端口的状态。也可以打开和关闭端口。
Input 从接收缓冲区返回和删除字符。
Output 向传输缓冲区写一个字符串。

AKillGodKillBuddha 2004-06-23
  • 打赏
  • 举报
回复
下面这个简单的例子演示了用调制解调器进行基本的串行通讯:

Private Sub Form_Load ()
' 保存输入子串的缓冲区
Dim Instring As String
' 使用 COM1。
MSComm1.CommPort = 1
' 9600 波特,无奇偶校验,8 位数据,一个停止位。
MSComm1.Settings = "9600,N,8,1"
' 当输入占用时,
' 告诉控件读入整个缓冲区。
MSComm1.InputLen = 0
' 打开端口。
MSComm1.PortOpen = True
' 将 attention 命令送到调制解调器。
MSComm1.Output = "ATV1Q0" & Chr$(13) ' 确保
' 调制解调器以"OK"响应。
' 等待数据返回到串行端口。
Do
DoEvents
Buffer$ = Buffer$ & MSComm1.Input
Loop Until InStr(Buffer$, "OK" & vbCRLF)
' 从串行端口读 "OK" 响应。

' 关闭串行端口。
MSComm1.PortOpen = False
End Sub

注意 MSComm 控件可以采用轮询或事件驱动的方法从端口获取数据。这个简单的例子使用了轮询方法。关于事件驱动方法的例子请参阅

1,453

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧