vb.net 怎么用事件触发的方式读取串口数据
我现在在写一个程序,通过串口向下位机发送一组数据,请求下位机返回数据(已实现)现在想要读取数据,就是当串口有数据发送来时通知上位机程序,上位机自动读取数据并显示在text...
我现在在写一个程序,通过串口向下位机发送一组数据,请求下位机返回数据 (已实现)
现在想要读取数据,就是当串口有数据发送来时通知上位机程序,上位机自动读取数据并显示在textbox里 怎么说实现 开发工具vs 2008
dim send_bytes(0 to 18) as bytes
dim send_buffer as string
send_bytes(0) = &HAA
send_bytes(1) = &H55
send_bytes(2) = &HD
send_bytes(3) = &H73
send_bytes(4) = &H68
send_bytes(5) = &H69
send_buffer = System.Text.Encoding.Default.GetString(send_bytes)
这是发送数据代码 在串口调试助手里调试没问题 但是在程序里就接收不到数据
我定义了一个timer控件 不断发送数据和接收 具体代码是
SerialPort1.Write(send_buffer)
a = SerialPort1.ReadExisting
TextBox2.Text = a
但是textbox里一直没有数据 是哪里的问题呢 展开
现在想要读取数据,就是当串口有数据发送来时通知上位机程序,上位机自动读取数据并显示在textbox里 怎么说实现 开发工具vs 2008
dim send_bytes(0 to 18) as bytes
dim send_buffer as string
send_bytes(0) = &HAA
send_bytes(1) = &H55
send_bytes(2) = &HD
send_bytes(3) = &H73
send_bytes(4) = &H68
send_bytes(5) = &H69
send_buffer = System.Text.Encoding.Default.GetString(send_bytes)
这是发送数据代码 在串口调试助手里调试没问题 但是在程序里就接收不到数据
我定义了一个timer控件 不断发送数据和接收 具体代码是
SerialPort1.Write(send_buffer)
a = SerialPort1.ReadExisting
TextBox2.Text = a
但是textbox里一直没有数据 是哪里的问题呢 展开
展开全部
首先:
textbox里没有显示,是因为SerialPort1和TextBox2不是同一线程创建的,需要跨线程操作。需要用到委托,这样才能显示出来。
其次:
我觉得用串口的接收数据事件更好一些。
下面代码供参考:
'----------------------
'串口接收数据事件,其实比用定时器更好,
'触发事件的条件可以自己在form_load中设置ReceivedBytesThreshold属性数值,默认为ReceivedBytesThreshold=1
Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
Dim strRecvData As String = ""
strRecvData = SerialPort1.ReadExisting
Call disPlayComData(strRecvData)
End Sub
Delegate Sub callback(ByVal strT As String) '定义委托
Sub showString(ByVal comdata As String) '显示结果
Me.TextBox1.Text = "结果:" & comdata
End Sub
Sub disPlayComData(ByVal strTmp As String) '判定是否为跨线程
If Me.TextBox1.InvokeRequired Then
Dim d As New callback(AddressOf showString)
Me.Invoke(d, New Object() {strTmp})
Else
Me.TextBox1.Text = strTmp
End If
End Sub
textbox里没有显示,是因为SerialPort1和TextBox2不是同一线程创建的,需要跨线程操作。需要用到委托,这样才能显示出来。
其次:
我觉得用串口的接收数据事件更好一些。
下面代码供参考:
'----------------------
'串口接收数据事件,其实比用定时器更好,
'触发事件的条件可以自己在form_load中设置ReceivedBytesThreshold属性数值,默认为ReceivedBytesThreshold=1
Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
Dim strRecvData As String = ""
strRecvData = SerialPort1.ReadExisting
Call disPlayComData(strRecvData)
End Sub
Delegate Sub callback(ByVal strT As String) '定义委托
Sub showString(ByVal comdata As String) '显示结果
Me.TextBox1.Text = "结果:" & comdata
End Sub
Sub disPlayComData(ByVal strTmp As String) '判定是否为跨线程
If Me.TextBox1.InvokeRequired Then
Dim d As New callback(AddressOf showString)
Me.Invoke(d, New Object() {strTmp})
Else
Me.TextBox1.Text = strTmp
End If
End Sub
追问
我是新手 有些东西不太清楚 SerialPort1_DataReceived这个过程怎么调用,调用时参数sender和e写什么
还有多个线程同时向这一个串口发送不同请求 会不会产生数据传送问题?会的话怎么解决呢?
追答
SerialPort1_DataReceived 是SerialPort1的一个事件,就像Button1_Click是按钮的鼠标单击事件。每个事件都与自己的触发条件。如Button1_Click就是鼠标左键单击,就会触发这个事件,如果你想单击鼠标左键是打开串口,那么在Button1_Click里添加打开串口的代码就可以了。SerialPort1_DataReceived是在设置串口接收缓冲区到达一定字节后会触发的事件(假设为8个字节),就是说,我们希望串口接收到8个字节时告诉我,系统就通过SerialPort1_DataReceived事件通知我们了,只需要在SerialPort1_DataReceived中添加处理接收缓冲区字节的代码就行了,参数不用管。
另外,多线程同时对同一个串口操作会出错的。
上面的代码并不是多个线程对同一个串口操作,而是把串口的数据读取出来后,委托给其他线程处理。这个是.net的机制,建议你看看基础的东西
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询