VS2010環境下使用VB編寫串口助手


1、在Form1的設計模式下添加以下控件:

2、添加好控件之后我們就可以打開Form1.vb進行編程了:

  1 '使用串口需要引用的命名空間
  2 Imports System.IO.Ports
  3 Imports System
  4 
  5 
  6 Public Class Form1
  7 
  8   
  9 
 10     '在設計視圖中雙擊Form1窗體出現的函數,在第一次顯示窗體前發生的事件寫在這個里面,類似於ViewWillAppear
 11     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 12 
 13         Dim ports As String() = SerialPort.GetPortNames() '必須用命名空間,用SerialPort,獲取計算機的有效串口
 14 
 15         Dim port As String
 16 
 17         For Each port In ports
 18             portnamebox.Items.Add(port) '向combobox中添加項
 19         Next
 20 
 21         '初始化界面
 22         baudratebox.Text = baudratebox.Items(2) '注釋和不注釋的地方可以替換
 23         portnamebox.Text = portnamebox.Items(0)
 24         'baudratebox.SelectedIndex() = 2
 25         ' portnamebox.SelectedIndex() = 0
 26         Serial_Port1() '初始化串口
 27         Label3.Text = SerialPort1.IsOpen
 28         statuslabel.Text = "串口未連接"
 29         statuslabel.ForeColor = Color.Red
 30         sendbox.Text = "123"
 31         receivebytes.Text = "0"
 32         linecheck.Enabled = True
 33         timebox.Enabled = True
 34 
 35         '讓發送、接收數據按鈕不能點擊(失能)
 36         Button1.Enabled = False
 37         Button2.Enabled = False
 38         Button3.Enabled = False
 39 
 40 
 41 
 42 
 43     End Sub
 44 
 45 
 46     Private Sub Serial_Port1() '設置串口參數
 47         'SerialPort1.BaudRate = Val(baudratebox.Text) '波特率
 48         'SerialPort1.PortName = portnamebox.Text '串口名稱
 49         SerialPort1.PortName = portnamebox.SelectedItem
 50         SerialPort1.BaudRate = Val(baudratebox.SelectedItem)
 51         SerialPort1.DataBits = 8 '數據位
 52         SerialPort1.StopBits = IO.Ports.StopBits.One '停止位
 53         SerialPort1.Parity = IO.Ports.Parity.None '校驗位
 54     End Sub
 55 
 56 
 57     '關閉串口連接
 58     Private Sub closebtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles closebtn.Click
 59         Try
 60             SerialPort1.Close() '關閉串口
 61 
 62             '讓發送、接收數據按鈕不能點擊(失能)
 63             Button1.Enabled = False
 64             Button2.Enabled = False
 65             Button3.Enabled = False
 66 
 67             Label3.Text = SerialPort1.IsOpen
 68             If SerialPort1.IsOpen = False Then
 69                 statuslabel.Text = "串口未連接"
 70                 statuslabel.ForeColor = Color.Red
 71                 receivebox.Text = ""
 72                 receivebytes.Text = ""
 73             End If
 74         Catch ex As Exception
 75             MessageBox.Show(ex.Message)
 76         End Try
 77     End Sub
 78 
 79 
 80     '打開串口連接
 81     Private Sub openbtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles openbtn.Click
 82         Try
 83             SerialPort1.Open() '打開串口
 84             timebox.Enabled = True
 85             '使能按鈕
 86             Button1.Enabled = True
 87             Button2.Enabled = True
 88             Button3.Enabled = True
 89 
 90 
 91             Label3.Text = SerialPort1.IsOpen
 92             If SerialPort1.IsOpen = True Then
 93                 statuslabel.Text = "串口已連接"
 94                 statuslabel.ForeColor = Color.Green
 95             End If
 96         Catch ex As Exception
 97             MessageBox.Show(ex.Message)
 98         End Try
 99     End Sub
100 
101 
102 
103     '手動發送數據
104     Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
105         send()
106     End Sub
107 
108 
109     '觸發接收事件,接收數據
110     Public Sub Sp_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
111         Me.Invoke(New EventHandler(AddressOf Sp_Receiving)) '調用接收數據函數
112     End Sub
113 
114 
115 
116     '接收數據過程
117     Private Sub Sp_Receiving(ByVal sender As Object, ByVal e As EventArgs)
118 
119         ' Dim strIncoming As Byte
120         Dim strIncoming As Integer
121         Dim str1() As String
122         Dim str2() As String
123         Dim bytes() As Byte
124         Dim i As Integer
125         Try
126             Threading.Thread.Sleep(100) '添加的延時
127             ' receivebytes.Text = Str(Val(receivebytes.Text) + SerialPort1.BytesToRead)
128             receivebytes.Text = Str(SerialPort1.BytesToRead)
129 
130             If SerialPort1.BytesToRead > 0 Then
131 
132                 ReDim bytes(SerialPort1.BytesToRead)
133                 'strIncoming = Convert.ToByte(SerialPort1.ReadByte())
134                 If receivecheck.Checked = True Then
135                     strIncoming = SerialPort1.ReadByte()
136                     bytes(0) = strIncoming
137                     For i = 1 To SerialPort1.BytesToRead
138                         strIncoming = SerialPort1.ReadByte() '讀取緩沖區中的數據
139                         bytes(i) = strIncoming
140                     Next
141                     ' SerialPort1.Write(sendbox.Text)'發送數據
142                     SerialPort1.DiscardInBuffer()
143                     str1 = Split(BitConverter.ToString(bytes), "-")
144 
145                     ReDim str2(str1.Length - 1) '去除str1中最后的字符
146                     For i = 0 To str1.Length - 2
147                         str2(i) = str1(i)
148                     Next
149                     receivebox.Text = receivebox.Text & Join(str2, " ")
150                     'BitConverter.ToString(bytes)
151                 Else
152                     receivebox.Text = receivebox.Text & SerialPort1.ReadExisting()
153                 End If
154 
155             End If
156             
157         Catch ex As Exception
158             MessageBox.Show(ex.Message)
159         End Try
160     End Sub
161 
162     Public Sub send() '發送數據過程
163         Dim databyte() As Byte
164         Dim str1() As String
165         Dim str2 As String
166         Dim str3 As String
167         Dim i As Integer
168 
169         Try
170             If sendcheck.Checked = False Then '不按照16進制發送
171                 'timecheck.Enabled = True
172 
173                 If linecheck.Checked = False Then '判斷是否選中分行發送
174                     SerialPort1.Write(sendbox.Text)
175                 Else
176                     SerialPort1.WriteLine(sendbox.Text)
177                 End If
178 
179             Else '按照16進制發送
180                 If InStr(sendbox.Text, " ") Then '判斷是否有空格
181                     str1 = Split(sendbox.Text)
182                     str2 = Join(str1, "")
183                 Else
184                     str2 = sendbox.Text
185                 End If
186 
187                 If str2.Length Mod 2 = 0 Then '判斷字符串字節數是否為偶數
188                     ReDim databyte(str2.Length / 2) '重新定義數組
189                     For i = 0 To str2.Length / 2 - 1
190                         databyte(i) = Convert.ToByte(Mid(str2, 2 * i + 1, 2), 16) '兩個字符轉換為一個16進制字節
191                         'databyte(i) = Val(Mid(str2, 2 * i + 1, 2))
192                     Next
193                     SerialPort1.Write(databyte, 0, databyte.Length - 1)
194                     sendbytes.Text = Str(Val(sendbytes.Text) + databyte.Length - 1)
195                 Else
196 
197                     str3 = Mid(str2, 1, (str2.Length - 1)) & "0" & Mid(str2, str2.Length)
198                     ReDim databyte(str3.Length / 2)
199                     For i = 0 To str3.Length / 2 - 1
200                         databyte(i) = Convert.ToByte(Mid(str3, 2 * i + 1, 2), 16)
201                     Next
202                     SerialPort1.Write(databyte, 0, databyte.Length - 1)
203                     sendbytes.Text = Str(Val(sendbytes.Text) + databyte.Length - 1)
204                 End If
205                 'databyte = System.Text.Encoding.Default.GetBytes(sendbox.Text)把每個字符轉換成字節
206 
207             End If
208 
209         Catch ex As Exception
210             MessageBox.Show(ex.Message)
211         End Try
212 
213     End Sub
214 
215     '更改串口設置
216     Private Sub portnamebox_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles portnamebox.SelectedIndexChanged
217         Try
218             Serial_Port1()
219         Catch ex As Exception
220             MessageBox.Show(ex.Message)
221         End Try
222     End Sub
223    
224     '清空發送區數據
225     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
226         sendbox.Text = ""
227     End Sub
228 
229     '清空接收區數據
230     Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
231         receivebox.Text = ""
232         receivebytes.Text = 0
233 
234     End Sub
235 
236     '定時發送數據
237     Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
238         Timer1.Interval = timebox.Text
239         send()
240     End Sub
241 
242     '選擇定時發送的觸發事件
243     Private Sub timecheck_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timecheck.CheckedChanged
244 
245         If timecheck.Checked = True Then
246             If timebox.Text = "" Then
247                 MsgBox("時間間隔不能為0")
248                 timecheck.Checked = False
249             Else
250                 send()
251                 timebox.Enabled = False
252             End If
253         Else
254             timebox.Enabled = True
255         End If
256     End Sub
257 
258 
259 
260 
261     
262     
263 End Class

 

 

然后運行,由於我電腦上沒有串口,所以使用usb轉串口線,這個線所用的轉換芯片是ch340。

安裝好驅動之后在計算機管理中查是COM3.

然后把串口的2,3針腳用杜邦線短路,因為這樣的話我用電腦發送后又可以用電腦的同一個串口接收數據,方便測試。

測試效果如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM