RS232,RS485通信

fiten_z 2011-08-31 09:18:35
一個溫度控制器,RS485接口,現用一個轉接口轉換為RS232接口連接到電腦上

控制器一些設定如下:



使用控制器自帶軟件進行通訊時一切正常:點擊傳送 最下面的為接受字符,其實只有00E9(十六進制)這幾個為有效數據


我C#(form)自己寫了程式,定時從控制器獲取數據,可無法讀取到數據,請問下是不是要設置通訊位址,通訊指令什麽的,自己參考了好多的列子都無法實現!

很急很急,急求幫忙,搞了好幾天頭都大了!
...全文
415 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
fiten_z 2011-09-03
  • 打赏
  • 举报
回复
知道做了修改,不行的
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wl58796351 的回复:]
mPortName = cmbCOM.SelectedItem.ToString '欲打开的通信端口
mBaudRate = 9600 '通信速度
mParity = Parity.None '同位位检查设定
mDataBit = 8 '数据位设定值
mStopbit = StopBits.One '停止位设定值[/Quote]

这肯定是与lz的图片不对应的。图片中显示的是

COM6: 9600, E, 7, 1

这个参数。
wl58796351 2011-09-01
  • 打赏
  • 举报
回复
他每隔一定时间段就执行一次
1、如果不能获得的数据,要看你的输入的格式,是BINARY 还是ASCII .
2、对输入字符串形式进行一定转换。即可
清风道禅 2011-09-01
  • 打赏
  • 举报
回复
楼主设置的参数没设置对···仔细一点 - -
peng_yaoming 2011-08-31
  • 打赏
  • 举报
回复
4樓可以~~~
wl58796351 2011-08-31
  • 打赏
  • 举报
回复
Imports System.IO.Ports
Imports System.Text

Public Class Form1
'声明一个通信端口对象
' Dim RS232 As SerialPort
'声明一个委派类别,并声明符合函式参数有一个,而其型态是字符串
Delegate Sub SetTextCallback(ByVal InputString As String)

'**************************************************************
'表单的Load事件中先将所有的通信端口先列出来
'将通信端口排序,并将第一个通信端口设为默认值
'**************************************************************
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
For Each sp As String In SerialPort.GetPortNames()
cmbCOM.Items.Add(sp)
Next
cmbCOM.Sorted = True '排序
cmbCOM.SelectedIndex = 0 '第一个是默认选项
End Sub

'**************************************************************
'『打开通信端口』按钮的Click事件
'此事件将设定通信端口参数,并打开通信端口
'**************************************************************
Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click
Dim mBaudRate As Integer
Dim mParity As IO.Ports.Parity
Dim mDataBit As Integer
Dim mStopbit As IO.Ports.StopBits
Dim mPortName As String

mPortName = cmbCOM.SelectedItem.ToString '欲打开的通信端口
mBaudRate = 9600 '通信速度
mParity = Parity.None '同位位检查设定
mDataBit = 8 '数据位设定值
mStopbit = StopBits.One '停止位设定值
'建立一个通信端口对象

If Not Rs232.IsOpen Then '尚未打开
Rs232 = New IO.Ports.SerialPort(mPortName, mBaudRate, mParity, mDataBit, mStopbit)
Rs232.Encoding = Encoding.ASCII
' RS232.Encoding = Encoding.Unicode '设定编码方式为Unicode,以便能显示中文
Console.WriteLine(Rs232.IsOpen)

' RS232.ReceivedBytesThreshold = 18 '检查设备的实际阀值18
Rs232.Open() '打开通信端口
btnSend.Enabled = True '致能传送按钮
BkWorker.WorkerSupportsCancellation = True
If Not BkWorker.IsBusy Then '判断工作状态
BkWorker.RunWorkerAsync() '开始背景作业
End If

Else
MsgBox("~~通信端口打开错误(通信端口已被打开)~~", MsgBoxStyle.Critical Or MsgBoxStyle.OkCancel)
' End
End If

End Sub

'**************************************************************
'『关闭通信端口』按钮的Click事件
'以Close方法关闭通信端口,并释放对象所占用的资源
'**************************************************************
Private Sub btnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose.Click
If RS232 Is Nothing OrElse Not RS232.IsOpen Then '尚未打开
MsgBox("~~通信端口尚未打开~~", MsgBoxStyle.Critical Or MsgBoxStyle.OkCancel)
Else
btnSend.Enabled = False
BkWorker.CancelAsync() '取消作业
RS232.Close()
End If

End Sub

'**************************************************************
'『结束程序』按钮 的Click事件
'此事件将设定通信端口参数,并打开通信端口
'**************************************************************
Private Sub btnEnd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEnd.Click
If Not RS232 Is Nothing Then '判断是否已建立通信对象
If RS232.IsOpen Then RS232.Close() '若已打开,就将其关闭
End If
End
End Sub

'**************************************************************
'实№的取值程序
'**************************************************************
Private Sub GetRS232Data()
Dim InString As String
InString = ""
If Not RS232.IsOpen Then Exit Sub
Try
RS232.ReadTimeout = 1000

InString = RS232.ReadExisting
If InString.Length = 0 Then '若无数据则跳出
Exit Sub
Else
DisplayText(InString) '若有数据则加到接收的文字框
End If
Catch ex As Exception
MessageBox.Show("读取错误:" + ex.ToString, "错误通知", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
End Try

End Sub

'**************************************************************
'委派子程序
'处理上述通信端口的接收事件
'由于欲将数据显示到接收文字框中,因此必须检查是否由另外的Thread
'所调用的,若是,则必须先建立委派对象
'Invoke用于在拥有控制项基础视窗控制代码的进程上执行委派
'**************************************************************
Private Sub DisplayText(ByVal comData As String)
'如果调用txtReceive的是另外的进程,传回True
If Me.txtReceive.InvokeRequired Then
Dim d As New SetTextCallback(AddressOf DisplayText)
'用大括号 {} 括住初始值,藉以初始化阵列的值。
Me.Invoke(d, New Object() {comData}) '以指定的引数清单叫用函式
Else '相同的进程
Me.txtReceive.Text += comData '将收到的数据入接收文字框中
End If

End Sub

'**************************************************************
'『传送』按钮的Click事件
'将文字框中的文字以Write方法自串行端口送出
'**************************************************************
Private Sub btnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSend.Click
Dim tmpdata As String = ":010347000002B3" & vbCrLf
Rs232.Write(tmpdata)
End Sub

'**************************************************************
'通信端口的KeyPress事件,在此不让用户输入数据
'**************************************************************
Private Sub cmbCOM_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles cmbCOM.KeyPress
e.KeyChar = ChrW(0) '禁止用户在其中输入任何的文字
End Sub

'**************************************************************
'BackgroundWorker的DoWork事件
'当RunWorkAsync方法被调用时,会引发此事件
'将欲执行的方法放在这里面,即可由另一个进程执行
'**************************************************************
Private Sub BkWorker_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BkWorker.DoWork
GetRS232Data()
If BkWorker.CancellationPending Then
e.Cancel = True
End If
End Sub

'**************************************************************
'BackgroundWorker的RunWorkerCompleted事件
'当DoWork事件被执行完后,即引发此事件
'程序中检查取消状态,若非取消状态就继续执行背景作业
'**************************************************************
Private Sub BkWorker_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BkWorker.RunWorkerCompleted
If Not BkWorker.CancellationPending Then
BkWorker.RunWorkerAsync() '开始背景作业
End If
End Sub

End Class

萧炎 2011-08-31
  • 打赏
  • 举报
回复
学习 帮顶!
wl58796351 2011-08-31
  • 打赏
  • 举报
回复
这个其实是采用MODUB RTU方式进行读取的。遵循相应的协议,就可以了。
fiten_z 2011-08-31
  • 打赏
  • 举报
回复
他的指令說明
fiten_z 2011-08-31
  • 打赏
  • 举报
回复
還是無法取得數據,問下Private Sub GetRS232Data() 在什麽時候執行啊
fiten_z 2011-08-31
  • 打赏
  • 举报
回复
知道了呵呵
fiten_z 2011-08-31
  • 打赏
  • 举报
回复
BkWorker是什麽未定義呢

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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