VB串口数据接收方式
VB串口
MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。
MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi等语言中均可使用。
Micro soft Communications Control(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的A ctiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。
具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。
1.MSComm控件两种处理通讯的方式1.1 事件驱动方式事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。
在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者 Carrier Detect (CD) 或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。
在这些情况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。
OnCo mm 事件还可以检查和处理通讯错误。
所有通讯事件和通讯错误的列表,参阅 CommEvent 属性。
在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。
这种方法的优点是程序响应及时,可靠性高。
每个MSC omm 控件对应着一个串行端口。
如果应用程序需要访问多个串行端口,必须使用多个 MSComm 控件。
1.2 查询方式查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。
在程序的每个关键功能之后,可以通过检查 CommEvent 属性的值来查询事件和错误。
如果应用程序较小,并且是自保持的,这种方法可能是更可取的。
例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。
2.MSComm控件的常用属性MSComm1.Settings:=’9600,n,8,1’; //设置波特率 ,校验位,数据位,停止位Settings属性:设置串口的波特率 ,校验位,数据位,停止位, ’9600,n,8,1’表示波特率为9600,无奇偶校验,数据位为8为,1位停止位MSComm1.InBufferSize:=1024; // 接受缓冲区大小InBufferSize 属性:接收缓冲区的大小,默认值为1024,也可以自己设定,比如, MSComm1.InBufferSi ze:=2000,则接收缓冲区的大小为2000字节MSComm1.OutBufferSize:=1024; // 发送缓冲区大小OutBufferSize属性:发送缓冲区的大小,默认值为1024,也可以自己设定。
VB串口接收数据画波形
VB串口接收数据画波形Dim shuju(102) As Byte '画波形缓存数组Dim n As Integer '接收指针Dim key As Byte '接收方式选择开关Const pi = 3.14159Dim a '画波形函数变量Dim qing As StringDim shu As Byte '定义全局变量,二进制接收数组Dim ji_shu As IntegerPrivate Sub clean_Click()ji_shu = 0End SubPrivate Sub Command6_Click() '断开连接If MSComm1.PortOpen = True ThenMSComm1.PortOpen = FalseEnd Ifxianshi.Caption = "串口未连接"xianshi.ForeColor = vbRedEnd SubPrivate Sub exit_Click() '退出程序'先断开端口再退出程序If MSComm1.PortOpen = True Then MSComm1.PortOpen = FalseUnload MeEndEnd SubPrivate Sub Form_Load() '初始化界面*************************************xianshi.Caption = "串口未连接"xianshi.ForeColor = vbRedPicture1.ClsPicture1.BackColor = vbBlackMSComm1.InputLen = 0 '接收一次则清空**********************很重要的一句***************************************MSComm1.RThreshold = 100 '1 个字符产生接收事件**********************很重要的一句***************************************ji_shu = 0End SubPrivate Sub lian_jie_Click() '连接串口*******************************************On Error GoTo err/doc/7612893214.html,mPort = Val(Combo1.Text)MSComm1.Settings = Trim(Combo2.T ext) & ",n,8,1"If MSComm1.PortOpen = False ThenMSComm1.PortOpen = TrueEnd Ifxianshi.Caption = "串口已经连接"xianshi.ForeColor = vbBlueerr:If err = 8002 ThenMsgBox ("无效的端口号!请检查端口连接!")End IfEnd SubPublic Function hua() '画数组shuju(100)的二进制数的曲线*************************************************'首先清除picture1内的图形Picture1.ClsPicture1.BackColor = vbBlack'Scale方法设定用户坐标系,坐标原点在Picture1中心Picture1.ScaleMode = 0Picture1.ScaleMode = 3Picture1.Scale (-10, 10)-(10, -10) '用户重新定义坐标为(-10,10)-(10,-10)'设置绘线宽度Picture1.DrawWidth = 1'绘坐标系的X轴及箭头线??Picture1.Line (-10, 0)-(10, 0), vbBlue '画线Picture1.Line (9, 0.5)-(10, 0), vbBlue '画线上半箭头Picture1.Line -(9, -0.5), vbBluePicture1.ForeColor = vbGreenPicture1.Print "X" '在显示完后显示X'绘坐标系的Y轴及箭头线Picture1.Line (0, 10)-(0, -10), vbBluePicture1.Line (0.5, 9)-(0, 10), vbBluePicture1.Line -(-0.5, 9), vbBluePicture1.Print "Y"'指定位置显示原点OPicture1.CurrentX = 0.5Picture1.CurrentY = -0.5Picture1.Print "O"'重设绘线宽度Picture1.DrawWidth = 1'Picture1.PSet (a, Sin(a) * 5), vbRed '难道这是画点程序Picture1.CurrentX = -10 '指定显示点Picture1.CurrentY = 0'用For循环绘点,使其按正弦规律变化。
基于VB6.0的串口通信方法
基于VB6.0的串口通信方法串口通信在数据采集中有着广泛的应用,因为串口通信通信线路简单、灵活方便、数据可靠。
作为快速开发,利用VB开发串口通信程序既可以使用MSComm控件也可以调用WindowsAPI函数实现。
这里我们使用VB6.0提供的MSComm控件,因为MSComm控件的功能和API调用一样强,甚至更好且使用起来更加简单,能很方便地实现所需的串口通信功能。
1.MSComm控件简介MSComm控件是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。
具体的来说,它提供了两种处理通信问题的方法:一是事件驱动方法,当串口通信产生错误时,MSComm控件会触发OnComm事件,程序员可以在OnComm事件处理函数中加入自己的处理代码。
另外一种是查询法。
查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。
在程序的每个关键功能之后,可以通过检查CommEvent属性的值来查询事件和错误。
2.MSComm控件的常用属性MSComm控件有很多重要的属性,但首先必须熟悉几个关键属性。
CommPort 设置并返回通讯端口号Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位PortOpen 设置并返回通讯端口的状态。
也可以打开和关闭端口Input 从接收缓冲区返回和删除字符Output 向传输缓冲区写一个字符串3.程序代码设计利用MSComm控件编写串口通信程序是十分便利和简单的。
下面我就事件驱动方式以VB6.0为平台编写了PC间串口通信程序的实例。
代码如下:'串口初始化PrivateSubForm_Load()mPort=1 '设置通信端口号为COM1MSComm1.Settings="9600,n,8,1" '设置串口参数MSComm1.InputMode=0 '接收文本型数据MSComm1.RThreshold=1'接收缓冲区每收到一个字符都会使MSComm控件触发OnComm事件MSComm1.PortOpen=True '打开通信端口1EndSub'把字符通过串口发送出去'启动定时器PrivateSubCmdsend_Click()IfTextsend.Text=""Thenpp=MsgBox("发送的数据不能为空!",16)ExitSubEndIfMSComm1.Output=Trim(Textsend.Text)EndSub'MSComm的OnComm事件程序'由CommEvent属性值的不同,将各自的程序代码写入相关的子程序中'只要RThresold中的设定字符数到达时便会使得CommEvent属性值变成comEvReceive'因此接收的子程序便会被执行PrivateSubMSComm1_OnComm()Dimbuf$mEvent'通过取代每一个case表达式来处理每个事件与错误CasecomEvCD'CD线的状态发生变化CasecomEvCTS'CTS线的状态发生变化CasecomEvDSR'DSR线的状态发生变化CasecomEvReceivebuf=Trim(MSComm1.Input)'将缓冲区内的数据读入buf变量中CasecomEvSendEndSelectTextReceive.Text=TextReceive.Text&bufEndSub'停止程序运行PrivateSubCmdquit_Click()UnloadMeEndSub'关闭通信端口,PrivateSubForm_Unload(CancelAsInteger)MSComm1.PortOpen=FalseEndSub4结束语本文通过具体实例介绍了如何利用VB6.0中的MSComm控件来实现串口通信。
VB串口通信(附图教程)
界面如下:代码如下:Private Sub Form_Load()If MSComm1.PortOpen = True Then MSComm1.PortOpen = False ElseEnd IfCombo1.AddItem "COM1"Combo1.AddItem "COM2"Combo1.AddItem "COM3"Combo1.AddItem "COM4"Combo1.AddItem "COM5"Combo1.AddItem "COM6"Combo1.AddItem "COM7"Combo1.AddItem "COM8"Combo1.AddItem "COM9"Combo1.AddItem "COM10" Combo1.AddItem "COM11" Combo1.AddItem "COM12"Combo1.AddItem "COM13"Combo1.AddItem "COM14"Combo1.AddItem "COM15"Combo1.AddItem "COM16"Combo1.ListIndex = 2Combo2.AddItem "256000"Combo2.AddItem "128000"Combo2.AddItem "115200"Combo2.AddItem "57600"Combo2.AddItem "38400"Combo2.AddItem "28800"Combo2.AddItem "19200"Combo2.AddItem "14400"Combo2.AddItem "12800"Combo2.AddItem "11520"Combo2.AddItem "9600"Combo2.AddItem "4800"Combo2.AddItem "2400"Combo2.AddItem "1200"Combo2.AddItem "600"Combo3.AddItem "无None"Combo3.AddItem "奇Odd"Combo3.AddItem "偶Even"Combo4.AddItem "4"Combo4.AddItem "5"Combo4.AddItem "6"Combo4.AddItem "7"Combo4.AddItem "8"Combo5.AddItem "1"Combo5.AddItem "2"mPort = Combo1.ListIndex + 1 MSComm1.Settings = "9600,n,8,1"ComOpen.Caption = "打开串口"Shape1.FillColor = &HFFFFC0End SubPrivate Sub ComOpen_Click()On Error GoTo uerror '发现错误跳转到错误处理If ComOpen.Caption = "关闭串口" ThenMSComm1.PortOpen = FalseComOpen.Caption = "打开串口" '按钮文字改变Shape1.FillColor = &HFFFFC0 '灯颜色改变ElseMSComm1.PortOpen = TrueComOpen.Caption = "关闭串口"Shape1.FillColor = &HFFEnd IfExit Subuerror:msg$ = "无效端口号" '错误显示Title$ = "串口调试助手"X = MsgBox(msg$, 48, Title$) '48标示显示警告图标End SubPrivate Sub MSComm1_OnComm()Dim BytReceived() As ByteDim strBuff As StringDim i As IntegerSelect Case mEvent '事件发生Case 2ClsMSComm1.InputLen = 0 '读入缓冲区全部内容strBuff = MSComm1.Input '读入到缓冲区Label10.Caption = Label10.Caption + Len(strBuff) '接收计数If MSComm1.InputMode = comInputModeBinary ThenBytReceived() = strBuff '如果是二进制接收模式则进行数据处理,否则直接显示字符串For i = 0 To UBound(BytReceived)If Len(Hex(BytReceived(i))) = 1 ThenstrData = strData & "0" & Hex(BytReceived(i)) & " " '如果只有一个字符,则前补0,如F显示0F,最后补空格Else '方便显示观察如:00 0F FEstrData = strData & Hex(BytReceived(i)) & " "End IfNextTextReceive = TextReceive & strDatastrData = ""ElseTextReceive = TextReceive & strBuffEnd IfEnd SelectEnd SubPrivate Sub ComSend1_Click() '手动发送Dim Temp(0) As ByteDim strBuff As StringIf Option1.Value = True Then '如果显示16进制发送则进行16进制处理,这里只发送一个Temp(0) = "&H" & TextSendMSComm1.Output = Temp '发送一个16进制ElsestrBuff = TextSendEnd IfIf MSComm1.PortOpen = False ThenMsgBox "请打开串口"End IfOn Error GoTo uerrorMSComm1.Output = strBuffLabel11.Caption = Label11.Caption + Len(strBuff) '发送计数uerror:End SubPrivate Sub ComSend2_Click()If ComSend2.Caption = "自动发送" ThenComSend2.Caption = "关闭自动发送"Timer1.Interval = TextTime.TextTimer1.Enabled = TrueElseComSend2.Caption = "自动发送"Timer1.Enabled = FalseEnd IfEnd SubPrivate Sub ComClean1_Click()TextSend.Text = "" '清空发送窗口End SubPrivate Sub Option3_Click()MSComm1.InputMode = comInputModeBinary '选择接收方式End SubPrivate Sub Option4_Click()MSComm1.InputMode = comInputModeText '选择接收方式End SubPrivate Sub Timer1_Timer()Call ComSend1_Click '定时调用手动发送End SubPrivate Sub Timer2_Timer()If Combo3 = "无None" ThenMSComm1.Settings = Str(Combo2) + "N" + Str(Combo4) + Str(Combo5) ElseIf Combo3 = "奇Odd" ThenMSComm1.Settings = Str(Combo2) + "O" + Str(Combo4) + Str(Combo5) ElseIf Combo3 = "偶Even" ThenMSComm1.Settings = Str(Combo2) + "E" + Str(Combo4) + Str(Combo5) End IfEnd SubPrivate Sub Combo1_Click()If MSComm1.PortOpen = True Then '如果串口打开先关闭后再进行其他操作MSComm1.PortOpen = FalseEnd IfmPort = Combo1.ListIndex + 1 '读取com口号End SubPrivate Sub ComClean3_Click()Label10.Caption = 0Label11.Caption = 0End SubPrivate Sub ComClean2_Click()TextReceive.Text = "" '接收窗口End Sub功能上:实现了字符串的发送和接收,8位数据的十六进制发送和接收,有端口,波特率等设置。
VB三种读取串口数据的方式
VB三种读取串口数据的方式3三种读取串口数据的方式vb提供的这个通信控件“隐藏”了大部分串口通信的底层运行过程,程序员只需编写少量的代码就可以完成软件的开发过程。
在通信数据量不大,通信要求不是很高的情况下建议采取此方式。
(1)settings属性:以字符串的形式设置并回到波特率、奇偶校验位、数据位、暂停位。
这个属性很关键,针对相同的终端设备须要根据设备的具体情况展开调整(比如说日本的设备不同于美国的设备,通常可以使用奇校验)。
(2)inputmode属性:设置接收数据的类型,0为文本格式,1为二进制格式。
(3)input属性:读取并删除接收缓冲区中的数据流。
(4)output属性:向发送缓冲区传送一数据流。
(6)handshaking属性:设置和回到击掌协议,即为计算机内部cpu与串口之间的通讯协议,确保在缓冲区负载时数据不能遗失。
这个属性在确保数据传输的正确性方面存有非常大的促进作用,共计四个选项,分别则表示:①并无流控制;②软件流控制;③硬件流控制;④软硬件流控制。
使用硬件流控时,建议串口之间和电缆积极支持硬件击掌,在自己制作串口通信线时,有关硬件击掌的线rts、cts、dsr、dtr必须相连接恰当。
在正确设置这些属性的基础上,剩下的就是打开串口,通过串口发送及接受数据了。
本文后续章节利用一个实例详细讲解了这些属性的设置及具体代码。
3.2轻易调用win32api通信函数直接调用windowsapi函数,可以清楚地理解串口通信的机制,根据需要灵活地配置串口的各种参数和属性,而且直接调用低层api函数,通信效率比较高,但付出的代价就是程序较复杂,编程周期长,适合于大型通信程序及通讯质量要求较高的场合。
在32位的windows系统中,串口通信就是做为文件处置的,串口操作方式通常为关上、停用、加载、载入等操作方式,适当的windowsapi函数如下:[4](1)createfile()函数:实现串口的初始化并打开串口,返回串口句柄资源以供后续进程调用。
VB串口通信数据采集
VB串口通信数据采集2009-05-12 18:40前两天受人之托写的一个程序,发上来共享,从中可以看到串口通信的常用处理方式,希望对大家有所帮助。
一、系统需求:使用三线制串口,利用vb与dsp通信,采集数据并存储为文本文件。
二、通信协议1. RS232串行通信的波特率设为9600,8位数据位,一位停止位,无校验位。
2. 每组数据包含T1(16位)和T2(16位),将每个数据分成2个8位的数据,先是低8位,然后是高8位。
数据为无符号整型。
先发T1,然后发T2,然后是下一组T1、T2。
T1以头数据0x0A(16进制,10进制位10)为头字节,然后是T1的低8位,T1的高8位。
T2以头数据0xA0(16进制,10进制位160)为头字节,然后是T2的低8位,T2的高8位。
发送时序举例:0x0A, t1低8位,t1高8位,0xA0, t2低8位,t2高8位……将收到的数据T1、T2的高低8位合并,转换成10进制数,以每行T1 T2的形式存储到txt文本文件中。
三、要点说明0. 如果通信协议没有考虑周全就着手开始做,可能会经受无比的痛苦1. 文本框textbox的大小限制为32k,不符合大量数据的需要,因此使用richtextbox2. 换行符为Chr(&HD) + Chr(&HA)3. 需要用状态栏给出必要的信息4. 保存文件的默认名字为当前日期5. 收到comm事件后,需要关闭com事件接收,避免再次触发事件Dim av As VariantDim datacount As LongPrivate Sub cmdClear_Click()txtData.Text = ""End SubPrivate Sub cmdStop_Click()'关闭端口If MSComm.PortOpen = True ThenMSComm.InBufferCount = 0 '清空缓冲区MSComm.PortOpen = FalseEnd IfcmdReceive.Enabled = TruelblStatus.Caption = "停止接收,空闲"End SubPrivate Sub cmdReceive_Click()'串口设置With MSComm.CommPort = 1.Settings = "9600,N,8,1".RThreshold = 1 '接收1字节触发oncomm事件.InputMode = comInputModeBinary.InputLen = 1 '输入长度为1.InBufferCount = 0 '清除接收缓冲区End With'打开端口If MSComm.PortOpen = False ThenMSComm.PortOpen = TrueIf Err ThenMsgBox (Err.Description)Exit SubEnd IfEnd IflblStatus.Caption = "打开端口,等待接收" datacount = 0cmdReceive.Enabled = FalseEnd SubPrivate Sub cmdSave_Click()Dim outfn As StringMsgBox ("接收了" + CStr(datacount) + "组数据") lblStatus.Caption = "接收完成,请选择输出文件"cmdReceive.Enabled = True'选择输出文件CommonDialog1.FileName = CStr(Date) + ".txt"CommonDialog1.Filter = "Text Files|*.txt"CommonDialog1.Flags = CommonDialog1.Flags Or cdlOFNOverwritePrompt CommonDialog1.CancelError = TrueOn Error GoTo errhandlerCommonDialog1.ShowSaveoutfn = CommonDialog1.FileNameOpen outfn For Output As #1Print #1, txtData.TextClose #1'txtData.SaveFile outfnlblStatus.Caption = "输出完成,空闲"errhandler:Exit SubEnd SubPrivate Sub Form_Load()lblStatus.Caption = "空闲"End SubPrivate Sub Form_Unload(Cancel As Integer)'关闭端口If MSComm.PortOpen = True ThenMSComm.InBufferCount = 0 '清空缓冲区MSComm.PortOpen = FalseEnd IfEnd SubPrivate Sub MSComm_OnComm()Dim T1, T2 As LongSelect Case mEventCase comEvReceive '收到Rthreshold个字节产生的接收事件MSComm.RThreshold = 0 '关闭OnComm事件接收lblStatus.Caption = "接收"av = MSComm.Input '读取一个接收字节dataframe(1) = av(0) '转换为字节If dataframe(1) = &HA Then '接收到T1DoDoEventsLoop Until MSComm.InBufferCount >= 2 '循环等待接收缓冲区>=2个字节av = MSComm.Inputdataframe(2) = av(0)av = MSComm.Inputdataframe(3) = av(0) '接收T1T1 = dataframe(2) + CLng(dataframe(3)) * 256 '计算T1End IfDoDoEventsLoop Until MSComm.InBufferCount >= 1 '循环等待接收缓冲区>=1个字节av = MSComm.Input '读取一个接收字节dataframe(4) = av(0) '转换为字节'接收到T2If dataframe(4) = &HA0 Then'MSComm.RThreshold = 0 '关闭OnComm事件接收'循环等待接收缓冲区>=2个字节DoDoEventsLoop Until MSComm.InBufferCount >= 2av = MSComm.Inputdataframe(5) = av(0)av = MSComm.Inputdataframe(6) = av(0) '接收T2T2 = dataframe(5) + CLng(dataframe(6)) * 256 '计算T2'显示T1 T2 entertxtData.Text = txtData.Text + CStr(T1) + " " + CStr(T2) + Chr(&HD) + Chr(&HA)datacount = datacount + 1 '数据组数+1End IfMSComm.RThreshold = 1 '打开OnComm事件接收Case ElseEnd SelectEnd Sub。
VB串口数据接收方式
1、在OnComm 事件中接收数据:这种方式能充分MSCOMM控件的特性。
OnComm 事件还可以检查和处理通讯错误;可以通过检查CommEvent 属性的值来查询事件和错误;对于不定长数据以及对数据进行处理比较复杂的情况,此法不是很方便。
Private Sub MSComm_OnComm ()Select Case mEvent' 错误Case comEventBreak ' 收到Break。
Case comEventCDTO ' CD (RLSD) 超时。
Case comEventCTSTO ' CTS Timeout。
Case comEventDSRTO ' DSR Timeout。
Case comEventFrame ' Framing ErrorCase 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 SelectEnd Sub2.轮循法采集数据:A、定时器轮循法对于数据包方式收发数据以及不需即时响应情况,用轮循法更好些。
基于VB6.0的串口发送接收程序
Public a, mun, m As Integer '定义全局变量a,mPrivate Sub Command1_Click() '步进度控制a = a + 1 '没按一次加一If a > 4 Then a = 0 '到四返0If a = 0 Then mun = 5 '下边几个为相应的步进档的显示值If a = 1 Then mun = 25If a = 2 Then mun = 50If a = 3 Then mun = 75If a = 4 Then mun = 100Text1 = munText2 = munText4 = munEnd SubPrivate Sub Command2_Click() '顺时针转动Dim temp(0) As Byte '定义串口输出数据类型On Error GoTo aatemp(0) = "&H" & a '把数据类型转化为十六进制MSComm1.OutBufferCount = 0 '清空串口输出缓冲器MSComm1.Output = temp '把数据送入串口aa:If Err.Number = 8018 Then MsgBox "串口无效,请更换串口号!" '当串口无效时候显示'Else'MsgBox "ERROR"'End IfResume NextEnd SubPrivate Sub Command3_Click() '逆时针转动On Error GoTo bb '定义串口输出数据类型Dim temp(0) As ByteDim b As Integerb = a '先把步进度暂时存放起来,赋值完再赋还给a;以免影响下次使用a = a + 5temp(0) = "&H" & a '把数据类型转化为十六进制MSComm1.OutBufferCount = 0 '清空串口输出缓冲器MSComm1.Output = temp '把数据送入串口a = bbb:If Err.Number = 8018 Then MsgBox "串口无效,请更换串口号!" '当串口无效时候显示'Else'MsgBox "ERROR"'End IfResume NextEnd SubPrivate Sub Command4_Click() '串口号选择,以下为串口初始化设置On Error GoTo wwm = Text3.TextmPort = m '使用COM 1 作为通信端口MSComm1.Settings = "9600,n,8,1" '波特率为9600, 无奇偶校验位, 8 个数据位, 一个停止位MSComm1.InputMode = comInputModeText '文本形式接收数据MSComm1.OutBufferSize = 5000MSComm1.InputLen = 0MSComm1.RThreshold = 1 '一次从接收缓冲区中读取全部字符数MSComm1.SThreshold = 0 '取全部字符数数If MSComm1.PortOpen = False ThenMSComm1.PortOpen = True '若COM 1 关闭则打开End Ifww:If Err.Number = 8002 Then MsgBox "串口无效,请更换串口号!" '当串口无效时候显示'Else'MsgBox "ERROR!"'End IfResume NextEnd SubPrivate Sub Form_Load() '窗口初始化设置Form1.Width = 14000Form1.Height = 9000 '窗口大小a = 0 '下边这几个是几个人控件的初值b = 0Text3 = 1Text1 = 5Text2 = 5Text4 = 5End SubPrivate Sub MSComm1_OnComm() '接收数据程序Select Case mEventCase comEvReceive ' '当串口无效时候显示R th resho ld 时引起O nComm 事件Text1.Text = Text1.Text + MSComm1.InputEnd SelectEnd Sub。
VB下实现串口通信的方法
VB下实现串口通信的方法1 VB下实现串口通信的方法1.1 通信控件MSComm简介VB下的串行端口通信是通过其提供的控件Microsoft Comm control(简称MSComm)实现的。
该控件屏蔽了通信过程中的底层操作,程序员只需设置并监视MSComm控件的属性和事件,结合其它VB提供的控件就可完成对串口的初始化和数据的发送接收。
本系统中用到的主要MSComm控件属性如下:①、Commport:设置并返回通信端口代码。
默认值为1,最大值为16,需要使用超过16个通信端口时,要采用其他方式操控通信端口(如PcommPro软件)。
例如将串口2设为通信端口:mPort=2。
②、Setting:设置初始化参数。
其格式为“****,P,D,S”,其中****为波特率(baud),P为校验方式,D为数据位数,S为停止位。
默认值为“9600,N,8,1”,意为“串口通信速度为9600Baud,无校验,每次数据为8个Bit,停止位为1个Bit”。
波特率可为110,300,600,1200,2400,9600,14400,19200,28800,38400(保留)等等。
校验位默认为None(无校验),若传输距离长,可增加校验位,可选M为符号校验,E为偶校验,O为奇校验,S为空白校验。
停止位的设定值可为:1(默认值),1.5,2。
此处的设置要和单片机侧的设置保持一致,否则不能实现正常的通信。
例如我们采用的初始化参数为“2400,N,8,1”,则单片机侧的设置相应项为:定时器1的初值为E6并且SMOD(串行口波特率加倍位)为1(对应2400Bit),串口控制寄存器SCON为40(10位异步收发,对应8Bit数据位,1Bit停止位)。
③、PortOpen:设置或返回通信端口状态。
④、Input:从缓冲区返回并删除字符。
将串行输入寄存器的数据读出,并清除寄存器中已读取的数据。
寄存器的特性是FIFO(First In First Out,先进先出)。
用VisualBasic实现串口通信的三种方法
2. 利用通信控件的实例
Sub Form1 —load ()
form1. show ′设置 COM1
comm1. commport = 1
comm1. Setting = " 9600 ,o ,8 ,1" ′波特率 : 9600 奇校验 ,8
位数据 ,1 位停止位
comm1. Inputlen = 0
一 、利用通信控件( MSCOMM) 完成串口通信
VB 提供了通信控件 MSCOMM,文件名为 MSCOMM. VBX。 该控件可设置串行通信的数据发送和接收 ,对串口状态及串 行通信的信息格式和协议进行设置 。在通信过程中可以触发 OnComm 事件 ,在该事件过程进行数据检验处理及检错 ,还可 以通过编程访问 CommEvent 属性来了解通信的情况 ,进行收 发数据的处理 。每个通信控件对应一个串口 ,如果要访问多 个通信口 ,则要设计多个通信控件 。
利用 VB 提供的这些功能 ,我们可以有三种方法完成串 口通信 。一种是用 VB 提供的具有强大功能的通信控件 ;另一 种方法是调用 WINDOWS API 函数 ,使用 WINDOWS 提供的 通信函数编写移植性强的应用程序 ;第三是利用文件的输 入/ 输出完成 ,该方法简便易行 ,但有一定的局限性 。
EofChar As String 3 1
·6 ·
参数 As 类型 ]) As 类型 在声明中 :DECLARE 表示声明 DLL 中的函数 ,当声明是
不具有返回值的过程时用 SUB 关键字 ,而如果调用的函数具 有返回值 ,则必须用 FUNCTION 关键字将其声明为函数并在 声明语句的最后用 AS 指明函数返回值的类型 。LIB 关键字表 示当前声明的过程或函数是库名所指定的库中函数而非 VB 本身的函数 。库名 ,就是对应动态链接库的名称 ,其中通信函 数在 USER 库中 。ByVal 关键字将原参数数据类型一一对应到 VB 类型中 。
VB环境下利用MSComm控件发送和接收数据
’()!"%$"%$,6!"%$"#$, #-./0) 学 习 内 容 形 式 为 文 本 形 式 , !/78/) 学习内容形式为多媒体形式 , $ ’()!"#$"%$,6!"#$"#$, #-./0) 学 习 策 略 为 教 材 学 习 , ! /78/) 学习策略为题库学习 , $ ’()!"&$"%$,6!"&$"#$, #-./0) 考 核 方 式 为 主 观 题 考 核 , !/78/) 考核方式为客观题考核 , $
-’(&’( ! 向 发 送 缓 冲 区 中 写 入 数 据 # 在 设 计 阶 段 时
无效 $ 运行阶段时为只读 %
./01,20*3+ ! 在 )45*66 控 件 设 置 5*6678,%( 属 性为 5*6678.,9,:8, 并产生 -%5*66 事件之前 $ 设置 或返回要接收的字符数 " 4/01,20*3+! 在 )45*66 控件设置 5*6678,%( 属性 为 5*66784,%+ 并 产 生 -%5*66 事 件 之 前 $ 指 定 发 送 缓冲区中允许的最少字符数 " 4,((:%;2 ! 设 置 或 返 回 初 始 化 参 数 $ 即 波 特 率 & 奇 偶
I1:8D(, 4’J .:90/,K(G*KLM,HI1,22 <M,HN29:: N2 $%! (,;,1> ( 将 键 盘 键 入 的 字 符 传 给 .:90/,K(G*K 控 件 和
!""#
!!
性接收数据 !
I1:8D(, 4’J 5*66D%+=L53:9Q<> ( 用户单击 5*66D%+= 按钮后读取输入缓冲区中的
利用VB如何进行串口读写
利用VB如何进行串口读写今天说下利用VB如何进行串口读写。
首先需要的是在VB中增加一个microsoft comm control 6.0的控件。
步骤就是:工程->部件->点击microsoft comm control 6.0->确定。
先介绍一下必须熟悉几个属性:CommPort 设置并返回通讯端口号。
Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。
PortOpen 设置并返回通讯端口的状态。
也可以打开和关闭端口。
Input 从接收缓冲区返回和删除字符。
Output 向传输缓冲区写一个字符串。
然后利用给大家一个读串口的小例程:Private Sub Form_Load()mPort = 1 '选择com1Mcom.Settings = "115200,N,8,1" '设置波特率为115.2kpbs,没有奇偶校验,8位数据位,1位结束位Mcom.InputLen = 0 '读取全部的输入缓冲区If Mcom.PortOpen = False Then Mcom.PortOpen = True '端口打开Mcom.RThreshold = 2Mcom.SThreshold = 2End SubPrivate Sub Mcom_OnComm() '所有的通讯事件都可以激发MSComm1控件的OnComm事件Select Case mEventCase comEvReceive'此处的代码可以进行当串口的接受缓冲区里有RThreshold个字符的处理Text4 = Text4 & Mcom.InputCase comEvSend'此处的代码可以进行当串口的发送缓冲区里有SThreshold个字符的处理End SelectEnd SubPrivate Sub Form_Unload(Cancel As Integer)If Mcom.PortOpen = True Then Mcom.PortOpen = FalseEnd Sub利用上面的小程序,我们就可以通过读到外设给串口发出的数据了。
VB中串口通讯的实现详解说明
VB中串口通讯的实现详解说明在VB中实现串口通讯可以分为以下几个步骤:1.引用串口通讯相关的命名空间首先在项目中引用System.IO.Ports命名空间,该命名空间包含了实现串口通讯所需的类和方法。
2.创建串口对象使用SerialPort类创建一个串口实例,可以指定串口的名称、波特率、数据位、停止位、校验位等参数。
```vbDim serialPort As New SerialPortserialPort.PortName = "COM1"serialPort.BaudRate = 9600serialPort.DataBits = 8serialPort.StopBits = StopBits.OneserialPort.Parity = Parity.None```3.打开串口使用Open方法打开串口,可以在Open之前先判断串口是否已经打开。
```vbIf serialPort.IsOpen Then'串口已经打开ElseserialPort.OpenEnd If```4.串口数据接收通过事件处理函数来处理串口接收到的数据。
可以使用DataReceived事件来处理数据接收,当串口接收到数据时会触发该事件。
```vbPrivate Sub SerialPort_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles serialPort.DataReceived Dim data As String = serialPort.ReadExisting'处理接收到的数据End Sub```5.串口数据发送通过串口的Write方法来发送数据。
```vbserialPort.Write("Hello World")```需要注意的是,串口通讯是一种异步操作,发送和接收数据都需要一定的时间,因此在程序中需要合理处理串口的状态。
VB(11)第五章 串口通信方法与实现1
(9) InBufferSize 属性 语 法: MSComm1.InBufferSize [= Value] 设置或返回接收缓冲区大小。 作 用:设置或返回接收缓冲区大小。 类 型:Integer型 型 接收缓冲区的字节数, 取 值 : 接收缓冲区的字节数 , 默认值为 1024字节。 字节。 字节 InBufferSize 属性的最大值为:32767 属性的最大值为: 字节。 字节。 说 明 : InBufferSize 值应根据需要选 取。
(10) InputMode属性 属性 语 法: MSComm1.InputMode [=Value] 设置或返回接收数据的数据类型。 作 用 : 设置或返回接收数据的数据类型 。 类 型:Integer型 型 接收文本型数据; 取 值:0 - 接收文本型数据; 1 - 接收二进制数据。 接收二进制数据。 说 明:InputMode 属性决定 Input 属 性取回数据的格式是字符串还是二进制数据的 数组。 数组。
1 0 00110001 接收速度 0 1 0 0 1 1 1 0 原始信号 发送速度
2. 数据的传送单位(数据包含的位数) 数据的传送单位(数据包含的位数) 例如: 个起始位 例如:1个起始位 + 8个数据位 + 0个校验 个数据位 个校验 位 + 1个停止位 个停止位 数据格式共有10位 所以通信中最小的传 数据格式共有 位, 所以通信中最小的传 输单位是10位。 输单位是 位 每秒钟传输的字节数(波特率为9600bps, 每秒钟传输的字节数(波特率为 , 采用十位数据格式, 采用十位数据格式,则: 9600/10 = 960(字节 秒) (字节/秒 传输1M字节的数据,需要的时间为: 字节的数据, 传输 字节的数据 需要的时间为: 1000000/960 ≈ 17(分) ( 因此, 因此,串口通信通常用在数据量不是很大 的场合。 的场合。
VB串口-上位机与下位机通信
VB串口-上位机与下位机通信实验
在这里分享一下我在调试VB串口程序遇到的问题和解决的方法,之前在网上老是找不到,希望对需要的人有所帮助。
——csy(2011.06.05)
1、VB接收数据。
在VB程序中定义一个数组接收下位机发送的数据。
一开始发现:VB定义的数组并没有接收到下位机发来的数据或者是数据出错,经调试发现:是VB串口控件是在接收到字符’/n’时默认接收数据完毕,并产生接收中断,之后才能对接收数据进行处理。
最后我在下位机发送数据的最后一个字节发送符号’/n’,这样问题得到解决。
2、VB出现“下标越界”错误提示。
在下位机定义一个20字节的数组发给上位机,但是当VB程序运行到一定时间之后会出现“下标越界”错误提示。
经仔细调试发现:当出现错误时,VB串口接收到的数组长度为2或者其他值,而不是原先的20。
经分析,之所以出现这样的问题是由于下位机传输的数据里有与字符’/n’等值的数据,所以VB串口提前进入接收完毕处理。
由于接收到的字节数没有预期的20个。
所以出现错误。
用VB6.0实现串口数据自动接收的2种方法
用VB6.0实现串口数据自动接收的2种方法
姜敏夫
【期刊名称】《北华大学学报(自然科学版)》
【年(卷),期】2004(005)004
【摘要】提出用Visual Basic 6.0实现串口数据自动接收的方法.采用查询和中断的方式,在不影响应用程序正常工作的情况下,能够保证接收数据的时效性和准确性.【总页数】2页(P377-378)
【作者】姜敏夫
【作者单位】吉林化工学院,自动化系,吉林,吉林,132012
【正文语种】中文
【中图分类】TP312
【相关文献】
1.用PComm实现多线程串口数据接收 [J], 杜松;李小兵
2.基于Qt的多串口多协议数据接收解析软件的设计与实现 [J], 佘立;李志强
3.基于时间间隔的嵌入式系统通用串口数据接收设计与实现 [J], 宁占彬;张海鹏;于仲华
4.单片机模拟串口数据接收程序的实现及优化 [J], 郏正学;李炜
5.单片机实现数据的串口发送与接收 [J], 程阳;
因版权原因,仅展示原文概要,查看原文内容请购买。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、在OnComm 事件中接收数据:这种方式能充分MSCOMM控件的特性。
OnComm 事件还可以检查和处理通讯错误;可以通过检查CommEvent 属性的值来查询事件和错误;对于不定长数据以及对数据进行处理比较复杂的情况,此法不是很方便。
Private Sub MSComm_OnComm ()Select Case mEvent' 错误Case comEventBreak ' 收到Break。
Case comEventCDTO ' CD (RLSD) 超时。
Case comEventCTSTO ' CTS Timeout。
Case comEventDSRTO ' DSR Timeout。
Case comEventFrame ' Framing ErrorCase 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 SelectEnd Sub2.轮循法采集数据:A、定时器轮循法对于数据包方式收发数据以及不需即时响应情况,用轮循法更好些。
实际上轮循法最大的好处在于集中处理数据而且不太占用CPU。
轮循法要注意定时采集的时间片段大小;这里用二进制收发模式;使属性RThreshold、SThreshold为0,屏蔽ONCOMM事件。
InputMode = comInputModeBinaryRThreshold = 0SThreshold = 0Private Sub TmrComm_Timer()'采用轮循法采集数据Dim Rx_buff() As ByteDim okstring As StringDim ReceivedLen As IntegerOn Error GoTo ErrorHandlerTmrComm.Enabled = False '关闭定时器If commport.InBufferCount > 0 ThenReceivedLen = commport.InBufferCountRx_buff = commport.Inputokstring = StrConv(tempbyte, vbUnicode)If ReceivedLen = 6 ThenIf Chr(tempbyte(0)) = ":" And tempbyte(3) = &h0a Then ....End IfIf Instr(okstring ,":@END*",vbBinaryCompare) Then ....End IfEnd IfTmrComm.Enabled = True '打开定时器End SubB、直接轮循法此法用于接收少量控制命令字;' 保存输入子串的缓冲区Dim Instring As String' 使用COM1。
mPort = 1' 9600 波特,无奇偶校验,8 位数据,一个停止位。
MSComm1.Settings = "9600,N,8,1"' 当输入占用时,' 告诉控件读入整个缓冲区。
MSComm1.InputLen = 0' 打开端口。
MSComm1.PortOpen = True' 将attention 命令送到调制解调器。
MSComm1.Output = "A TV1Q0" & Chr$(13)' 确保' 调制解调器以"OK"响应。
' 等待数据返回到串行端口。
DoDoEventsBuffer$ = Buffer$ & MSComm1.InputLoop Until InStr(Buffer$, "OK" & vbCRLF)' 从串行端口读"OK" 响应。
' 关闭串行端口。
MSComm1.PortOpen = False如何处理不定长数据的接收在处理串口通讯时,经常会遇到不定长数据的接收。
由于通讯任务不同及编程要求的差异所以采用的方法也有所不同。
本文就此问题进行探讨。
不定长数据从数据格式上分,可分为有格式和无格式。
一、无格式不定长数据的接收这种格式在实际串口通讯中用得不多,一般只用传送字符串数据。
问题在于怎么判断接收结束。
一般用时间延迟的方法解决。
A、对于非握手式通讯,可用一个定时器定时轮循接收,并假定每个轮循接收完成。
用ONCOMM事件接收也可,只是不如定时器定时轮循接收简便。
B、对于握手方式通讯,可用直接轮循法提高接收的准确性。
下面是实现此法的函数:Function sComm(sCommand As String, comReceive As MSComm) As StringDim nReceiveCount As IntegerIf comReceive.PortOpen = False ThencomReceive.PortOpen = TrueEnd IfcomReceive.Output = sCommandDonReceiveCount = comReceive.InBufferCountsleep (2) 'API 函数,挂起当前进程一段时间Loop Until comReceive.InBufferCount = nReceiveCountIf comReceive.PortOpen = True ThensComm = comReceive.InputEnd IfEnd Function注:此函数参照了xth一文。
此法一般是能确保数据接收的正确,但由于WINDOWS是多任务操作系统,当有耗时的进程运行时会丢失数据。
如果系统会出现这种情况,可增大函数sleep()的参数值。
二、不定长格式数据的接收对于不定长数据接收最好的方法是制定通讯协议,比如定义开始字符和结束字符。
由于单片机系统通讯一般不太复杂,没必要去制定一套象通用计算机间通讯的协议,而根据单片机系统的大小和性能要求制定通讯协议。
实际上为便于交流、维护以及一致性,可制定一套可伸缩的通讯协议。
定义了开始字符和结束字符就容易实现不定长格式数据通讯,但在实际通讯编程还是容易出现一些比较隐蔽的通讯错误。
下面就常用方法分别进行分析。
A、定时器轮循法。
假定每个轮循期数据接收完毕,并在每个轮循期处理数据,由于有开始字符和结束字符很容易确定接收数据的完整性。
好象合理设定轮循时间值就万无一失了,但被动接收数据时无论如何也找不合适的轮循时间值,因为启动定时器和数据到来基本不同步,这就会出现一次发送的数据被分在两个轮循期接收,所以被动接收数据时不能假定每个轮循期数据接收完毕。
在接收到结束字符后才确定一次数据接收完毕就可解决此问题。
B、OnComm事件法。
方法和定时器轮循法基本相同,因为每次OnCommg事件也只能接收到一部分数据。
在VB 的在线帮助中这样注解“设置Rthreshold 为1,接收缓冲区收到每一个字符都会使MSComm 控件产生OnComm 事件。
”。
但实际上OnComm事件并不是每收到一个字符便触发一次OnComm 事件。
OnComm事件是在缓冲区收到几个甚至几十个字节数据后才被触发的。
版主认为这是WINDOWS多任务使操作系统不能实时响应造成的。
如果要在每次OnComm事件接收一个字符似乎可设INPUTLEN属性为1,但实际行不通。
VB在线帮助中“有该属性在从输出格式为定长数据的机器读取数据时非常有用”的注解,好象在说对定长字符有效,但版主发现INPUTLEN设为16,接收16个字符定长数据时却被当作两次接收了,一次12个,一次4个。
建议在OnComm事件中接收数据要定义通讯协议并检测数据的完整性。
对于不定长格式数据的接收程序员更喜欢定时器轮循法,也许OnComm事件不好控制吧。
对于不定长数据的接收,最佳方法可能是在OnComm事件中启动定时器轮循接收,并同时停止OnComm事件的触发,接收完毕后或超时开启OnComm事件。
用字符方式收发码值大于127的字符数据VB的通讯控件友好、功能强大,编程速度快是众人皆知的。
加上VB的易学、易用,快速开发等特点,数据通讯量不是很大时,在单片机通讯领域广泛地使用VB开发PC上层通讯软件。
实际开发时会有不少问题,这里就用字符方式收发码值大127的字符数据进行讨论。
在实际开发中经常遇到通讯只是用来发送一些控制字符命令和少量数据。
在VB的中文在线帮助中有“若数据只用ANSI 字符集,则用comInputModeText”的表述。
ANSI字符集是0-127这容易使人误解为&h88也可用“INPUTMIDE=comInputModeText”方式收发。
我刚开始用VB编通讯模块时就为此迷惑过,网上不少网友也时常问及这种问题。
实际上在VB中0-127是可以正常收发的,大于127即&H7F的只有&H80和&HFF能够收发,其余ANSI字符都被过滤为0。
由于串口通讯是以字节收发的,数据如以comInputModeText模式收发则非字符串数据会被过滤。
在VB中用“INPUTMIDE = comInputModeBinary” 就可以解决这个问题,只是收发都必须用动态数组来完成。
用comInputModeBinary模式编程稍有点复杂,调试也不直观,对于初学者不易掌握。
另外软件完成后,在实际应用时会增加工程维护难度,因为对于二进制代码不是易于理解的。
比如下端机发送现场统计数据233,comInputModeBinary模式下串口监测到“:A &H233;",它代表A探针的温度。