vb2005串口通讯

shingyuan 2009-01-25 08:37:03
Public Class Form1


我些一个串口通讯的程序,用的是VB.net2005.用的是SerialPort类来实现。目的是通过调制解调器拨号,然后通过交换机连接到单片机(本程序单片机的号码是“#2”)。然后向单片机发送握手信号“OXEB”,然后等待单片机回复握手信号。捕捉并识别单片机回发的握手信号“OXEB”然后就OK了。我的问题是:我可以用这个方法打通电话(如果终端接的不是单片机,而是电话的话)。但如果接单片机就没反应了。不晓得问题出在了哪里?请各位帮我一下。
Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim text As String

Using com3 As IO.Ports.SerialPort = _
My.Computer.Ports.OpenSerialPort("COM3", 9600)
com3.DtrEnable = True
com3.Write("ATD #2" & vbCrLf)
' Insert code to transfer data to and from the modem.


com3.Write("OXEB")
com3.Close()
text = ReceiveSerialData()
com3.Close()
MessageBox.Show("text")

End Using

End Sub


Public Function ReceiveSerialData() As String
' Receive strings from a serial port.
Dim returnStr As String = ""

Using com3 As IO.Ports.SerialPort = _
My.Computer.Ports.OpenSerialPort("COM3", 9600)
Do
Dim Incoming As String = com3.ReadLine()
If Incoming Is Nothing Then
Exit Do
Else
returnStr &= Incoming & vbCrLf
End If
Loop
End Using

Return returnStr
End Function

End Class
...全文
540 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
zdingyun 2009-01-25
  • 打赏
  • 举报
回复
LZ:你上下位机通信协议未叙述清楚.我认为你所需发送的0XEB实际是&HEB字节数据,不是4字节的ASCII字符.

Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim bytHex(0) As Byte
bytHex(0) = &HEB
SerialPort1.Write(bytHex, 0, bytHex.Length)
End Sub

下面提供基于字节数据收发的VB.NET代码:
Public Class Form1
Dim mSTR As String
Dim strData As String
Dim strDat As String
'Dim mSize1 As Integer
Dim mRecvByte() As Byte
Dim Hexsj As String
Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
Dim mSize As Integer = Me.SerialPort1.BytesToRead
'mSize1 = mSize
ReDim mRecvByte(mSize - 1)
SerialPort1.Read(mRecvByte, 0, mSize)
'mSTR = Encoding.Default.GetString(mRecvByte, 0, mSize)
BeginInvoke(New EventHandler(AddressOf ONMLoadA), SerialPort1.BytesToRead()) '使用委托方式显示接收到的字符串
End Sub
Sub ONMLoadA(ByVal sender As System.Object, ByVal e As System.EventArgs) '委托
'TextBox4.Text = mSTR
Dim i As Integer
For i = 0 To UBound(mRecvByte) 'mSize - 1
strData = strData & IIf(mRecvByte(i) > 15, Hex(mRecvByte(i)), "0" & Hex(mRecvByte(i)))
Next
Dim sj As Byte
For i = 1 To Len(strData) Step 2 '处理为ASCII字符
sj = Val("&H" & Mid(strData, i, 2))
If sj < 32 Or sj > 128 Then '当接收字节中有Chr(0)时,其后字符被切割
strDat = strDat & "."
Else
strDat = strDat & Chr(sj)
End If
Next
TextBox1.Text = strDat '显示字符
TextBox2.Text = strData '显示为进制
TextBox3.Text = Len(strData) / 2
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
SerialPort1.BaudRate = 9600 '波特率设为
SerialPort1.PortName = "com1" '端口为串口
SerialPort1.ReceivedBytesThreshold = 1
If SerialPort1.IsOpen = False Then SerialPort1.Open() '打开串口
Hexsj = "002702013524200239892700020020010201E9030D07"
TxtSend.Text = Hexsj
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
strData = ""
strDat = ""
TextBox1.Text = ""
TextBox2.Text = ""
TextBox3.Text = ""
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim bytHex() As Byte
ReDim bytHex((Len(Hexsj) \ 2) - 1)
Dim i As Integer
For i = 1 To Len(Hexsj) Step 2
bytHex((i - 1) / 2) = Val("&H" & Mid(Hexsj, i, 2))
Next
SerialPort1.Write(bytHex, 0, bytHex.Length)
End Sub
End Class

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧