vb串口通信程序实例

作者&投稿:塞毕 (若有异议请与网页底部的电邮联系)
VB与串行通信编程实例~

代码如下:
Private Sub Command1_Click()
MSComm1.Output = "123456"
End Sub

Private Sub Form_Load()
MSComm1.PortOpen = True
MSComm1.RThreshold = 1
MSComm1.SThreshold = 1
MSComm1.InputMode = comInputModeText
Text1 = ""
End Sub

Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvSend
Text1 = "comEvSend"
Case comEvReceive
Text1 = "comEvReceive"
Case comEvCTS
Text1 = "comEvCTS"
Case comEvDSR
Text1 = "comEvDSR"
Case comEvCD
Text1 = "comEvCD"
Case comEvRing
Text1 = "comEvRing"
Case comEvEOF
Text1 = "comEvEOF"
End Select
End Sub

以下参考MSDN:
OnComm 常数
常数 值 描述
comEvSend 1 发送事件。
comEvReceive 2 接收事件。
comEvCTS 3 clear-to-send 线变化。
comEvDSR 4 data-set ready 线变化。
comEvCD 5 carrier detect 线变化。
comEvRing 6 振铃检测。
comEvEOF 7 文件结束。

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

事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如,在 Carrier Detect (CD) 或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。在这些情况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。OnComm 事件还可以检查和处理通讯错误。所有通讯事件和通讯错误的列表,参阅 CommEvent 属性。
在程序的每个关键功能之后,可以通过检查 CommEvent 属性的值来查询事件和错误。如果应用程序较小,并且是自保持的,这种方法可能是更可取的。例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。
SThreshold 属性
在 MSComm 控件设置 CommEvent 属性为 comEvSend 并产生 OnComm 事件之前,设置并返回传输缓冲区中允许的最小字符数。
说明
若设置 Sthreshold 属性为 0(缺省值),数据传输事件不会产生 OnComm 事件。若设置 Sthreshold 属性为 1,当传输缓冲区完全空时,MSComm 控件产生 OnComm 事件。
如果在传输缓冲区中的字符数小于 value,CommEvent 属性设置为 comEvSend,并产生 OnComm 事件。comEvSend 事件仅当字符数与 Sthreshold 交叉时被激活一次。例如,如果 Sthreshold 等于 5,仅当在输出队列中字符数从 5 降到 4 时,comEvSend 才发生。如果在输出队列中从没有比 Sthreshold 多的字符,comEvSend 事件将绝不会发生。

CommEvent 属性包含实际错误或产生 OnComm 事件的数码。注意,设置 Rthreshold 或 Sthreshold 属性为 0,分别使捕获 comEvReceive 和 comEvSend 事件无效。

一个server端
Private Sub Command1_Click()

End

End Sub



Private Sub Command2_Click()
Winsockserver.SendData Text4.Text + ":" + textsend.Text


textget.Text = textget.Text + vbCrLf + Text4.Text + ":" + textsend.Text + " " + Str(Time)
textsend.Text = ""
End Sub

Private Sub Form_Load()
Command2.Visible = False
textsend.Visible = False
Text4.Visible = False
textget.Visible = False
Label1.Visible = False
Winsockserver.LocalPort = 1001

Winsockserver.Listen


End Sub



Private Sub textsend_Change()

'Winsockserver.SendData textsend.text

End Sub



Private Sub textsend_KeyPress(KeyAscii As Integer)
'If KeyAscii = 13 Then
'Winsockserver.SendData textsend.text
'textsend.text = ""
If KeyAscii = 13 Then
Winsockserver.SendData textsend.Text
' Text1.text = Text1.text + vbCrLf + Text4.text + ": " + Text2.text + " " + Str(Time)
textsend.Text = ""

End If
End Sub

Private Sub Timer1_Timer()
If Text4.Text = "" Then Text4.Text = "no name"
End Sub

Private Sub Winsockserver_Close()

Winsockserver.Close

End

End Sub



Private Sub Winsockserver_ConnectionRequest(ByVal requestID As Long)
Command2.Visible = True
textsend.Visible = True

textget.Visible = True
Text4.Visible = True
Label1.Visible = True
If Winsockserver.State sckClosed Then Winsockserver.Close

Winsockserver.Accept requestID

End Sub



Private Sub Winsockserver_DataArrival(ByVal bytesTotal As Long)

Dim tmpstr As String

Winsockserver.GetData tmpstr

'textget.text = textget + tmpstr + textsend
textget.Text = textget.Text + vbCrLf + tmpstr + " " + Str(Time)
End Sub


'(1)Command1:退出按钮;

'(2)textsend:发送数据文本框;

'(3)Winsockserver: 服务器Winsock;

'(4)textget :接收数据文本框。






一个clien

我也是自己摸索开发出来的每一款VBtoCOM通讯,有具体的思路如下:

给你推荐一个工具“com串口测试工具 ComTone V1.0 中文绿色版”

1、打开你的噪音计的测试软件,调整好串口号、通讯频率等等,我用温度计举例说明。

开始查询后有返回数值,这个Receive:就是返回的数值000304012200004b05,

打开串口监视精灵,监视软件的com口事件:

这里面的Write是测试软件发出的查询指令,read是设备返回的数据指令

Private Sub Command1_Click() '发送指令
If Not MSComm1.PortOpen Then
  MSComm1.CommPort = 7 '串口为7
  MSComm1.Settings = "9600,n,8,1"
  MSComm1.InBufferCount = 0 '清除接收缓冲区
  MSComm1.OutBufferCount = 0 '清除发送缓冲区
  MSComm1.InputMode = comInputModeBinary '二进制接收
  MSComm1.InputLen = 0 '读取接收缓冲区的所有字符
  MSComm1.PortOpen = True  '打开串口
  MSComm1.RTSEnable = False '置为发送状态
End If
Dim pu() As Byte
Dim strdata  As String
Dim crc_js() As Byte
ReDim pu(7)  '这个数组是8位的查询指令
pu(0) = "&H00" '温度计地址
pu(1) = "&H03" '查询指令
pu(2) = "&H00" '2、3为温度计地址
pu(3) = "&H00" '2、3为温度计地址
pu(4) = "&H00" '4、5为读取寄存器长度
pu(5) = "&H02" '4、5为读取寄存器长度
pu(6) = "&HC5" '6、7为CRC校验码 因为我们不知道设备的CRC校验规则所以用测试软件产生的校验码
pu(7) = "&HDA" '6、7为CRC校验码
MSComm1.Output = pu
'不做任何事情,仅仅允许其它应用程序处理它们的事件。
DoEvents
MSComm1.InBufferCount = 0 '清除接收缓冲区
MSComm1.RThreshold = 9 '所要接收的数据长度,我们通过COM检测精灵看到了回传数据一共是9字节
MSComm1.RTSEnable = True '转为接收状态
End Sub

Private Sub Command2_Click()
Timer1.Enabled = False
End Sub
Private Sub Form_Unload(Cancel As Integer)
    If MSComm1.PortOpen Then
        MSComm1.PortOpen = False  '关闭串口
    End If
    Timer1.Enabled = False
End Sub
Private Sub MSComm1_OnComm() 'COM事件
    Dim PA() As Byte
    Dim PB As String
Select Case MSComm1.CommEvent
 Case comEvReceive
            MSComm1.InputLen = 0 '读取接收缓冲区的所有字符
            PB = MSComm1.Input
            PA() = PB
            For i = 0 To UBound(PA())
                'Print "PA(" & i & ")"; PA(i)
                If Len(Hex(PA(i))) = 1 Then
                    strdata = strdata & "0" & Hex(PA(i))
                Else
                    strdata = strdata & Hex(PA(i))
                End If
            Next
            '回传的数据串:000304012600000AC4,这9字节根据通讯协议我们进行拆分
            '00为协议内回传机号,03为读命令,04为返回的数据长度 0126 为我要的温度数据为十六进制表达,下面我进行数据处理
            wd = CLng("&H" & Left(Right(strdata, 12), 4)) / 10 & "℃"   '根据通讯协议换算成温度
            Text1 = Text1 & vbCrLf & strdata & "  " & wd
            strdata = ""
   MSComm1.PortOpen = False  '关闭串口
 End Select
End Sub

Private Sub Timer1_Timer()
Call Command1_Click
End Sub


这是我的测试结果。

下面是通讯协议

这个是我的软件用检测精灵检测的结果



你有更详细的通讯协议吗?我想开发1532H的上位机软件,有的话请发一下qiaozb@163.com!

串口初始化
Private Sub Form
Load()
MSComm1.CommPort = 1
设置通信端口号为
COM1
MSComm1.Settings = "9600,n,8,1"
设置串口
1
参数
MSComm1.InputMode = 0
接收文本型数据
MSComm1.PortOpen = True
打开通信端口
1
End Sub
把字符通过串口发送出去
Private Sub Cmdsend
Click()
If Textsend.Text = "" Then
pp = MsgBox("
发送的数据不能为空!
Exit Sub
End If
MSComm1.Output = Trim(Textsend.Text)
For i = 1 To 20000000
Next i
End Sub
通过时钟控制来自动接收字符
Private Sub Timer1_
Timer()
Dim buf$
buf = Trim(MSComm1.Input)
将缓冲区内的数据读入
buf
变量中
If Len(buf) <> 0 Then
判断缓冲区内是否存在数据
TextReceive.Text = TextReceive.Text +Chr(13) + Chr(10) + buf
回车换行
End If
End Sub
关闭通信端口
停止程序运行
Private Sub Cmdquit
Click()
MSComm1.PortOpen = False
Unload Me
End Sub


MSComm控件可以在同一台机器上的两个串口间通信吗?
可以的 我用的是连接方式是A串口的2号针接B串口的3号针,B串口的2号针接A串口的3号针。(A、B都是公口,母口类似。) 个人建议把RThreshold和SThreshold属性都设为1 注意清空发送和接受的缓存数组和buffer

VisualC++\/TurboC串口通信编程实践(第2版)目录
第6章DOS环境下的Turbo C串口编程及通用实例GSerial类 第7章数据处理方法与串口通信用户层协议的编制 第8章单片机串口通信 第9章串口与网络结合的解决方案及编程 第10章计算机串口与其他通信协议设备的联接 第11章串口通信基本概念及标准 第12章不占用串口的串口数据捕捉 附录A Turbo C23说明 附录B ...

谁能给我一个上位机控制下位机的串口通信程序(C语言编写吧)
谢谢!最好是程序实例!如果合适,我将加大悬赏!我要的是C语言的! 展开  我来答 ...bReceive = FALSE; m_nPort = 1; m_strSettings = _T("9600,n,8,1"); m_strSendString =...m_Com.SetPortOpen(TRUE);\/\/打开串口 else AfxMessageBox("cannot open serial port"); m_Com.Set...

串口B码是什么
是时间系统中的一种常用串行传输方式,较并行传输方式其物理连续简单、传输距离远,接口标准化,国际通用。

HEXIN2108B串口卡怎样配IP地址
HEXIN2108B 上面的 RJ45只是个接口 跑的还是485 1 2pin 和7 8pin

求助:急死了!C#的程序,串口通信,硬件总是没反应
先确保硬件终端与串口通信是好的,比如用串口调试工具,超级终端等测试串口与硬件之间的命令 再使用程序打开串口发送命令,其间保证串口不被占用

无线传感器网络底层平台的深层研究
对这些数据信息进行分析便可以知道节点上各模块程序的运行情况。2.2测试过程及结果通过分析群首节点广播数据帧到群中终端节点的过程来判断底层模块的运行情况。群首节点A和群中终端节点(B、C、D)都通过串口线连接到PC上。群网络号为0x0001,节点A、B、C、D地址分别为:0x0001、0x0002、0x0003、0x0004.A通过无线...

上位机与串口通信程序求助,程序如下:
单片机的串口,应该直接和通信器件COMPIM 相连接。你中间加上了一个TTL-232的变换器,它有反相作用,因此导致串行通信不正常。可以参考:http:\/\/hi.baidu.com\/%D7%F6%B6%F8%C2%DB%B5%C0\/blog\/item\/47d0b8facfab5869024f5651.html

FPGA与电脑串口通信verilog程序
\/\/本模块的功能是验证实现和PC机进行基本的串口通信的功能。需要在 \/\/PC机上安装一个串口调试工具来验证程序的功能。\/\/程序实现了一个收发一帧10个bit(即无奇偶校验位)的串口控 \/\/制器,10个bit是1位起始位,8个数据位,1个结束 \/\/位。串口的波特律由程序中定义的div_par参数决定,更改该参数...

...大侠帮忙写一下stc89c52单片机的单工串口通信程序,不胜感激。_百度...
sendData('b');break;case '3':sendData('c');break;default:sendData('n');break;} } } \/ (1)把以上程序copy两份,上面有发送和接收函数,其中一个单片机用于发送(可不用改直接用上面),另外一份稍微修改下main()函数即可,在while(1)用char getData(void)接收 串口字符 (2)也可以两...

壶关县17134801913: VB与串行通信编程实例 -
夹司硝酸: 代码如下:Private Sub Command1_Click() MSComm1.Output = "123456" End Sub Private Sub Form_Load() MSComm1.PortOpen = True MSComm1.RThreshold = 1 MSComm1.SThreshold = 1 MSCo...

壶关县17134801913: 求VB单片机串口通讯字符收发程序 -
夹司硝酸: 单片机12m晶振: void init() {TMOD=0x20;PCON=0X80;//波特加倍SCON=0X50;//允许接受方式2波特可调TH1=TL1=0XF3;TR1=1; } vb,串口1,方式:4800,n,8,1,一个按钮,一个文本框,一个mscomm控件 Private Sub Command1_...

壶关县17134801913: 求VB用串口在两台计算机上进行传输数据的程序 -
夹司硝酸: 1. 声明com控件 Public WithEvents moCom As SCCIATLLib.WinCom2. 进行连接 Set moCom = New SCCIATLLib.WinCom moCom.Setup 9600, 8, 0, 0 moCom.SetupBlockModel 0 moCom.SetupHandshaking 1 moCom.Open "comx" 'com口设...

壶关县17134801913: 用VB如何写串口通信程序? -
夹司硝酸: 标准的,用openfile,writefile,closefile函数就可以与串口通讯了!``

壶关县17134801913: 利用VB串口通信控件MSComm,以二进制方式传输一个900KB左右的文件 -
夹司硝酸: 你的代码问题太多了.Open "c:\a.dat" For Binary As #1 '打开a.DAT文件 ReDim b(LOF(1)) Get #1, , b Close #1'''''''''''''''''''''''' Private Sub MSComm1_OnComm() '数据大了会被多次触发, Dim buffer As Variant Dim a() As Byte buffer = ...

壶关县17134801913: VB串口编程 -
夹司硝酸: VB2005有rs232的控件,拖到窗体上,就可以收发串口的数据,你说的灯亮起来,只是具体的数据内容,这个内容类似A代表灯亮,B代表灯灭,完全自已控制 补充:你说的高低电平那是低一层的,单片机的接收协议一般是个表格,什么字符代表什么功能,SerialPort只是控制流向的字符 要说高低电平,那就是驱动了,则不能用控件,语言应用C.我对单片机不知,所以……

壶关县17134801913: 用vb串口实现发送一串000110010001010101000101010的二进制数 怎么发送 怎么接收 -
夹司硝酸: VB可以通过串口控件实现串口通信,串口通信一般8个字节为1组进行发送,下面以你的前三个字节27bit为例 需要先串口控件初始化,此处略 发送时:Dim Sendbuffer(3) as Byte SendBuffer(0)=&H19 SendBuffer(1)=&H15 SendBuffer(2)=&H45 ...

壶关县17134801913: 15如何利用VB实现计算机串口通信?
夹司硝酸: 用VB的MSCOMM控件: MSCOMM1.COMMPORT1=1 '设置端口号为1 MSCOMM1.SETTINGS="19200,N,8,1" '设置波特率等通信协议 MSCOMM1.INPUTLEN=2 '设置一次从串口读取2个字节 MSCOMM1.PORTOPEN=TRUE '打开串行口 ...

壶关县17134801913: 急求!用VB编写USB虚拟串口数据接收程序 -
夹司硝酸: 楼主,你可以去下载一个“VSPM虚拟串口”软件,安装好后,先不要运行,在“开始”菜单--》“程序”--》“VSPM”--》“虚拟串口互联插件”,里面有一个Readme.txt文件,按里面的要求去做,可以用一台PC模拟串口通信了.另外在你的VB程序里,一个mscomm控件.com=3,另一个.com=4就可以进行数据的收发了.到时在真正的应用时,只需将这两个值改一下就OK 了.有问题Hi我.

壶关县17134801913: vb中,用七个按钮控制一个机器的七个按键,使用串口进行通讯如何写代码 -
夹司硝酸: 主要用到以下函数:CreateFile OpenComm WriteComm CloseComm 打开串口后,按自定义的封包格式写串口就可以了.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网