VBNET开发全功能串口调试助手
- 格式:docx
- 大小:48.57 KB
- 文档页数:7
经典的串口调试助手源代码分类VB在单片机中的应Dim OutputAscii As Boolean Dim InputString As String Dim 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 quotshell32.dllquot Alias quotShellExecuteAquot 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 Long Private Sub CloseCom 关闭串口On Error GoTo Err If MSComm.PortOpen True Then MSComm.PortOpen False 先判断串口是否打开如果打开则先关闭txtstatus.Text quotSTATUSCOM Port Clocedquot 串口状态显示mnuconnect.Caption quot断开串口quot cmdswitch.Caption quot打开串口quot ImgSwitch.Picture LoadPicturequotf:我的VB串口调试软件图片guan.jpgquot 显示串口已经关闭的图标ImgSwitchoff.Visible True ImgSwitchon.Visible False Err: End Sub Private Sub UpdateStatus If MSComm.PortOpen Then StatusBar1.Panels1.Text quotConnectedquot mnuautosend.Caption quot自动发送quot mnuconnect.Caption quot断开串口quot Else StatusBar1.Panels1.Text quot断开串口quot mnuautosend.Caption quotdisautosendquot mnuconnect.Caption quot打开串口quot End If StatusBar1.Panels2.Text quotCOMquot amp mPortStatusBar1.Panels3.Text MSComm.Settings If OutputAscii Then StatusBar1.Panels4 quotASCIIquot Else StatusBar1.Panels4 quotHEXquot End If On Error GoTo Err If ChkAutoSend.Value 1 Then 如果有效则自动发送If MSComm.PortOpen True Then 串口状态判断mnuautosend.Caption quotDisampautosendquot TmrAutoSend.Interval ValTxtAutoSendTime 设置自动发送时间TmrAutoSend.Enabled True 打开自动发送定时器Else mnuautosend.Caption quotautosendquot ChkAutoSend.Value 0 串口没有打开去掉自动发送MsgBox quot串口没有打开请打开串口quot 48 quot串口调试助手quot 如果串口没有被打开提示打开串口End If ElseIf ChkAutoSend.Value 0 Then 如果无效不发送mnuautosend.Caption quotautosendquot TmrAutoSend.Enabled False 关闭自动发送定时器End If Err: End Sub Private Sub CmdSendFile_Click 发送文件On Error GoTo Err If MSComm.PortOpen True Then 如果串口打开了则可以发送数据If FileData quotquot Then 判断发送数据是否为空MsgBox quot发送的文件为空quot 16 quot串口调试助手quot 发送数据为空则提示Else If ChkHexReceive.Value 1 Then 如果按十六进制接收时按二进制发送否则按文本发送MSComm.InputMode comInputModeBinary 二进制发送ElseMSComm.InputMode comInputModeText 文本发送End If MSComm.Output TrimFileData 发送数据ModeSend True 设置文本发送方式End If Else MsgBox quot串口没有打开请打开串口quot 48 quot串口调试助手quot 如果串口没有被打开提示打开串口End If Err: End Sub Private Sub Comm_initialPort As Byte BaudRate AsString ParityBit As String DataBit As Integer StopBit As Integer On Error GoTo ErrorTrap 错误则跳往错误处理If MSComm.PortOpen True ThenMSComm.PortOpen False 先判断串口是否打开如果打开则先关闭mPort Port 设定端口MSComm.Settings BaudRate amp quotquot amp ParityBit amp quotquot amp DataBit amp quotquot amp 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 Then txtstatus.Text quotSTATUSquot amp cbocom.Text amp quot OPENDquot amp cbobaudrate.Text amp quotquot amp Leftcboparitybit.Text 1 amp quotquot amp cbodatabit.Text amp quotquot amp cbostopbit.Text Else txtstatus.Text quotSTATUSCOM Port Clocedquot 串口没打开时提示串口关闭状态End If Exit Sub ErrorTrap: 错误处理Select Case Err.Number Case comPortAlreadyOpen 如果串口已经打开则提示MsgBox quot没有发现此串口或被占用quot 49 quot串口调试助手quot CloseCom Case Else MsgBox quot没有发现此串口或被占用quot 49 quot串口调试助手quot CloseCom End Select Err.Clear End Sub Private Sub Comm_reSetPort 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 amp quotquot amp ParityBit amp quotquot amp DataBit amp quotquot amp StopBit 设置波特率无校验8位数据位1位停止位MSComm.PortOpen True 打开串口IfMSComm.PortOpen True Then cmdswitch.Caption quot关闭串口quot ImgSwitch.Picture LoadPicturequotf:我的VB串口调试软件图片kai.jpgquot 显示串口已经打开的图标ImgSwitchoff.Visible False mnuconnect.Caption quotdisconnectquot ImgSwitchon.Visible True txtstatus.Text quotSTATUSquot amp cbocom.Text amp quot OPENDquot amp cbobaudrate.Text amp quotquot amp Leftcboparitybit.Text 1 amp quotquot amp cbodatabit.Text amp quotquot amp cbostopbit.Text Else cmdswitch.Caption quot打开串口quot ImgSwitch.Picture LoadPicturequotf:我的VB串口调试软件图片guan.jpgquot 显示串口已经关闭的图标ImgSwitchon.Visible False ImgSwitchoff.Visible True txtstatus.Text quotSTATUSCOM Port Clocedquot End If Exit Sub ErrorHint: 错误处理Select Case Err.Number Case comPortAlreadyOpen 如果串口已经打开则提示MsgBox quot没有成功请重试quot vbExclamation quot串口调试助手quot CloseCom 调用关闭串口函数Case Else MsgBox quot没有成功请重试quot vbExclamation quot串口调试助手quot CloseCom 调用关闭串口函数End Select Err.Clear 清除Err 对象的属性End Sub Private Sub Command1_Click End Sub Private Sub cbobaudrate_Change Call Comm_reSetValMidcbocom.Text 4 2 cbobaudrate.Text Leftcboparitybit.Text 1cbodatabit.Text cbostopbit.Text 串口设置End Sub Private Sub cbocom_Change Call Comm_reSetValMidcbocom.Text 4 2 cbobaudrate.Text Leftcboparitybit.Text 1 cbodatabit.Text cbostopbit.Text 串口设置End Sub Private Sub cbodatabit_Change Call Comm_reSetValMidcbocom.Text 4 2 cbobaudrate.Text Leftcboparitybit.Text 1 cbodatabit.Text cbostopbit.Text 串口设置End Sub Private Sub cboparitybit_Change Call Comm_reSetValMidcbocom.Text 4 2 cbobaudrate.Text Leftcboparitybit.Text 1 cbodatabit.Text cbostopbit.Text 串口设置End Sub Private Sub cbostopbit_Change Call Comm_reSetValMidcbocom.Text 4 2 cbobaudrate.Text Leftcboparitybit.Text 1 cbodatabit.Text cbostopbit.Text 串口设置End Sub Private Sub chkautosend_Click On Error GoTo Err If ChkAutoSend.Value 1 Then 如果有效则自动发送If MSComm.PortOpen True Then 串口状态判断mnuautosend.Caption quot取消自动发送quot TmrAutoSend.Interval ValTxtAutoSendTime 设置自动发送时间TmrAutoSend.Enabled True 打开自动发送定时器Else ChkAutoSend.Value 0串口没有打开去掉自动发送MsgBox quot串口没有打开请打开串口quot 48 quot串口调试助手quot 如果串口没有被打开提示打开串口End If ElseIf ChkAutoSend.Value 0 Then 如果无效不发送mnuautosend.Caption quot自动发送数据quot TmrAutoSend.Enabled False 关闭自动发送定时器End If Err: End Sub Private 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 0 ConstNO_OPTIONS 0 Set spShell CreateObjectquotShell.Applicationquot Set spFolder spShell.BrowseForFolderWINDOW_HANDLE quot选择目录:quot NO_OPTIONS quotC:Scriptsquot Set spFolderItem spFolder.Self spPath spFolderItem.Path spPath ReplacespPath quotquot quotquot Replace函数的返回值是一个字符串txtsavepath.Text spPath 把文件夹路径显示在标签上SaveTextPath txtsavepath.Text 路径暂存Err: End Sub Private Sub CmdClearCounter_Click On Error GoTo Err SendCount 0 发送计数器清零ReceiveCount 0 接收计数器清零txtRXcount.Text quotRX:quot amp 0 接收计数txtTXcount.Text quotTX:quot amp 0 发送计数Err: End Sub Private Sub cmdclearrecieve_Click TxtReceive.Text quotquot End Sub Private Sub cmdclearsend_Click txtsend.Text quotquot End Sub Private Sub CmdHelp_Click FrmHelp.Show End Sub Private Sub CmdQuit_Click If MSComm.PortOpen True Then MSComm.PortOpen False 先判断串口是否打开如果打开则先关闭Unload Me 卸载窗体并退出程序End End Sub Private Sub cmdsavedisp_Click On Error GoTo Err 错误处理SaveTextPath txtsavepath 路径暂存Open txtsavepath amp quot1.txtquot For Output As 1 打开文件不存在的话会创建文件如已存在会覆盖output 改为append 为追加改为input 则只读Print 1 YearDate amp quot年quot amp MonthDate amp quot月quot amp DayDate amp _ quot 日quot amp HourTime amp quot时quot amp MinuteTime amp quot分quot amp SecondTime amp _ quot秒quot amp vbCrLf amp TxtReceive.Text vbCrLf 把接收区的文本保存文本前加上保存时间0000年00月00日00时00分00秒vbcrlf 为回车换行Close 1 关闭文件txtsavepath quotOK1.txt Savequot 提示保存成功cmdsavedisp.Enabled False Savetime Timer 记下开始的时间While Timer lt Savetime 5 循环等待5 - 要延时的时间DoEvents 转让控制权以便让操作系统处理其它的事件。
编写的简易串口调试程序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进制发送,如果是换行将不可选。
VBA调试技巧和常用工具介绍VBA(Visual Basic for Applications)是一种广泛应用于微软Office套件中的宏语言,可以帮助用户自动执行繁琐的任务以提高工作效率。
然而,在编写VBA代码时,我们经常会遇到各种错误和问题,这就需要我们掌握一些调试技巧和常用工具来定位和解决这些问题。
本文将介绍一些VBA调试技巧和常用工具,帮助读者快速定位和解决VBA代码中的问题。
1. 使用断点调试在VBA代码中,可以设置断点来暂停程序的执行,从而可以逐行查看代码的执行过程,以便定位问题。
设置断点非常简单,只需在需要暂停的代码行前面点击鼠标左键即可,在执行代码时,程序将暂停在断点所在的行上。
在断点暂停的状态下,我们可以利用VBA编辑器中提供的各种调试工具来观察变量的值、执行代码的步骤等。
2. 运行时错误处理当程序执行时出现错误,VBA会中断程序的执行并显示一个错误消息。
但是有时候,我们可能希望通过编写一些特定的代码来捕获和处理这些错误,而不是直接中断程序的执行。
VBA提供了一些错误处理语句,如On Error Resume Next和On Error Goto语句,可以帮助我们在代码执行过程中捕获并处理错误,以保证程序的正常运行。
3. 使用调试工具窗口VBA编辑器中的调试工具窗口提供了一些强大的功能,可以帮助我们调试VBA代码。
其中最常用的是"立即窗口"(Immediate Window)和"局部窗口"(Locals Window)。
- 立即窗口允许我们在程序执行时直接输入和执行VBA语句,这对于一些短小的测试代码非常实用。
- 局部窗口可以显示当前正在执行的过程中定义的变量以及它们的值,这对于跟踪程序状态和定位错误非常有帮助。
4. 使用日志记录有时候,我们可能希望在程序执行时输出一些调试信息,以便在后期查看。
这时候,可以使用VBA的日志记录功能来记录程序的执行过程和关键变量的值。
串口调试助手使用说明为简单明了,有些不言自明的功能不作介绍。
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) 点击发送按钮。
⼀个基于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属性。
这是我3年前的一个例子,最近翻出来回忆一下。
串口是计算机上一种非常通用设备通信的协议。
大多数计算机包含两个基于RS232的串口,现在配电脑好像只有一个。
串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。
同时,串口通信协议也可以用于获取远程采集设备的数据。
串口通信在工控领域用途很广。
串口通信的概念非常简单,串口按位(bit)发送和接收字节。
尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。
它很简单并且能够实现远距离通信。
比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。
典型地,串口用于ASCII码字符的传输。
通信使用3根线完成:(1)地线,(2)发送,(3)接收。
由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。
其他线用于握手,但是不是必须的。
串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。
对于两个进行通行的端口,这些参数必须匹配: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位数据。
工业计算机网络实验报告实验4:计算机网络实验——VB实现串口通信一、实验目的:(1)熟悉和掌握串口通信的基本概念;(2)进一步熟悉RS-232C串口通信标准;(3)熟悉和掌握串行通信控件MSComm及其应用。
二、实验任务:(1)学会使用虚拟串行驱动程序(VSPD)虚拟串口。
(2).学会使用串口调试助手。
(3)使用VB做一个串口通信程序,要求能实现数据的收发。
三、编程实现:代码:Option ExplicitDim FS As IntegerPrivate Sub cmdExit_Click()Comm1.PortOpen = FalseEndEnd SubPrivate Sub cmdReceive_Click()txtReceive = Comm1.InputEnd SubPrivate Sub cmdSend_Click()Comm1.Output = txtSend.TextEnd SubPrivate Sub Comm1_OnComm() 'Label4.Caption = Comm1.Input End SubPrivate Sub Form_Load() Comm1.PortOpen = TrueEnd SubPrivate Sub txtReceive_Change() 'Comm1.OutputEnd Sub运行安装VPSD:用VPSD创建虚拟的端口:创建端口3,4运行两个例程,端口号分别设置为3,4:端口号3:端口号4的例程接受消息:端口号4的例程发送消息:端口为3的例程读取消息:四:实验总结通过本次试验,发现了自己在动手能力和自学能力方面的不足,我也进一步发现了自己在动手能力和自学能力方面的不足,然对本实验所涉及到的东西也算是有了不少兴趣,感觉越来越有意思然对本实验所涉及到的东西也算是有了不少兴趣,同时也对rs232串口的发送和接收信息有了进一步的了解,串口的发送和接收信息有了进一步的了解。
如何用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串口实验报告一:实验任务设计远程控制系统,要求通过局域网完成远程测控任务。
远程测控节点通过串口采集RM4040模块和STD100无纸记录仪的数据。
二:主要内容(1)熟悉VB环境,练习文本框、标签、定时器等常用控件的使用方法。
(2)检查RS232连接情况,并使用串口调试助手测试通信情况,进行串口通信编程(3)针对RM4040模块,编写串口通信程序(无校验)、完成通讯错误处理、超时处理(4)编写带有校验协议的处理程序,读取STD100模块的数据(5)对读取的数据采用不同的滤波算法进行处理(6)***试编写程序模拟RM4040模块的通讯功能(7)编写简单的网络通信程序,实现远程计算机控制(8)编写权限控制,优化程序,完善设计。
三:实验程序及分析Dim a, b, c, d, e, f, g, h, i, z As Integer ‘定义变量名,类型Dim aa(10), bb(10), cc(10) As Double ‘定义数组名,类型Private Sub Command1_Click()Text1.Text = "@01R" ‘在Text1中写入需要发送的端口代码MSComm1.Output = Text1.TextTimer2.Enabled = TrueEnd SubPrivate Sub Command2_Click()If Timer1.Enabled = False ThenTimer1.Enabled = TrueCommand2.Caption = "结束自动发送" ‘控制是否进行自动发送ElseIf Timer1.Enabled = True ThenTimer1.Enabled = FalseCommand2.Caption = "自动发送"End IfEnd SubPrivate Sub Command3_Click() ‘通过MSComm1.RThreshold字符串的长度控制选择的是无纸记录仪还是数字输出模块If MSComm1.RThreshold = 39 ThenMSComm1.RThreshold = 22Command3.Caption = "无纸记录仪"ElseIf MSComm1.RThreshold = 22 ThenMSComm1.RThreshold = 39Command3.Caption = "数字输出模块"End IfEnd SubPrivate Sub Form_Load()z = 1mPort = 1 ‘选择端口号If MSComm1.PortOpen = False ThenMSComm1.PortOpen = True ‘打开串口End IfEnd SubPrivate Sub MSComm1_OnComm()Text2.Text = MSComm1.InputIf Command3.Caption = "无纸记录仪" Then ‘无纸输出记录仪b = Mid(Text2.Text, 8, 1)c = Mid(Text2.Text, 13, 1)d = Mid(Text2.Text, 18, 1)e = Mid(Text2.Text, 4, 4)f = Mid(Text2.Text, 9, 4)g = Mid(Text2.Text, 14, 4)Text3.Text = e * 10 ^ (-b)Text4.Text = f * 10 ^ (-c)Text5.Text = g * 10 ^ (-d) ‘显示压力温度流量Text6.Text = Mid(Text2.Text, 19, 2)'校验,个个位相互异或得出的结果,想与发送过来的效验值进行比较h = 0For i = 2 To 18h = h Xor Asc(Mid(Text2.Text, i, 1))Next iText7.Text = h'滤波,采用算术平均滤波法,连续采样10次求平均。
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 ’转让控制权,以便让操作系统处理其它的事件。
串口访问之一 串口访问之一2011-10-02 10:50:01 我来说两句收藏我要投稿 [字体:小大]一不小心看到一高手写的C#串中操作系列的文章,很不错,可惜我辈不懂C#,于是顺便改成用2010其中几乎都有注解。
顺便说明,再发送16进制不是很完善,有懂的兄弟,说明一下Imports SystemImports System.Collections.GenericImports ponentModelImports System.DataImports System.DrawingImports System.LinqImports System.TextImports System.IO.PortsImports System.Text.RegularExpressionsPublic Class Form1WithEvents Comm As SerialPort = New SerialPortPrivate Builder As StringBuilder = New StringBuilder '避免在事件处理方法中反复的创建,所以定义到外面Private ReceiveCount As Long = 0 '接收计数Private SendCount As Long = 0 '发送计数Private Listening As Boolean = False '是否没有执行完invoke 相关操作Private Closingg As Boolean = False '是否正在关闭串口,执行Application.DoEvents,并阻止再次invokePublic Delegate Sub UpdateData(ByVal mByte() As Byte)Public Sub ShowData(ByVal mByte() As Byte)Console.WriteLine(mByte)ReceiveCount += mByte.LengthBuilder.Clear()If CheckBoxHex.Checked ThenFor Each b As Byte In mByteBuilder.Append(b.T oString("X2") + " ")NextElseBuilder.Append(Encoding.ASCII.GetString(mByte))End IfTxtGet.AppendText(Builder.ToString)labelGetCount.T ext = "Get:" + ReceiveCount.ToStringEnd SubPrivate Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load'初始化下拉串口名称列表框Dim Ports() As String = SerialPort.GetPortNamesArray.Sort(Ports)ComboPortName.Items.AddRange(Ports)ComboPortName.SelectedIndex = IIf(ComboPortName.Items.Count > 0, 0, -1)ComboBaudrate.SelectedIndex = ComboBaudrate.Items.IndexOf("9600")'初始化Serialport对象Comm.NewLine = vbCrLfComm.RtsEnable = True'AddHandler Obj.Ev_Event, AddressOf EventHandler'RemoveHandler Obj.Ev_Event, AddressOf EventHandler'AddHandler Comm.DataReceived, AddressOf Comm_DataReceivedEnd SubPrivate Sub Comm_DataReceived(sender As Object, e As System.IO.Ports.SerialDataReceivedEventArgs) Handles Comm.DataReceivedIf Closingg Then Return '如果正在关闭,忽略操作,直接返回,尽快的完成串口监听线程的一次循环TryListening = True '设置标记,说明我已经开始处理数据,一会儿要使用系统UI的。
其于MFC的串口调试助手编辑过程一、新建打开VC6.0 文件新建工程MFC AppWiard(exe) 位置(选择保存工程位置)工程名称(输入工程名XXXX)确定选择基本对话框下一步下一步下一步选择(CXXXXDlg)完成确定在生成的基本对话框内将不需要按钮及提示框(自动生成的“确定”“取消”及提示框)删除或修改使用,至此基本框架完成如下图:二、往生成的基本框架中添加控件1、因为控件列表框内没有串口通信用到的通信控件,所以要先添加到控件列表框内再将控件添加到基本框内使用,步骤如下:菜单栏工程添加到工程Components and controls…Registered ActiveX Controls 选择“Microsoft Communications Control, version 6.0”Insert 确定OK 关闭此子窗口完成添加操作标志如上图所示。
2、将刚才添加添加到控件列表框内的串口控件添加到基本框架内点击控件列表框内的串口控件,此时光标变为“十”形,在基本框架内随意划取一矩形区域,即可以添加串口控件,不需要修改此控件的大小及位置,因为程编译运行后此控件是看不到的,步骤结果如下图:此控件(标志)是下面步骤添加进来的串口控件基本框架3、继续往基本框架内添加用于编辑发送数据的输入编辑框及输出编辑框,同理选择控件列表框内的“编辑框控件”,以相同的操作即可添加两个编辑窗口及一个按纽控件如下图所示:选择其中任意一个作为输入编辑框及输出编辑框这两个窗口需要修改大小及位置,因为程序运行后将会显示而串口通信控件则不显示,上图是运行后的效果。
4、对以上四个控件编程步骤如下:a、右击串口通信控件建立类向导Member variables Control IDS中选择IDC_MSCOMM1 add variable…Member variable name中输入控件变量名m_ctrlComm(变量名可以随意选取,但程序中应与所取变量名一致)OK 确定b、右击编辑框、属性、常规、ID:中输入ID号,此编辑框用于接收显示数据的其ID 号为IDC_EDIT_RXDATA(可以随意选取,但程序中应与所取ID号一致),再在此窗口的样式中勾选”多行”,同时将“自动水平滚动(T)”勾选去掉,再勾选“垂直滚动(V)”,此勾选操作是用于垂直多行显示的,按回车后即可输入;同理右击另一编辑框输入ID号为IDC_EDIT_TXDATA此编辑框用于编辑发送数据的,同样也选上用于垂直多行显示,发送框可以不用垂直多行显示;再为按钮控件添加ID号,为IDC_BUTTON_MANUALSEND,并将标题中的“Button1”改为“发送”,功能是按一次就把发送编辑框中的内容发送一次。
串口调试助手使用说明和技术总结大全第一篇:串口调试助手使用说明和技术总结大全串口调试助手的技术报告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)串口接收显示的数据丢失原因:接收显示是影响程序性能的一个大问题,当接收到大量数据时,串口通信助手响应不太及时,这个可能与调用类中的使用机制有关,但显示也没能很好地处理,不过在实际的传输过程中是没有丢失数据的。
用VB调试串口通讯现有电子秤一台,使用串口与计算机进行通讯。
编写VB程序来访问串口,达到读取电子秤上显示的数据。
该电子秤为BE01型仪表,输出为RS-232C标准接口,波特率为300-9600、偶校验、7个数据位、2个停止位。
所有字符均发送11位ASCII码,一个起始位。
在VB中与串口通讯需要引入控件MSComm串口通讯控件(在Microsoft Comm Control 6.0中)。
具体程序如下:控件简称:MSCDim Out(12) As Byte 接收var中的值Dim var As V ariant 接收MSC.input中的数值Dim nRece As Integer 计算MSC.inputbuffer的个数Dim i As Integer, j As Integer 随即变量,计算循环****************************************************************************Private Sub Form_Load()ClearTextWith MSC.CommPort = 1 设置Com1为通信端口.Settings = 9600,E,7,2 设置通信端口参数 9600赫兹、偶校验、7个数据位、1个停止位.(这里需要进一步说明的是:.Setting=”BBBB,P,D,S”。
含义是:B:Baud Rate(波特率);P:Parity(奇偶);D:Data Bit;S:Stop Bit).InBufferSize = 40 设置缓冲区接收数据为40字节.InputLen = 1 设置Input一次从接收缓冲读取字节数为1.RThreshold = 1 设置接收一个字节就产生OnComm事件End WithEnd Sub**************************************************************************** Private Sub ClearText()Text3.Text =Text2.Text = 5Text1.Text =End SubPrivate Sub Command1_Click()ClearTextnRece = 0 计数器清零With MSC.InputMode = comInputModeBinary 设置数据接收模式为二进制形式.InBufferCount = 0 清除接收缓冲区If Not .PortOpen Then.PortOpen = True 打开通信端口End IfEnd WithEnd SubPrivate Sub MSC_OnComm()DelayTime ‘用来延续时间ClearTextWith MSCSelect Case .CommEvent 判断通信事件Case comEvReceive: 收到Rthreshold个字节产生的接收事件SwichVar 1If Out(1) = 2 Then 判断是否为数据的开始标志.RThreshold = 0 关闭OnComm事件接收End IfDoDoEventsLoop Until .InBufferCount >= 3 循环等待接收缓冲区>=3个字节 nRece = nRece + 1For i = 2 To 12SwichVar iText1.Text = Text1.Text & Chr(Out(i))NextText1.Text = LTrim(Text1.Text)Text2.Text = Text2.Text & CStr(nRece).RThreshold = 1 打开MSComm事件接收Case Else.PortOpen = FalseEnd SelectEnd WithEnd Sub****************************************************************************Private Sub DelayTime()Dim bDT As BooleanDim sPrevious As Single, sLast As SinglebDT = TruesPrevious = Timer (Timer可以计算从子夜到现在所经过的秒数,在Microsoft Windows中,Timer函数可以返回一秒的小数部分)Do While bDTIf Timer - sPrevious >= 0.3 Then bDT = FalseLoopbDT = TrueEnd Sub(通信传输速率为9600bps,则最快速度1.04ms发送一个字节,仪表每秒发送50帧数据,每帧数据有4个字节,即每秒发送200个字节,平均5.0ms 发送一个字节,连续读取串口数据时要在程序中添加循环等待程序)Private Sub SwichV ar(ByV al nNum As Integer)DelayTimevar = Nullvar = MSC.InputOut(nNum) = var(0)End Sub(设置接收数据模式采用二进制形式,即 InputMode=comInputModeBinary,但用Input属性读取数据时,不能直接赋值给 Byte 类型变量,只能通过先赋值给一个 V ariant 类型变量,返回一个二进制数据的数组,再转换保存到Byte类型数变量中。
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。
开发全功能串口调试助手(含完整工程)
小记: 的串口通信用了很长时间了,也只用 Write 和Read 这样的方 法,以前都是用这种方式做上位机软件, 如此足矣。
而前几天研究GSM 模块时对 串口返回的数据总是把握不好,参考开发板附送的例程,发现采用
SerialPort
的DataReceived 事件,可以实现中断触发式的数据接收。
于是想到要自己做一 个串口调试助手,在实现基本功能的前提下增加一些方便自己调试的功能。
经过
断断续续的编写,就做成了下面这个小软件:
这个软件能够实现串口调试助手的全部功能,经过通信测试,数据接收性能 不亚于呼啸工作室的SComAssistant2.2,通过加大输入缓冲区,可以满足大量 数据接收。
的串口通信主要使用 VS 自带的SerialPort 控件,而不是早先的 MSComm 更具有兼容性,这也是很久以前就放弃 VB 改用.NET 的直接原因。
该控 件的主要方法、属性如下(该数据来自 VS 的MSD
帮助库):
想要通过串口收发数据,就需要对串口进行配置,包括设置端口、波特率、数据格式(如COM端口、9600bps、8位数据位、无校验位、1位停止位)等属性,之后通过Open方法打开串口。
打开串口可通过手动指定,也可以使用GetPortNames 方法获取计算机中存在的串口。
如果打开出错,则可能是串口不存在或者已被占用。
下面是相应代码:
Private SubSerialPortOpen()
On Error GoToErr
If SerialPort.IsOpen = True ThenSerialPort.Close() '避免重复打开端
口
SerialPort.Ope n()
LabelCOMStatus.Text ="串口已打开"
Exit Sub
Err: MsgBox(‘ 串口不存在或已被占用!" + vbNewLine + ErrorToString()) ' 出现错误,显示错误信息
En dSub
如果想要在串口中支持中文字符收发,则可在初始化时设置串口控件的编码:
SerialPort.E ncodi ng = System.Text.E ncodi ng.Default
发送数据通过Write方法来完成,由于串口调试助手需要支持文本和16进制, 需要加入转换代码:
Private SubButtonSendData_Click( ByVal sender AsSystem.Object, ByVal e AsSystem.EventArgs) Handles ButtonSendData.Click
On Error GoToErr
DimoutDataBuf AsString = TextBoxSend.Text
If outDataBuf = "" ThenExit Sub'如果输入文本框中没有数据则不发送
If SerialPort.lsOpen = True Then'判断串口是否打开
If HexSendFlag = True Then
' ----- 十六进制发送------------
outDataBuf = outDataBuf.Replace( "","")'清除空格与回车
outDataBuf = outDataBuf.Replace(vbNewLine, "")
'十六进制数据位数为偶数,例如:FF 00 15 AC 0D
If outDataBuf.Length Mod2 <> 0 Then
MsgBoxC请输入正确的十六进制数,用空格和回车隔开。
")
Exit Sub
En dIf
DimoutBytes(outDataBuf.Length / 2 - 1) As Byte
For I As Integer = 1 TooutDataBuf.Length - 1 Step 2
outBytes((I - 1) / 2) = Val( "&H" + Mid(outDataBuf, I, 2))
'VB 的十六进制表示方法,例如0x1D表示为& H1D
Next
SerialPort.Write(outBytes, 0, outDataBuf.Length / 2)
BarCou ntTx.Text = Val(BarCou ntTx.Text) + outDataBuf.Le ngth / 2
Else
' ------- 文本发送 --------------
SerialPort.Write(outDataBuf)
BarCountTx.Text = Val(BarCountTx.Text) + outDataBuf.Length '发送字节计数
En dIf
Else
MsgBox"串口未打开,请先打开串口。
")
En dIf
Exit Sub
Err: MsgBox(‘ 数据输入或发送错误!" + vbNewL ine + ErrorToStri ng())
En dSub
接收数据采用DataReceived事件,该事件在串口输入缓冲区中的字节数满足
设置条件时触发,并执行事件中的代码。
事件触发的字节数在ReceivedBytesThreshold 属性中设置,默认为1字节。
由于DataReceived事件采用了独立的线程,无法对软件界面中的控件进行直接操作,因而在现实时需要采用委托实例的方法。
首先建立委托:
Delegate SubRecieveRefreshMethodDelegate( ByVal [text] As String )'声
明委托
Dim RecieveRefresh AsNewRecieveRefreshMethodDelegate( AddressOf Recie veRefreshMethod)'定义数据显示委托实例
Sub RecieveRefreshMethod( ByVal str As String )'定义一个数据显示委托实例的方法
ShowRecieveData(str)
EndSub
其中ShowRecieveData函数将str字符串显示到TextBox控件中。
下面是DataReceived事件中对十六进制数据的处理。
同发送数据一样,读取数据时也要根据不同的显示方式使用不同的方法。
通过Read方法,根据缓冲区中存在的字节数读取十六进制数据,而文本显示则简单的多,只需ReadExisting即可。
最后通过Invoke方法调用委托,显示数据。
Private Sub SerialPort_DataReceived( ByVal sender As Object, ByVal e As
Syste m.10 .Ports.SerialDataReceivedEve ntArgs) Han dles 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(i nBytes, 0, i nDataLe n) '读取数据
For Each bytes In in Bytes
strHex = strHex + [String].Format( "{0:X2} ", bytes)'格式化成十六
进制(不含&H)
Next
TextBoxRecieve.I nvoke(RecieveRefresh, strHex) '调用委托,显示接收的数据
BarCou ntRx.Text = (Val(BarCou ntRx.Text) + in DataLe n).ToStri ng ' 接收字节计数
End If
Else
'------------ 文本显示----------
Dim str As String
str = SerialPort.ReadExisti ng '读取全部可用字符串
TextBoxRecieve .Inv oke(RecieveRefresh, str)
BarCou ntRx.Text = (Val(BarCou ntRx.Text) + str.Le ngth).ToStri ng '接收字节计数
End If
End Sub
至此就实现了串口收发的基本功能,另外的定时收发(使用Timer控件)、
文件发送(使用FileSystem )参见附带的源文件代码。
(附件功能完全不给力呀,终于传上来了... ) AHSerialPortEIf.rar
在完成串口调试助手的功能后,还可以根据个人的使用习惯或需求,添加相应的功能。