VBNET开发全功能串口调试助手

合集下载

vb.net编写的简易串口调试程序

vb.net编写的简易串口调试程序

编写的简易串口调试程序Imports SystemImports System.IO.PortsPublic Class Form1Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load'获取计算机有效串口Dim ports As String() = SerialPort.GetPortNames() '必须用命名空间,用SerialPort,获取计算机的有效串口Dim port As StringFor Each port In portsportnamebox.Items.Add(port) '向combobox中添加项Next port'初始化界面baudratebox.Text = baudratebox.Items(2) '注释和不注释的地方可以替换portnamebox.Text = portnamebox.Items(0)'baudratebox.SelectedIndex() = 2' portnamebox.SelectedIndex() = 0Serial_Port1() '初始化串口Label3.Text = SerialPort1.IsOpenstatuslabel.Text = "串口未连接"statuslabel.ForeColor = Color.Redsendbox.Text = "123"receivebytes.Text = "0"linecheck.Enabled = Truetimebox.Enabled = TrueEnd SubPrivate Sub Serial_Port1() '设置串口参数'SerialPort1.BaudRate = Val(baudratebox.Text) '波特率'SerialPort1.PortName = portnamebox.Text '串口名称SerialPort1.PortName = portnamebox.SelectedItemSerialPort1.BaudRate = Val(baudratebox.SelectedItem)SerialPort1.DataBits = 8'数据位SerialPort1.StopBits = IO.Ports.StopBits.One '停止位SerialPort1.Parity = IO.Ports.Parity.None '校验位End Sub'关闭串口连接Private Sub closebtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles closebtn.Click TrySerialPort1.Close() '关闭串口Label3.Text = SerialPort1.IsOpenIf SerialPort1.IsOpen = False Thenstatuslabel.Text = "串口未连接"statuslabel.ForeColor = Color.Redreceivebox.Text = ""receivebytes.Text = ""End IfCatch ex As ExceptionMessageBox.Show(ex.Message)End TryEnd Sub'打开串口连接Private Sub openbtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles openbtn.Click TrySerialPort1.Open() '打开串口Label3.Text = SerialPort1.IsOpenIf SerialPort1.IsOpen = True Thenstatuslabel.Text = "串口已连接"statuslabel.ForeColor = Color.GreenEnd IfCatch ex As ExceptionMessageBox.Show(ex.Message)End TryEnd Sub'手动发送数据Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Clicksend()End Sub'触发接收事件,接收数据Public Sub Sp_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceivedMe.Invoke(New EventHandler(AddressOf Sp_Receiving)) '调用接收数据函数End Sub'接收数据过程Private Sub Sp_Receiving(ByVal sender As Object, ByVal e As EventArgs)' Dim strIncoming As ByteDim strIncoming As IntegerDim str1() As StringDim str2() As StringDim bytes() As ByteDim i As IntegerTryThreading.Thread.Sleep(100) '添加的延时receivebytes.Text = Str(Val(receivebytes.Text) + SerialPort1.BytesToRead)If SerialPort1.BytesToRead > 0ThenReDim bytes(SerialPort1.BytesT oRead)'strIncoming = Convert.T oByte(SerialPort1.ReadByte())If receivecheck.Checked = True ThenstrIncoming = SerialPort1.ReadByte()bytes(0) = strIncomingFor i = 1To SerialPort1.BytesToReadstrIncoming = SerialPort1.ReadByte() '读取缓冲区中的数据bytes(i) = strIncomingNext' SerialPort1.Write(sendbox.Text)'发送数据SerialPort1.DiscardInBuffer()str1 = Split(BitConverter.ToString(bytes), "-")ReDim str2(str1.Length - 1) '去除str1中最后的字符For i = 0To str1.Length - 2str2(i) = str1(i)Nextreceivebox.Text = receivebox.Text & Join(str2, " ")'BitConverter.T oString(bytes)Elsereceivebox.Text = receivebox.Text & SerialPort1.ReadExisting()End IfEnd IfCatch ex As ExceptionMessageBox.Show(ex.Message)End TryEnd Sub'更改串口设置Private Sub portnamebox_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles portnamebox.SelectedIndexChangedTrySerial_Port1()Catch ex As ExceptionMessageBox.Show(ex.Message)End TryEnd Sub'清空接收区Private Sub clearbtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles clearbtn.Clickreceivebox.Text = ""End Sub'定时发送数据Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.TickTimer1.Interval = timebox.Textsend()End Sub'选择定时发送的触发事件Private Sub timecheck_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timecheck.CheckedChangedIf timecheck.Checked = True ThenIf timebox.Text = ""ThenMsgBox("时间间隔不能为0")timecheck.Checked = FalseElsesend()timebox.Enabled = FalseEnd IfElsetimebox.Enabled = TrueEnd IfEnd SubPublic Sub send() '发送数据过程Dim databyte() As ByteDim str1() As StringDim str2 As StringDim str3 As StringDim i As IntegerTryIf sendcheck.Checked = False Then'不按照16进制发送'timecheck.Enabled = TrueIf linecheck.Checked = False Then'判断是否选中分行发送SerialPort1.Write(sendbox.Text)ElseSerialPort1.WriteLine(sendbox.Text)End IfElse'按照16进制发送If InStr(sendbox.Text, " ") Then'判断是否有空格str1 = Split(sendbox.Text)str2 = Join(str1, "")Elsestr2 = sendbox.TextEnd IfIf str2.Length Mod2 = 0Then'判断字符串字节数是否为偶数ReDim databyte(str2.Length / 2) '重新定义数组For i = 0To str2.Length / 2 - 1databyte(i) = Convert.ToByte(Mid(str2, 2 * i + 1, 2), 16) '两个字符转换为一个16进制字节'databyte(i) = Val(Mid(str2, 2 * i + 1, 2))NextSerialPort1.Write(databyte, 0, databyte.Length - 1)sendbytes.Text = Str(Val(sendbytes.Text) + databyte.Length - 1)Elsestr3 = Mid(str2, 1, (str2.Length - 1)) & "0"& Mid(str2, str2.Length)ReDim databyte(str3.Length / 2)For i = 0To str3.Length / 2 - 1databyte(i) = Convert.ToByte(Mid(str3, 2 * i + 1, 2), 16)NextSerialPort1.Write(databyte, 0, databyte.Length - 1)sendbytes.Text = Str(Val(sendbytes.Text) + databyte.Length - 1)End If'databyte = System.Text.Encoding.Default.GetBytes(sendbox.Text)把每个字符转换成字节End IfCatch ex As ExceptionMessageBox.Show(ex.Message)End TryEnd Sub'是否按照16进制发送,如果是换行将不可选。

VB.Net串口通信用法

VB.Net串口通信用法

串口通信用法 串口通信用法对于初次使用 的SerialPort 编写串口通信的朋友,这些是很必要的知识,也是编写串口通信程序前的知识准备。

1、使用 SerialPort 设置串口属性进行串口通讯时,需要设置一些相关参数,可以通过设置SerialPort 类的属性来进行。

串口属性主要包括.PortName 串口名称,COM1, COM2等。

.BaudRate 波特率,也就是串口通讯的速度,进行串口通讯的双方其波特率需要相同,如果用PC连接其他非PC系统,一般地,波特率由非PC系统决定。

.Parity 奇偶校验。

可以选取枚举Parity中的值.DataBits 数据位.StopBits 停止位,可以选取枚举StopBits中的值.Handshake 握手方式,也就是数据流控制方式,可以选取枚举Handshake中的值对其中几个关键术语解释:a,波特率:这是一个衡量通信速度的参数。

它表示每秒钟传送的bit的个数。

例如300波特表示每秒钟发送300个bit。

当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz。

这意味着串口通信在数据线上的采样率为4800Hz。

通常电话线的波特率为14400,28800和36600。

波特率可以远远大于这些值,但是波特率和距离成反比。

高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。

b,数据位:这是衡量通信中实际数据位的参数。

当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。

如何设置取决于你想传送的信息。

比如,标准的ASCII码是0~127(7位)。

扩展的ASCII码是0~255(8位)。

如果数据使用简单的文本(标准ASCII码),那么每个数据包使用7位数据。

每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。

由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。

c,停止位:用于表示单个包的最后一位。

VB串口通信(附图教程)

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位数据的十六进制发送和接收,有端口,波特率等设置。

串口调试助手使用说明

串口调试助手使用说明

串口调试助手使用说明为简单明了,有些不言自明的功能不作介绍。

1 串口调试助手1.1 设置串口参数:串口号:1-16波特率:600-256000,>115200 时需要硬件支持。

2 接收区/键盘发送区2.1 接收数据a) 设置串口参数b) 如果要按十六进制形式显示接收数据,将十六进制显示选项选中。

c) 点击打开/关闭串口区中的打开串口按钮。

2.2 显示接收数据的长度因某些限制,显示接收数据的文本不能太长,所以当显示文本长度快达到62K 时会自动将显示文本删减到32K,此时文本可保留32K 的字符或约10K 的十六进制数据显示。

2.3 在键盘上发送英文字符a)在接收区/键盘发送区的输入框中用鼠标点一下。

b)在键盘按下按键立刻发送。

在这里不能发送回车换行,也不能发送汉字,若要发送请在单字符串发送区发送。

3 发送数据可以发送单字符串,多字符串(字符串序列)或直接在键盘上发送英文字符。

有两种发送数据格式,一种是普通的字符串,另外一种是十六进制数据即HEX 格式数据。

发送HEX 格式数据时要在字符串输入区中输入HEX 格式字符串,并且要将相应区内的十六进制发送选项选中。

例:HEX 格式数据字符串12 34 AB CD FF3.1 单字符串发送区3.1.1自动发送,自动发送周期:此项功能可以每隔一段时间反复地自动发送输入框中的数据,点击自动发送按钮后即启动自动发送功能。

自动发送周期最大为65535mS。

3.2 多字符串发送区在多字符串发送区可以发送一个字符串,或者自动地、依次发送所有的字符串。

请把鼠标移到“接收区/键盘发送区”和“多字符串发送区”之间,当鼠标形状发生变化时按下鼠标器的左键不松开,然后移动鼠标,将“多字符串发送区”的宽度调宽一些,让“间隔时间”显露出来。

3.2.1发送一个字符串a) 输入字符串。

b) 如果要发送16 进制数据, 要先在字符串后的HEX 选项框中打上对勾。

c) 点击发送按钮。

7 串口通讯实例程序(VB)

7 串口通讯实例程序(VB)

第七篇串口通讯实例程序(VB版)上一篇文档中简单了解了一下SerialPort控件。

本篇文档将利用这个控件,编写一个简单的串口收发程序。

打开VS2005。

文件| 新建| 项目。

新建一个项目,名称:SerialPortTest。

打开Form1.vb窗口。

在窗口中添加几个控件。

包括4个按钮,两个编辑框,1个状态栏,两个静态文本,简单的调整一下窗体。

如下图:将两个编辑框的Multiline属性设置为True。

然后给窗体添加一个SerialPort控件。

调整一下其属性如下:BaudRate : 9600 DataBits : 8 Parity : None PortName : COM1StopBits : One ReceivedBytesThreshold : 1添加“打开串口”按钮的单击响应函数,如下:——————————————————————————————————Private Sub BTN_COM_OPEN_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTN_COM_OPEN.ClickIf Me.SerialPort1.IsOpen = True ThenMe.StatusBar1.Text = "串口已经连接! COM1,9600,8,1"MsgBox("当前设备已连接", MsgBoxStyle.OkOnly, "提示") ElseMe.SerialPort1.Open()If Me.SerialPort1.IsOpen = True ThenMe.StatusBar1.Text = "打开串口成功!COM1,9600,8,1"ElseMe.StatusBar1.Text = "打开串口失败!"End IfEnd IfEnd Sub ——————————————————————————————————上面这段代码,打开串口,并在状态栏上显示一些提示信息。

一个基于API的VB.net串口通讯类

一个基于API的VB.net串口通讯类

⼀个基于API的串⼝通讯类的串⼝通讯⽀持总是让⼈觉得有所不⾜,在使⽤VB6的MsComm32.ocx时,很多⼈都会在的开发中觉得很困扰。

这⾥讲述的串⼝通讯类使⽤native代码,并且它是通API调⽤实现的,你会发现的串⼝通讯就是这么简单。

在说明如何使⽤这个类前,需要说明的是,本类只是⼀个的串⼝通讯演⽰,你可能需要根据你的情况修改后使⽤。

另外,本类的⽬的是通过例⼦教会你在⽆需ocx控件和第三⽅组件的⽀持下⽤开发串⼝通讯程序,所有并没有完善的异常错误处理。

1.初始化并打开串⼝ 创建⼀个CRs232类的实例,并在调⽤Open⽅法前设置好串⼝通讯参数。

例: Dim moRS232 as New Rs232() With moRs232 .Port = 1 '// Uses COM1 .BaudRate = 2400 '// 波特率 2400 .DataBit = 8 '// 8 data bits .StopBit = Rs232.DataStopBit.StopBit_1 '// 停⽌位 1 .Parity = Rs232.DataParity.Parity_None '// ⽆奇偶校验 .Timeout = 500 '//超时时间500 ms End With '// 初始化并打开串⼝ moRS232.Open () '// 串⼝打开后,你可以随意地控制DTR/RTS moRS232.Dtr = True moRS232.Rts = True 为了处理异常情况,建议你使⽤Try...Catch。

2.发送数据 本类为Rx和Tx准备了两个缓冲区(buffer),发送数据时,只需要设置TxData属性为你需要发送的数据,然后调⽤Tx⽅法就可以了。

例如: moRS232.TxData = txtTx.Text moRS232.Tx() 3.接收数据 先调⽤Rx⽅法(参数为您需要从串⼝读取的字节数),然后读取RxData属性。

串口调试助手

串口调试助手
Command2.Caption = "关闭串口" MSComm1.PortOpen = True Shape1.FillColor = QBColor(12) '红色 Else Command2.Caption = "打开串口" MSComm1.PortOpen = False Shape1.FillColor = QBColor(8) '黑色 End If End Sub '清空接收区 Private Sub Command3_Click() Text1.Text = "" End Sub '停止显示 Private Sub Command4_Click() If flag_dis = False Then flag_dis = True Command4.Caption = "继续显示" Else flag_dis = False Command4.Caption = "停止显示" End If End Sub '串口响应事件 Private Sub mscomm1_oncomm() Select Case mEvent Case comEvReceive inputsignal = MSComm1.Input rx_count = Len(Trim(inputsignal)) + rx_count If flag_dis = True Then
MSComm1.InBufferSize = 5120
MSComm1.InBufferCount = 0
MSComm1.OutBufferSize = 5120
MSComm1.OutBufferCount = 0
MSComm1.RThreshold = 1

VBA的高级调试技巧与工具

VBA的高级调试技巧与工具

VBA的高级调试技巧与工具VBA(Visual Basic for Applications)是一种在Microsoft Office应用程序中使用的编程语言。

它允许用户自定义和自动化各种任务,通过编写宏来提高工作效率。

然而,即使对于经验丰富的开发人员来说,编写VBA代码也可能出现错误和问题。

在开发和调试过程中,了解和掌握一些高级调试技巧和工具可以帮助开发人员快速定位和解决问题。

本文将介绍一些VBA的高级调试技巧和工具,帮助开发人员提高效率和编写可靠的代码。

1. 调试工具栏VBA提供了一个内置的调试工具栏,其中包含了一些非常有用的调试功能。

通过点击菜单栏上的"开发者"选项卡,然后在工具栏上勾选"调试",可以显示调试工具栏。

调试工具栏中的一些常用功能包括:- 执行:用于逐行执行代码,可以单步调试以定位错误。

- 设置/撤销断点:在代码中设置断点,使程序在该处中断执行,便于检查和修改变量的值。

- 直接对话框:可以显示一个对话框,以便在运行时检查变量的值。

2. 处理错误在VBA中,错误处理是至关重要的。

通过合理设置和处理错误,可以确保程序不会因为异常而终止,同时也可以提高程序的健壮性。

一种常见的错误处理方法是使用"On Error"语句。

这个语句允许你指定出现错误时要执行的代码。

例如,你可以使用"On Error Resume Next"将程序继续执行,而不是终止程序。

然后,通过检查"Err"对象的特定属性,如"Err.Number"和"Err.Description",可以获取关于错误的更多信息。

另一种常见的错误处理方法是使用"Try...Catch"语句块。

在VBA中,它被称为"On Error GoTo"。

你可以将需要监视的代码块放入"Try"块中,然后在错误发生时,程序将跳转到"catch"块中执行错误处理代码。

利用VSPD、串口调试助手、Keil做串口调试

利用VSPD、串口调试助手、Keil做串口调试

利用VSPD、串口调试助手、Keil做串口调试下面详细介绍下如何用虚拟串口调试串口发送接收程序。

需要用到三个软件:KEIL、VSPD XP5(virtual serial ports driver xp5.1 虚拟串口软件)、串口调试助手(个人感觉2.1 比较好用)。

1、首先在KEIL 里编译写好的程序。

2、打开VSPD,界面如下图所示:左边栏最上面的是电脑自带的物理串口。

点右边的add pair,可以添加成对的串口。

一对串口已经虚拟互联了,如果添加的是COM3、COM4,用COM3发送数据,COM4 就可以接收数据,反过来也可以。

3、接下来的一步很关键。

把KEIL 和虚拟出来的串口绑定。

现在把COM3和KEIL 绑定。

在KEIL 中进入DEBUG 模式。

在最下面的COMMAND 命令行,输入MODE COM3 4800,0,8,1(设置串口3 的波特率、奇偶校验位、数据位、停止位,打开COM3 串口,注意设置的波特率和程序里设置的波特率应该一样)ASSIGN COM3 SOUT(把单片机的串口和COM3 绑定到一起。

因为我用的单片机是STC89C52,只有一个串口,所以用SIN,SOUT,如果单片机有几个串口,可以选择S0IN,S0OUT,S1IN,S1OUT。

)为了不每次都重新绑定串口,可以建立一个初始化文件debug.ini。

初始化文件是一个普通的文本文件,内容就是仿真时需要的命令,按照顺序一行输入一条。

如图2 所示,建立了一个debug.ini 的初始化文件。

这样,当每次进入仿真调试状态时,Keil 就会自动载入debug.ini 的内容进行初始化。

4.串口调试助手。

串口测试软件 VB代码

串口测试软件 VB代码

串口测试软件 VB代码部分代码如下:Dim Port 'COM端口检测Dim p 'COM端口检测Dim s(255) As Integer '端口1-255Dim s1(255) '端口1-255Dim str '奇偶校验传递符Dim portstr As StringPrivate Sub Command1_Click()On Error Resume Next'---------------端口参数设置--------------- If Command1.Caption = "打开串口(&O)" Then Command1.Caption = "关闭串口(&C)"Command2.Enabled = TrueIf Combo3.Text = "无" Thenstr = "n"End IfIf Combo3.Text = "奇校验" Thenstr = "o"End IfIf Combo3.Text = "偶校验" Thenstr = "e"End IfIf Combo3.Text = "空格" Thenstr = "s"End IfIf Combo3.Text = "标记" Thenstr = "s"End If'---------------端口识别---------------For Port = 1 To 255s1(Port) = "COM" & PortIf Combo5.Text = s1(Port) ThenmPort = PortMSComm1.PortOpen = TrueIf MSComm1.PortOpen = True ThenRichTextBox2 = "COM" & Port & "已成功打开。

如何用VB编写串口程序

如何用VB编写串口程序

如何用VB编写串口程序VB控件MSComm功能介绍VB中的MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。

MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi 等语言中均可使用。

Microsoft Communications Control(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。

具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。

1.MSComm控件两种处理通讯的方式MSComm控件提供下列两种处理通讯的方式:事件驱动方式和查询方式。

1.1 事件驱动方式事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。

在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者 Carrier Detect (CD) 或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。

在这些情况下,可以利用MSComm 控件的OnComm 事件捕获并处理这些通讯事件。

OnComm 事件还可以检查和处理通讯错误。

所有通讯事件和通讯错误的列表,参阅CommEvent 属性。

在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。

这种方法的优点是程序响应及时,可靠性高。

每个MSComm 控件对应着一个串行端口。

如果应用程序需要访问多个串行端口,必须使用多个MSComm 控件。

1.2 查询方式查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。

在程序的每个关键功能之后,可以通过检查CommEvent 属性的值来查询事件和错误。

如果应用程序较小,并且是自保持的,这种方法可能是更可取的。

例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。

VB串口调试助手源代码

VB串口调试助手源代码

VB串口调试助手源代码Dim OutputAscii As BooleanDim InputString As StringDim OutputString As String'============================================================================== =======' 变量定义'============================================================================== =======Option Explicit ’强制显式声明Dim ComSwitch As Boolean ’串口开关状态判断Dim FileData As String ’要发送的文件暂存Dim SendCount As Long ’发送数据字节计数器Dim ReceiveCount As Long ’接收数据字节计数器Dim InputSignal As String ’接收缓冲暂存Dim OutputSignal As String ’发送数据暂存Dim DisplaySwitch As Boolean ’显示开关Dim ModeSend As Boolean ’发送方式判断Dim Savetime As Single ’时间数据暂存延时用Dim SaveTextPath As String ’保存文本路径' 网页超链接申明Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As LongPrivate Sub CloseCom() '关闭串口On Error GoTo ErrIf MSComm.PortOpen = True ThenMSComm.PortOpen = False’先判断串口是否打开,如果打开则先关闭txtstatus.Text = "STATUS:COM Port Cloced" ’串口状态显示mnuconnect.Caption = "断开串口"cmdswitch.Caption = "打开串口"'ImgSwitch.Picture = LoadPicture("f:\我的VB\串口调试软件\图片\guan.jpg") ' 显示串口已经关闭的图标ImgSwitchoff.Visible = TrueImgSwitchon.Visible = FalseErr:End SubPrivate Sub UpdateStatus()If MSComm.PortOpen ThenStatusBar1.Panels(1).Text = "Connected"mnuautosend.Caption = "自动发送"mnuconnect.Caption = "断开串口"ElseStatusBar1.Panels(1).Text = "断开串口"mnuautosend.Caption = "disautosend"mnuconnect.Caption = "打开串口"End IfStatusBar1.Panels(2).Text = "COM" & mPortStatusBar1.Panels(3).Text = MSComm.SettingsIf (OutputAscii) ThenStatusBar1.Panels(4) = "ASCII"ElseStatusBar1.Panels(4) = "HEX"End If'On Error GoTo ErrIf ChkAutoSend.Value = 1 Then ’如果有效则,自动发送If MSComm.PortOpen = True Then ’串口状态判断mnuautosend.Caption = "Dis&autosend"TmrAutoSend.Interval = Val(TxtAutoSendTime) ’设置自动发送时间TmrAutoSend.Enabled = True ’打开自动发送定时器Elsemnuautosend.Caption = "autosend"ChkAutoSend.Value = 0 ’串口没有打开去掉自动发送MsgBox "串口没有打开,请打开串口", 48, "串口调试助手" ' 如果串口没有被打开,提示打开串口End IfElseIf ChkAutoSend.Value = 0 Then ’如果无效,不发送mnuautosend.Caption = "autosend"TmrAutoSend.Enabled = False ’关闭自动发送定时器End IfErr:End SubPrivate Sub CmdSendFile_Click() '发送文件On Error GoTo ErrIf MSComm.PortOpen = True Then ’如果串口打开了,则可以发送数据If FileData = "" Then ’判断发送数据是否为空MsgBox "发送的文件为空", 16, "串口调试助手" ’发送数据为空则提示ElseIf ChkHexReceive.Value = 1 Then ’如果按十六进制接收时,按二进制发送,否则按文本发送MSComm.InputMode = comInputModeBinary ’二进制发送ElseMSComm.InputMode = comInputModeText ’文本发送End IfMSComm.Output = Trim(FileData) ’发送数据ModeSend = True ’设置文本发送方式End IfElseMsgBox "串口没有打开,请打开串口", 48, "串口调试助手" ' 如果串口没有被打开,提示打开串口End IfErr:End SubPrivate Sub Comm_initial(Port As Byte, BaudRate As String, ParityBit As String, DataBit As Integer, StopBit As Integer)On Error GoTo ErrorTrap ' 错误则跳往错误处理If MSComm.PortOpen = True Then MSComm.PortOpen = False’先判断串口是否打开,如果打开则先关闭mPort = Port ’设定端口MSComm.Settings = BaudRate & "," & ParityBit & "," & DataBit & "," & StopBit ' 设置波特率,无校验,8位数据位,1位停止位MSComm.InBufferSize = 1024 ’设置接收缓冲区为1024字节MSComm.OutBufferSize = 4096 ’设置发送缓冲区为4096字节MSComm.InBufferCount = 0 ’清空输入缓冲区MSComm.OutBufferCount = 0 ’清空输出缓冲区MSComm.SThreshold = 1 ’发送缓冲区空触发发送事件MSComm.RThreshold = 1 ’每X个字符到接收缓冲区引起触发接收事件MSComm.OutBufferCount = 0 ’清空发送缓冲区MSComm.InBufferCount = 0 ’滑空接收缓冲MSComm.PortOpen = True ’打开串口If MSComm.PortOpen = True Thentxtstatus.Text = "STATUS:" & cbocom.Text & " OPEND," & cbobaudrate.Text & "," &Left(cboparitybit.Text, 1) & "," & cbodatabit.Text & "," & cbostopbit.TextElsetxtstatus.Text = "STATUS:COM Port Cloced" ’串口没打开时,提示串口关闭状态End IfExit SubErrorTrap: ’错误处理Select Case Err.NumberCase comPortAlreadyOpen ’如果串口已经打开,则提示MsgBox "没有发现此串口或被占用", 49, "串口调试助手"CloseComCase ElseMsgBox "没有发现此串口或被占用", 49, "串口调试助手"CloseComEnd SelectErr.ClearEnd SubPrivate Sub Comm_reSet(Port As Byte, BaudRate As String, ParityBit As String, DataBit As Integer, StopBit As Integer)On Error GoTo ErrorHint ’错误则跳往错误处理If MSComm.PortOpen = True Then MSComm.PortOpen = False’先判断串口是否打开,如果打开则先关闭mPort = Port ’设定端口MSComm.Settings = BaudRate & "," & ParityBit & "," & DataBit & "," & StopBit ' 设置波特率,无校验,8位数据位,1位停止位MSComm.PortOpen = True ’打开串口If MSComm.PortOpen = True Thencmdswitch.Caption = "关闭串口"'ImgSwitch.Picture = LoadPicture("f:\我的VB\串口调试软件\图片\kai.jpg") ' 显示串口已经打开的图标ImgSwitchoff.Visible = Falsemnuconnect.Caption = "disconnect"ImgSwitchon.Visible = Truetxtstatus.Text = "STATUS:" & cbocom.Text & " OPEND," & cbobaudrate.Text & "," &Left(cboparitybit.Text, 1) & "," & cbodatabit.Text & "," & cbostopbit.TextElsecmdswitch.Caption = "打开串口"'ImgSwitch.Picture = LoadPicture("f:\我的VB\串口调试软件\图片\guan.jpg") ' 显示串口已经关闭的图标ImgSwitchon.Visible = FalseImgSwitchoff.Visible = Truetxtstatus.Text = "STATUS:COM Port Cloced"End IfExit SubErrorHint: ’错误处理Select Case Err.NumberCase comPortAlreadyOpen ’如果串口已经打开,则提示MsgBox "没有成功,请重试", vbExclamation, "串口调试助手"CloseCom ’调用关闭串口函数Case ElseMsgBox "没有成功,请重试", vbExclamation, "串口调试助手"CloseCom ’调用关闭串口函数End SelectErr.Clear ’清除Err 对象的属性End SubPrivate Sub Command1_Click()End SubPrivate Sub cbobaudrate_Change()Call Comm_reSet(Val(Mid(cbocom.Text, 4, 2)), cbobaudrate.Text, Left(cboparitybit.Text, 1), cbodatabit.Text, cbostopbit.Text) '串口设置End SubPrivate Sub cbocom_Change()Call Comm_reSet(Val(Mid(cbocom.Text, 4, 2)), cbobaudrate.Text, Left(cboparitybit.Text, 1), cbodatabit.Text, cbostopbit.Text) '串口设置End SubPrivate Sub cbodatabit_Change()Call Comm_reSet(Val(Mid(cbocom.Text, 4, 2)), cbobaudrate.Text, Left(cboparitybit.Text, 1), cbodatabit.Text, cbostopbit.Text) '串口设置End SubPrivate Sub cboparitybit_Change()Call Comm_reSet(Val(Mid(cbocom.Text, 4, 2)), cbobaudrate.Text, Left(cboparitybit.Text, 1), cbodatabit.Text, cbostopbit.Text) '串口设置End SubPrivate Sub cbostopbit_Change()Call Comm_reSet(Val(Mid(cbocom.Text, 4, 2)), cbobaudrate.Text, Left(cboparitybit.Text, 1), cbodatabit.Text, cbostopbit.Text) '串口设置End SubPrivate Sub chkautosend_Click()On Error GoTo ErrIf ChkAutoSend.Value = 1 Then ’如果有效则,自动发送If MSComm.PortOpen = True Then ’串口状态判断mnuautosend.Caption = "取消自动发送"TmrAutoSend.Interval = Val(TxtAutoSendTime) ’设置自动发送时间TmrAutoSend.Enabled = True ’打开自动发送定时器ElseChkAutoSend.Value = 0 ’串口没有打开去掉自动发送MsgBox "串口没有打开,请打开串口", 48, "串口调试助手" ' 如果串口没有被打开,提示打开串口End IfElseIf ChkAutoSend.Value = 0 Then ’如果无效,不发送mnuautosend.Caption = "自动发送数据"TmrAutoSend.Enabled = False ’关闭自动发送定时器End IfErr:End SubPrivate Sub cmdamend_Click()Dim spShell As Object ’定义存放引用对象的变量Dim spFolder As Object ’定义存放引用对象的变量Dim spFolderItem As Object ’定义存放引用对象的变量Dim spPath As String ’定义存放的变量On Error GoTo Err ’错误处理,防止取消打开文件夹时报错Const WINDOW_HANDLE = 0Const NO_OPTIONS = 0Set spShell = CreateObject("Shell.Application")Set spFolder = spShell.BrowseForFolder(WINDOW_HANDLE, "选择目录:", NO_OPTIONS,"C:\Scripts")Set spFolderItem = spFolder.SelfspPath = spFolderItem.PathspPath = Replace(spPath, "\", "\") ’ Replace函数的返回值是一个字符串txtsavepath.Text = spPath ’把文件夹路径显示在标签上SaveTextPath = txtsavepath.Text ’路径暂存Err:End SubPrivate Sub CmdClearCounter_Click()On Error GoTo ErrSendCount = 0 ’发送计数器清零ReceiveCount = 0 ’接收计数器清零txtRXcount.Text = "RX:" & 0 ’接收计数txtTXcount.Text = "TX:" & 0 ’发送计数Err:End SubPrivate Sub cmdclearrecieve_Click()TxtReceive.Text = ""End SubPrivate Sub cmdclearsend_Click()txtsend.Text = ""End SubPrivate Sub CmdHelp_Click()FrmHelp.ShowEnd SubPrivate Sub CmdQuit_Click()If MSComm.PortOpen = True Then MSComm.PortOpen = False’先判断串口是否打开,如果打开则先关闭Unload Me ’卸载窗体,并退出程序EndEnd SubPrivate Sub cmdsavedisp_Click()On Error GoTo Err ’错误处理SaveTextPath = txtsavepath ’路径暂存Open txtsavepath & "\1.txt" For Output As #1 ’打开文件’不存在的话会创建文件,如已存在会覆盖’ output 改为append 为追加’改为input 则只读Print #1, Year(Date) & "年" & Month(Date) & "月" & Day(Date) & _"日" & Hour(Time) & "时" & Minute(Time) & "分" & Second(Time) & _"秒" & vbCrLf & TxtReceive.Text + vbCrLf ’把接收区的文本保存文本前加上保存时间(0000年00月00日00时00分00秒)’ vbcrlf 为回车换行Close #1 ’关闭文件txtsavepath = "OK,1.txt Save" ’提示保存成功cmdsavedisp.Enabled = FalseSavetime = Timer ’记下开始的时间While Timer < Savetime + 5 ’循环等待5 - 要延时的时间DoEvents ’转让控制权,以便让操作系统处理其它的事件。

串口调试助手使用说明和技术总结大全

串口调试助手使用说明和技术总结大全

串口调试助手使用说明和技术总结大全第一篇:串口调试助手使用说明和技术总结大全串口调试助手的技术报告1.软件简介串口调试助手是在Windows平台下开发的,工具是VC++6.0。

串口调试助手版支持常用的300 ~ 115200bps波特率,能设置校验、数据位和停止位,能以ASCII码或十六进制接收或发送数据或字符(包括中文),能发送文本文件,可以任意设定自动发送周期,并能将接收数据保存成文本文件。

是工程师调试串口的好助手工具。

2.软件特点(1)支持XP /Vista/Win7系统;(2)绿色软件,不需安装。

运行解压软件,将压缩包解压到指定目录即可。

卸载时只需将程序目录删除;(3)支持常用的300 ~ 115200bps波特率;(4)端口范围是COM1-COM4;(5)能设置校验、数据位和停止位;(6)能以字符或十六进制收发数据,支持中文字符的收发;(7)支持文件数据的发送;(8)数据发送端允许设置发送周期,自动发送数据;(9)支持键盘输入,将键盘数据发送到串口;(10)支持自动清空(若设置了“自动清空”,则达到50行后,自动清空接收编辑框中显示的数据)接收窗口数据;(11)如果没有“自动清空”,数据行达到400后,也自动清空,因为数据过多,影响接收速度,显示是最费CPU时间的操作(12)能够保存接收到的数据,保存地址默认的是C:COMDATA;(13)设置了“停止显示”和“继续显示”按钮,可以方便的照出要使用的信息;(14)图钉按钮功能使程序能浮在最上层。

3.软件界面图1串口调试助手V3.0界面4.软件的设计流程本软件使用的是Windows API 串口编程,其编程基本步骤如下:(1)打开串口;(2)建立串口通信事件;(3)初始化串口;(4)建立数据线程;(5)读写数据;(6)结束时关闭串口。

5.遇到的问题与相应的解决方案(1)串口打开或者关闭有明显的提示(2)界面的大小设置问题,起初只有最小化按钮,按要求加上最大化以及界面要按照一定的规则能进行缩放(3)能发送和接收汉字(4)串口接收显示的数据丢失原因:接收显示是影响程序性能的一个大问题,当接收到大量数据时,串口通信助手响应不太及时,这个可能与调用类中的使用机制有关,但显示也没能很好地处理,不过在实际的传输过程中是没有丢失数据的。

VC[MFC]编写串口调试助手

VC[MFC]编写串口调试助手

VC(MFC)编写串口调试助手1.序确定基本功能:1.自动寻找串口,并自动添加到下拉框中共选择;2.有波特率、数据位、停止位、校验位的选择设置;3.串口打开控制按钮;4.发送、清除按钮;5.接收是自动实现的;6.有定时自动发送功能;7.有传送文件功能;8.有状态栏显示,指示串口状态,设置参数和发送接收显示。

下面就一步步实现,本人纯业余,只是记录下来这个学习过程,请勿拍砖。

开发平台Visual C++6.0英文版,电脑是i7-2670Q四核8G内存1G独显的笔记本,装的win7 64位旗舰版,因此VC6兼容不是太好,有些小毛病,不过不影响编写。

2.创建MFC项目File -> New -> Projects选择MFC AppWizard(exe),项目名称massist选择OK选中Dialog based,点击Next> 。

默认选项,点击Next> ,继续默认选项,点击Next> ,如果选中As a statically linked library,生产的EXE可直接在没装VC的机器上运行。

可以在项目中进行更改。

选择第二个CmassistDlg,点击Finish点击OK。

项目创建完毕,进入项目。

删除界面上确定和取消按钮以及静态文字。

3.创建界面保存后便可以开始创建界面了。

参考界面仿照设计的界面,具体添加按钮或编辑框等的布局步骤就不用细说了。

4.图标修改在资源视图中选择Icon右键InsertIcon加入打开和关闭的Icon图标或自行绘制,如下图IDR_MAINFRAME原为MFC提供的图标,这里我直接改成自己的,生成EXE后将会显示这个图标。

下面将帮助页面图标也改为自绘图标。

在打开按钮旁边加入自绘的打开和关闭图标:先加入工具条中的Picture,然后选中右键看属性,并如图将Image选为默认的IDI_ICON_CLOSE。

如下图5.基本设置下面对各个按钮及编辑框设置进行描述右键串口对应的bo Box,ID设置为IDC_LIST,Type设置为Drop List,Sort不选择(我系统是WIN7 64位,不选中反而自动排序,至于XP得试试看了,以下的选择相同)。

基于VB proteus和虚拟串口的调试

基于VB proteus和虚拟串口的调试

一利用Proteus,Serialnull,VB模拟串口通信的简单例子各软件介绍:VB:编写上位机。

Serialnull:建立虚拟串口连接。

Proteus:仿真单片机及相关电路。

步骤:1.在Serialnull中建立虚拟串口连接:下图左边已经有了两对虚拟端口,下面我们需要com2,和com5.其中上位机选择com5,proteus端的设备采用com2. 如图:2. 打开vb,编写程序。

这是本人今天熬夜做毕设整理出来的,能省就省。

3.打开Proteus,为了方便,只添加了一个串口元件,即compim。

点击该元件,设置属性中的PORT为com2.这样才能与上位机(com5)沟通。

4.这时,点击proteus仿真按钮,观察此时compim各脚电平。

5.打开自己编的小软件。

先打开串口,再点“亮”。

至此,实验完成。

灵感来源于罗洪达同学的文章,本人经过多次摸索,终得其精髓,拿出来和广大网友分享。

源代码:Private Sub Command1_Click()Timer1.Enabled = TrueCommand1.Enabled = FalseCommand2.Enabled = TrueEnd SubPrivate Sub Command2_Click()Timer1.Enabled = FalseCommand1.Enabled = TrueEnd SubPrivate Sub Command3_Click()mPort = Combo1.Text MSComm1.PortOpen = TrueCommand3.Enabled = FalseCommand1.Enabled = TrueEnd SubPrivate Sub Form_Load()Command1.Enabled = FalseTimer1.Enabled = FalseTimer1.Interval = 200Command2.Enabled = FalseLabel1.Caption = 0Combo1.AddItem "1"Combo1.AddItem "2"Combo1.AddItem "3"Combo1.AddItem "4"Combo1.AddItem "5"Combo1.Text = 5End SubPrivate Sub Timer1_Timer()Label1.Caption = Label1.Caption + 1Me.MSComm1.Output = "1"End Sub。

combobox控件使用针对串口助手设计

combobox控件使用针对串口助手设计

大家好,欢迎来到大苏苏讲课空间今天说一下:串口助手,里的波特率和端口号设计。

波特率要在COMBOBOX控件的属性里item里添加,通过回车换行,还行也可用代码实现。

端口号,从电脑里获得,注意下方代码:Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load'获取计算机有效串口'Me.Text = "串口助手大苏苏"Dim ports As String() = SerialPort.GetPortNames() '必须用命名空间,用SerialPort,获取计算机的有效串口Dim port As StringFor Each port In portsportnamebox.Items.Add(port) '向combobox中添加项Next port'初始化界面baudratebox.SelectedIndex() = 2portnamebox.SelectedIndex() = 0Serial_Port1() '初始化串口Label3.Text = SerialPort1.IsOpenstatuslabel.Text = "串口未连接"statuslabel.ForeColor = Color.Redsendbox.Text = "123"' baudratebox.Text = baudratebox.Items(0) 注释和不注释的地方可以替换'portnamebox.Text = portnamebox.Items(0)End Sub看波特率的输入:240048009600192003840057600115200ComboBox 控件使用详细说明。

使用VB开发串口、USB通信软件

使用VB开发串口、USB通信软件
说明:当EOFEnable属性设置为False,OnComm控件将不在输入流中
寻 找EOF字符。
使用VB开发串口、USB通信软件
使用Windows的API应用程序接口
• Handshake常数。 Handshake常数如表所示。
常数

描述
comNone 0 无握手
comXonXoff 1 XOn/Xoff握手
使用VB开发串口、USB通信软件
使用串口通信控件
针对串口通信,微软公司专门提供了MSComm控件, 使用该控件进行串口通信设计是十分方便的,程序员不必 花时间去了解较为复杂的API函数。通过简单修改控件的 属性和使用控件提供的方法,就可以实现对串口的配置、 完成串口接收和发送数据。
使用VB开发串口、USB通信软件
使用VB开发串口、USB通信软件
使用Windows的API应用程序接口
• Settings属性的设置由4个设置组成,格式如下:
BBBB
P
D
S
各个属性值间用逗号隔开,其中BBBB为波特率,P为奇偶校验,D为数 据位数,S为停止位数。其默认值为“9600,N,8,1”。
• InputLen属性。设置并返回Input属性从接收缓冲区中读取的字符数。 InputLen 属性的默认值是0。设置InputLen为0时,使用Input将使MSComm 控件读取缓冲区中全部的内容。
4
comEvCD
5
comEvRing
6
使用VB开co发mE串v口EO、F USB通信7软件
描述 发送事件 接收事件 clear-to-send线变化 data-set ready线变化 carrier detect线变化 振铃检测 文件结束

vb编写的串口调试程序

vb编写的串口调试程序

vb编写的串口调试程序(源代码)作者:Javen_yue,2005-5-17 13:23:00 发表于:《自动化软件论坛》共有8人回复,2108次点击加为好友播客博客发送留言小弟刚入行不久,写了个小程序,希望各位大侠能帮我指点一二,谢谢!Public countRX As IntegerPublic countTX As IntegerPublic num As BytePublic setport As StringPrivate Sub Combo1_Click()openportEnd SubPrivate Sub combo2_click()openportEnd SubPrivate Sub combo3_click()openportEnd SubPrivate Sub combo4_click()openportEnd SubPrivate Sub combo5_click()openportEnd SubPrivate Sub Command3_Click()Text1.Text = ""End SubPrivate Sub Command4_Click() '手动发送Dim send() As ByteDim i As IntegerDim length As IntegerDim a() As ByteDim b As Bytelength = Len(Text2.Text)If length > 0 ThenReDim a(length - 1)ReDim send(length - 1)End Ifsend = Text2.TextcountTX = countTX + lengthIf Check2.Value = 0 ThenMSComm1.Output = send'countTX = countTX + MSComm1.OutBufferCountElsei = 0b = 0Do While i <= (length - 1) * 2If ((send(i) >= 48 And send(i) <= 57) Or (send(i) >= 65 And send(i) <= 70) Or (send(i) >= 97 And s end(i) <= 102)) ThenIf (send(i) >= 97 And send(i) <= 102) Thena(b) = send(i) - 32Elsea(b) = send(i)End IfElseIf b > 0 ThenReDim Preserve a(b - 1)End IfExit DoEnd Ifi = i + 2b = b + 1DoEventsLoopMSComm1.Output = aEnd IfLabel5.Caption = "TX:" & countTX End SubPrivate Sub command5_Click()Text2.Text = " "End SubPrivate Sub Command6_Click() Label4.Caption = "RX:0 "Label5.Caption = "TX:0 "End SubPrivate Sub Form_Load()Combo1.ListIndex = 0 'initialCombo2.ListIndex = 0Combo3.ListIndex = 0Combo4.ListIndex = 0Combo5.ListIndex = 0End SubSub openport()'Dim num As Byte'Dim setport As StringOn Error GoTo msgnum = Combo1.ListIndex + 1If MSComm1.PortOpen = True Then 'MsgBox ("没有发现串口或被占用") MSComm1.PortOpen = FalseEnd IfmPort = numsetport = Combo2.Text + ","If Combo3.ListIndex = 0 Thensetport = setport + "N,"End IfIf Combo3.ListIndex = 1 Thensetport = setport + "O,"End IfIf Combo3.ListIndex = 2 Thensetport = setport + "E,"End IfIf Combo4.ListIndex = 0 Thensetport = setport + "8,"End IfIf Combo4.ListIndex = 1 Thensetport = setport + "7,"End IfIf Combo5.ListIndex = 0 Thensetport = setport + "1"End IfIf Combo5.ListIndex = 1 Thensetport = setport + "2"End IfMSComm1.Settings = setportMSComm1.PortOpen = True'If MSComm1.PortOpen = True Then'Label3.Caption = "stats:" & num & ",open" & "," & setport'Else' Label3.Caption = "stats:" & num & "close" & "," & setport 'End Ifmsg:End SubSub command1_click()On Error GoTo msgMSComm1.PortOpen = Truemsg: MsgBox ("port had opened")End SubSub command2_click()MSComm1.PortOpen = FalseEnd SubPrivate Sub Timer1_Timer()If MSComm1.PortOpen = True ThenShape1.FillColor = RGB(0, 255, 0)Command1.Visible = Falsecommand2.Visible = TrueLabel3.Caption = "stats:" & num & ",open" & "," & setport ElseShape1.FillColor = RGB(255, 0, 0)Command1.Visible = Truecommand2.Visible = FalseLabel3.Caption = "stats:" & "close" & "!"End IfEnd SubPrivate Sub Timer2_Timer() '接收信号Dim recBuf() As ByteDim recCnt As IntegerDim str As StringDim i As IntegerDim str1 As String'Dim countRX As Integer' Do Until MSComm1.InBufferCount <> 0' DoEvents' LooprecCnt = MSComm1.InBufferCountcountRX = recCnt + countRXIf recCnt > 0 ThenReDim recBuf(recCnt)recBuf = MSComm1.Inputstr = "" ' CStr(Now) & " rec:"If Check1.Value = 1 ThenFor i = 0 To recCnt - 1str = str & CStr(Hex(recBuf(i)))Next iElseFor i = 0 To recCnt - 1str = str & Chr(recBuf(i))Next iEnd IfText1.Text = Text1.Text + strLabel4.Caption = "RX:" & countRXEnd IfEnd SubPrivate Sub Timer3_Timer() '自动发送Dim length As Integerlength = Len(Text2.Text)Timer3.Interval = Text3.TextIf (Check3.Value = 1 And length <> 0) Then Dim send() As ByteDim i As IntegerDim a() As ByteDim b As ByteReDim a(length - 1)ReDim send(length - 1)countTX = countTX + lengthsend = Text2.TextIf Check2.Value = 0 ThenMSComm1.Output = sendElsei = 0b = 0Do While i <= (length - 1) * 2If ((send(i) >= 48 And send(i) <= 57) Or (send(i) >= 65 And send(i) <= 70) Or (send(i) >= 97 And s end(i) <= 102)) ThenIf (send(i) >= 97 And send(i) <= 102) Thena(b) = send(i) - 32Elsea(b) = send(i)End IfElseIf b > 0 ThenReDim Preserve a(b - 1)End IfExit DoEnd Ifi = i + 2b = b + 1DoEventsLoop。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

开发全功能串口调试助手(含完整工程)
小记:的串口通信用了很长时间了,也只用Write和Read这样的方法,以前都是用这种方式做上位机软件,如此足矣。

而前几天研究GSM模块时对串口返回的数据总是把握不好,参考开发板附送的例程,发现采用SerialPort 的DataReceived事件,可以实现中断触发式的数据接收。

于是想到要自己做一个串口调试助手,在实现基本功能的前提下增加一些方便自己调试的功能。

经过断断续续的编写,就做成了下面这个小软件:
这个软件能够实现串口调试助手的全部功能,经过通信测试,数据接收性能不亚于呼啸工作室的SComAssistant2.2,通过加大输入缓冲区,可以满足大量数据接收。

的串口通信主要使用VS自带的SerialPort控件,而不是早先的MSComm,更具有兼容性,这也是很久以前就放弃VB改用.NET的直接原因。

该控件的主要方法、属性如下(该数据来自VS的MSDN帮助库):
想要通过串口收发数据,就需要对串口进行配置,包括设置端口、波特率、数据格式(如COM1端口、9600bps、8位数据位、无校验位、1位停止位)等属性,之后通过Open方法打开串口。

打开串口可通过手动指定,也可以使用GetPortNames方法获取计算机中存在的串口。

如果打开出错,则可能是串口不存在或者已被占用。

下面是相应代码:
Private Sub SerialPortOpen()
On Error GoTo Err
If SerialPort.IsOpen =True Then SerialPort.Close()'避免重复打开端

SerialPort.Open()
LabelCOMStatus.Text ="串口已打开"
Exit Sub
Err:MsgBox("串口不存在或已被占用!"+ vbNewLine + ErrorToString())'出现错误,显示错误信息
End Sub
如果想要在串口中支持中文字符收发,则可在初始化时设置串口控件的编码:SerialPort.Encoding = System.Text.Encoding.Default
发送数据通过Write方法来完成,由于串口调试助手需要支持文本和16进制,需要加入转换代码:
Private Sub ButtonSendData_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)Handles ButtonSendData.Click
On Error GoTo Err
Dim outDataBuf As String= TextBoxSend.Text
If outDataBuf =""Then Exit Sub'如果输入文本框中没有数据则不发送
If SerialPort.IsOpen =True Then'判断串口是否打开
If HexSendFlag =True Then
'-----------十六进制发送------------
outDataBuf = outDataBuf.Replace(" ","")'清除空格与回车
outDataBuf = outDataBuf.Replace(vbNewLine,"")
'十六进制数据位数为偶数,例如:FF 00 15 AC 0D
If outDataBuf.Length Mod2 <> 0Then
MsgBox("请输入正确的十六进制数,用空格和回车隔开。

")
Exit Sub
End If
Dim outBytes(outDataBuf.Length / 2 - 1)As Byte
For I As Integer= 1To outDataBuf.Length - 1Step2
outBytes((I - 1) / 2) = Val("&H"+ Mid(outDataBuf, I, 2))'VB 的十六进制表示方法,例如0x1D表示为&H1D
Next
SerialPort.Write(outBytes, 0, outDataBuf.Length / 2)
BarCountTx.Text = Val(BarCountTx.Text) + outDataBuf.Length / 2
Else
'-------------文本发送--------------
SerialPort.Write(outDataBuf)
BarCountTx.Text = Val(BarCountTx.Text) + outDataBuf.Length'发送字节计数
End If
Else
MsgBox("串口未打开,请先打开串口。

")
End If
Exit Sub
Err:MsgBox("数据输入或发送错误!"+ vbNewLine + ErrorToString())
End Sub
接收数据采用DataReceived事件,该事件在串口输入缓冲区中的字节数满足设置条件时触发,并执行事件中的代码。

事件触发的字节数在ReceivedBytesThreshold属性中设置,默认为1字节。

由于DataReceived事件采用了独立的线程,无法对软件界面中的控件进行直接操作,因而在现实时需要采用委托实例的方法。

首先建立委托:
Delegate Sub RecieveRefreshMethodDelegate(ByVal[text]As String)'声明委托
Dim RecieveRefresh As New RecieveRefreshMethodDelegate(AddressOf Recie veRefreshMethod)'定义数据显示委托实例
Sub RecieveRefreshMethod(ByVal str As String)'定义一个数据显示委托实例的方法
ShowRecieveData(str)
End Sub
其中ShowRecieveData函数将str字符串显示到TextBox控件中。

下面是DataReceived事件中对十六进制数据的处理。

同发送数据一样,读取数据时也要根据不同的显示方式使用不同的方法。

通过Read方法,根据缓冲区中存在的字节数读取十六进制数据,而文本显示则简单的多,只需ReadExisting即可。

最后通过Invoke方法调用委托,显示数据。

Private Sub SerialPort_DataReceived(ByVal sender As Object, ByVal e As
System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort.DataRec eived
If HexRecieveFlag Then
'-----------十六进制显示------------
Dim inDataLen As Integer = SerialPort.BytesToRead() '获取可读取的字节数
If inDataLen > 0 Then
Dim inBytes(inDataLen - 1) As Byte, bytes As Byte
Dim strHex As String = ""
SerialPort.Read(inBytes, 0, inDataLen) '读取数据
For Each bytes In inBytes
strHex = strHex + [String].Format("{0:X2} ", bytes) '格式化成十六进制(不含&H)
Next
TextBoxRecieve.Invoke(RecieveRefresh, strHex) '调用委托,显示接收的数据
BarCountRx.Text = (Val(BarCountRx.Text) + inDataLen).ToString '接收字节计数
End If
Else
'-------------文本显示--------------
Dim str As String
str = SerialPort.ReadExisting '读取全部可用字符串
TextBoxRecieve.Invoke(RecieveRefresh, str)
BarCountRx.Text = (Val(BarCountRx.Text) + str.Length).ToString '接收字节计数
End If
End Sub
至此就实现了串口收发的基本功能,另外的定时收发(使用Timer控件)、文件发送(使用FileSystem)参见附带的源文件代码。

(附件功能完全不给力呀,终于传上来了……)SerialPortElf.rar
在完成串口调试助手的功能后,还可以根据个人的使用习惯或需求,添加相应的功能。

相关文档
最新文档