| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 685 人关注过本帖
标题:串口通讯 绘制实时曲线
只看楼主 加入收藏
wxe0510
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2015-4-21
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:4 
串口通讯 绘制实时曲线
Option Explicit
Dim inputdata As String
Dim DataFromCom As Integer
Dim DataFromComLast As Integer
Dim TimeCount As Integer


Private Sub Check1_Click()
If Check1.Value = 1 Then
MSComm1.InBufferSize = 1024
MSComm1.InBufferCount = 0
MSComm1.InputMode = 1
= 3
MSComm1.Settings = "9600,N,8,1"

Check2.Enabled = False

End If
If Check1.Value = 0 Then
Timer1.Enabled = False
Check2.Enabled = True

End If
End Sub

Private Sub Check2_Click()

If Check2.Value = 1 Then
MSComm1.InBufferSize = 1
MSComm1.InBufferCount = 0
MSComm1.InputMode = comInputModeText
= 2
MSComm1.Settings = "9600,N,8,1"

Check1.Enabled = False

End If
If Check2.Value = 0 Then
Timer1.Enabled = False
Check1.Enabled = True

End If
End Sub

Private Sub Command1_Click(Index As Integer)
'Timer1.Enabled = True
If MSComm1.PortOpen = False Then
MSComm1.PortOpen = True
End If
End Sub

Private Sub Command2_Click(Index As Integer)
Timer1.Enabled = False
MSComm1.PortOpen = False

End Sub

Private Sub Command3_Click()
Unload Form1
End Sub
Private Sub Form_Unload(Cancel As Integer)
    If MSComm1.PortOpen = True Then
    MSComm1.PortOpen = False
    End If
End Sub

Private Sub Form_Load()
Timer1.Interval = 1
Timer1.Enabled = False
PicScale pic
End Sub
Private Sub PicScale(picX As PictureBox)
picX.Scale (0, 8750)-(picX.ScaleWidth, -1400)
End Sub

Private Sub DrawRealLine(picX As PictureBox, TimeCountX As Integer, DataFromComX As Integer, DataFromComLastX As Integer)

If TimeCountX - 1 > 0 And (TimeCountX - 1) * 15 < pic.Width Then
picX.Line ((TimeCountX - 1) * 15, DataFromComLastX)-(TimeCountX * 15, DataFromComX), vbBlue
End If
If (TimeCountX - 1) * 15 > pic.Width Then
TimeCount = 0
pic.Cls
End If

End Sub

Private Sub MSComm1_OnComm()
Dim byte1() As Byte
Dim i As Integer
If MSComm1.InBufferCount > 0 Then
byte1 = MSComm1.Input
 For i = 0 To UBound(byte1)
  inputdata = inputdata & Str(byte1(i)) & " "
  Text1.Text = Val(byte1(i))
  
 Next i
 Text2.Text = inputdata

  DataFromCom = Text1
  DataFromComLast = DataFromCom
  TimeCount = TimeCount + 1
  DrawRealLine pic, TimeCount, DataFromCom, DataFromComLast
'Text1.Text = Asc(MSComm1.Input)
'Text2.Text = Text2.Text & " " & Str(byte1(0)) & Str(byte1(1))
'DataFromCom = Text1
'Debug.Print DataFromCom


End If
End Sub

我原来INPUTMODE选的是文本形式,现在改成二进制形式,就怎么也用不了drawrealline这个函数了  ,请问大神们,ONCOMM这里哪里错了 还是其他什么地方错了?
2015-04-21 20:22
lianyicq
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:26
帖 子:737
专家分:3488
注 册:2013-1-26
收藏
得分:20 
比较怀疑用在此用文本接收方式时能画出正确的曲线。假设下位机传来的是数字8,看看经过上述代码处理过程:
byte1(0)=8
byte1(1)=0
inputdata=" 8  0 "  注意空格
text1.text="0"
text2.text=" 8  0 "
datafromcom="0"
...
这能画正确的点?
建议画实时点用二进制接收方式。
参考:https://bbs.bccn.net/thread-444236-1-1.html

[ 本帖最后由 lianyicq 于 2015-4-22 13:41 编辑 ]

大开眼界
2015-04-22 10:59
wxe0510
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2015-4-21
收藏
得分:0 
以下是引用lianyicq在2015-4-22 10:59:01的发言:

比较怀疑用在此用文本接收方式时能画出正确的曲线。假设下位机传来的是数字8,看看经过上述代码处理过程:
byte1(0)=8
byte1(1)=0
inputdata=" 8  0 "  注意空格
text1.text="0"
text2.text=" 8  0 "
datafromcom="0"
...
这能画正确的点?
建议画实时点用二进制接收方式。
参考:https://bbs.bccn.net/thread-444236-1-1.html


我有点不理解,为什么text1.text是=0啊?
那个帖子看过了,但是没看到关键的绘图程序,说实话,二进制的绘图基本不懂,求一段实例

[ 本帖最后由 wxe0510 于 2015-4-23 19:06 编辑 ]
2015-04-23 19:05
lianyicq
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:26
帖 子:737
专家分:3488
注 册:2013-1-26
收藏
得分:0 
回复 3楼 wxe0510
如果下位机传来8
If MSComm1.InBufferCount > 0 Then
byte1 = MSComm1.Input
For i = 0 To UBound(byte1)
  inputdata = inputdata & Str(byte1(i)) & " "
  Text1.Text = Val(byte1(i))
Next i
Text2.Text = inputdata
DataFromCom = Text1
DataFromComLast = DataFromCom
TimeCount = TimeCount + 1
DrawRealLine pic, TimeCount, DataFromCom, DataFromComLast
按文本方式接受,byte1(0)为低八位,byte1(1)为高八位.
text1.text 经过i=0时为“8”,i=1时为“0”。
退出循环时当然为0。
即然文本数据能画图,按二进制接收的数据不能画?那是直接参与运算的数据
取到了数据,画图就方便了。在picturebox中设定坐标系,设定纵、横坐标比例。
用pset方法画点。看你原来的代码是画的线,用line方法画线也可以,起始坐标是前一个幅度,终止坐标是当前幅度。你代码中已经这样做了。
按字节取点,一个字节最多可表示纵轴上256个刻度之一,如果精度不够,下位机传两个字节或多个字节表示一点也可以。
在VB下画函数曲线会吧。

[ 本帖最后由 lianyicq 于 2015-4-24 09:49 编辑 ]

大开眼界
2015-04-23 19:53
wxe0510
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2015-4-21
收藏
得分:0 
以下是引用lianyicq在2015-4-23 19:53:46的发言:

如果下位机传来8
If MSComm1.InBufferCount > 0 Then
byte1 = MSComm1.Input
For i = 0 To UBound(byte1)
  inputdata = inputdata & Str(byte1(i)) & " "
  Text1.Text = Val(byte1(i))
Next i
Text2.Text = inputdata
DataFromCom = Text1
DataFromComLast = DataFromCom
TimeCount = TimeCount + 1
DrawRealLine pic, TimeCount, DataFromCom, DataFromComLast
按文本方式接受,byte1(0)为低八位,byte1(1)为高八位.
text1.text 经过i=0时为“8”,i=1时为“0”。
退出循环时当然为0。
即然文本数据能画图,按二进制接收的数据不能画?那是直接参与运算的数据
取到了数据,画图就方便了。在picturebox中设定坐标系,设定纵、横坐标比例。
用pset方法画点。看你原来的代码是画的线,用line方法画线也可以,起始坐标是前一个幅度,终止坐标是当前幅度。你代码中已经这样做了。
按字节取点,一个字节最多可表示纵轴上256个刻度之一,如果精度不够,下位机传两个字节或多个字节表示一点也可以。
在VB下画函数曲线会吧。

我已经将两个字节转换成了十进制数,但画线的时候出来的不是线,而是一个个点,这是怎么回事呢?PIC.LINE 明明是画线函数啊
2015-04-25 21:15
快速回复:串口通讯 绘制实时曲线
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013861 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved