请高手用VB MSCOMM1控件编写与仪表通讯程序

我现有一台仪表,其通讯格式为1:数据格式:起始位1位,数据位7位,校验位1位,偶校验,停止位:1位,波特率9600.上位机从仪表读数据命令格式:HEX:04H,通讯地址,... 我现有一台仪表,其通讯格式为1:数据格式:起始位1位,数据位7位,校验位1位,偶校验,停止位:1位,波特率9600.上位机从仪表读数据命令格式:HEX:04H,通讯地址,参数名,05H.仪表应答格式为HEX:02H,参数名,参数值,03H,BBC.如读取1号地址的数据:上位机发送"04,30,30,31,31,50,56,05
则返回数据为:02,50,56,20,20,32,34,2E,03,2D,也就是1号地址的值为24
如何编写让数据读到计算机上.
gongxuchao,你好,按照你提供的代码我尝试与仪表进行了通讯,可就是数据上不来,还有你的MSComm1.RThreshold = 21我数了一下仪表返回的数据好像只有10个字节,不知你是如何得来的.重点是数据上不来,我的仪表好像在发送数据后没有反应,点型的是仪表的通讯灯没有闪烁.麻烦你再替我看看问题出在了哪里.谢了.
展开
 我来答
蓝方自控
2008-11-21 · TA获得超过116个赞
知道小有建树答主
回答量:286
采纳率:0%
帮助的人:322万
展开全部
这是串口接的初始化 代码。
MSComm1.Settings = "9600,n,7,1"
MSComm1.InputMode = comInputModeBinary
MSComm1.InBufferSize = 64
MSComm1.OutBufferSize = 64
MSComm1.RThreshold = 21 '按下位机返回数据字节长设置,设置接收字节长度
MSComm1.InBufferCount = 0
MSComm1.OutBufferCount = 0
MSComm1.CommPort = 2 '设置串口号
MSComm1.PortOpen = True '串口打开
接收代码:
Select Case MSComm1.CommEvent
Case comEvReceive
MSComm1.InputLen = 0
strBuff = MSComm1.Input
str() = strBuff
'接收数据处理为16进制
For i = 0 To UBound(str)
If Len(Hex(str(i))) = 1 Then
strdata = strdata & "0" & Hex(str(i))
Else
strdata = strdata & Hex(str(i))
End If
Next
text1.text=strdata
Call Timer1_Timer
end select

接收完毕后清空缓冲区:
Private Sub Timer1_Timer()
strdata = ""
End Sub

补充一下:我的这个代码是我用的代码我没有改。那个21是我接的数据长度,如果是你的话你改成10就好了。
建议你用串口调试精灵测试一下能不能接收到数据,如果串口精灵也接不到数据那么你就要检查一下你的单片机或者串口是否正在工作了。
不好意思代码落了两句现在我已经加上了。

你把数据位改成8位试一下呢?底层的东西我不懂。
建议你用串口调试精灵测试一下。我QQ170985401我可以把串口高度精灵传给你。周一到周五白天在线
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zdingyun
2008-11-20 · 知道合伙人软件行家
zdingyun
知道合伙人软件行家
采纳数:15429 获赞数:48173
1982年上海业余工业大学化工系毕业 现退休

向TA提问 私信TA
展开全部
Option Explicit
Dim strSj As String
Dim sum As Integer
Private Sub Command1_Click()
'04,30,30,31,31,50,56,05
Dim sendSj(7) As Byte
sendSj(0) = &H4
sendSj(1) = &H30
sendSj(2) = &H30
sendSj(3) = &H31
sendSj(4) = &H31
sendSj(5) = &H50
sendSj(6) = &H56
sendSj(7) = &H5
MSComm1.Output = sendSj
End Sub

Private Sub Form_Load()
MSComm1.CommPort = 1
MSComm1.Settings = "9600,E,7,1"
MSComm1.RThreshold = 1
MSComm1.InputMode = comInputModeBinary
MSComm1.PortOpen = True
End Sub

Private Sub MSComm1_OnComm()
Dim bytRe() As Byte
Select Case MSComm1.CommEvent
Case 2
sum = sum + 1
Debug.Print sum
bytRe = MSComm1.Input
Dim i As Integer
For i = 0 To UBound(bytRe)
If Len(Hex(bytRe(i))) = 1 Then
strSj = strSj & "0" & Hex(bytRe(i))
Else
strSj = strSj & Hex(bytRe(i))
End If
Next
If Mid(strSj, 1, 2) = "02" And Len(strSj) = 20 Then
Text1 = strSj
strSj = ""
End If
End Select
End Sub
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
沁园春虎
2008-11-20 · TA获得超过107个赞
知道答主
回答量:60
采纳率:0%
帮助的人:28.7万
展开全部
1
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
尼欧赵
2008-11-20 · TA获得超过823个赞
知道大有可为答主
回答量:1597
采纳率:0%
帮助的人:1210万
展开全部
----发送代码
MSCOMM1.PortOpen = True
Dim xx(7) As Byte
xx(0)=&H04,
xx(1)=&H30,
xx(2)=&H30,
xx(3)=&H31,
xx(4)=&H31,
xx(5)=&H50,
xx(6)=&H56,
xx(7)=&H05,
MSCOMM1.Output = xx
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式