首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

串口程序代码怎么写

2012-12-15 
串口程序代码如何写?想把电子称和电脑连接起来,电脑每隔几个毫秒记录数据,数据要求是十进制,并保存在TXT文

串口程序代码如何写?
想把电子称和电脑连接起来,电脑每隔几个毫秒记录数据,数据要求是十进制,并保存在TXT文本中,期望能绘出质量-时间曲线。现在已经连接好了,但是我没有学过VB,自己找了好多例子研究了好久,还是有很多问题不懂,按例子改写后实验,还是不行,可能我对这个串口通信不理解,改写后也总是有问题。下边是我的电子称说明书,不知有没有VB高手根据我的实际情况帮我编写符合要求能在电脑上保存数据的代码,非常感谢!

一、利用立即打印符来接收数据
 当天平与计算机相连时,建议使用立即打印符“#”进行数据输出,当响应此命令后,天平立即把其显示的所有数字或者信息以字符串的形式输出出来。 
其输出格式如下: 
  +/- 1 2 3 4 5 6. C0  C1 C2 C3 CR LF 
前六个数字区,数字前通常还有符号(+或-),小数点也被传输。数字少于六位时由空格来补充(如有其它信息传输,则位于数字区) 
  注:小数点的位置取决于天平显示的分辨率及单位,第一个数字紧接在符号之后。 
C0:空格 
C1:如果天平被设置为“自动”响应模式,它亦为一个空格。 
    如果天平响应模式为“快速”,C1=F 
  如果天平响应模式为“慢速”,C1=S 
C2: 表示所传输的数字的单位,如称重单位为克,则传送g 
C3:代表稳定性,其功能与天平显示的“OK”功能相同,空格表示所传数字不稳定,“S”表示所传数字稳定。立即打印输出时,C3后边还跟有一个回车和一个换行符,如果天平已设置了其它换行数,它们和回车符一起传送。

二、RS232接口硬件
虽然BL系列电子天平可与任何具有RS232接口的设备相连,但其接口并未采用RS232的所有通讯协议,它仅使用了标准接口的数据传输和接收线,但在许多应用中一般不会带来任何接口问题。 
数据格式: 
        1 起始位 
        8 数据位(包括校验) 
        1 停止位 
注:BL天平将以选定的检验形式传输数据,但它并不对收到的校验进行检验,请用RS232电缆将BL天平与外部设备相连或者按下面的说明来连线。 

        1  2  3  4  5                  PIN    功能 
      o  o  o  o  o                    2    TXD-天平数据发送线 
        o  o  o  o                      3    RXD-天平数据接收线 
        6  7  8  9                      5    GND-地 


此外,对于需要握手信号的计算机,为了能与BL系列天平进行通信,应将计算机RS232接口上的DTR、DSR和CTS与RTS分别短接在一起。 

建议使用电缆长度不超过15m,如电缆电容《2,500PF,电缆还可适当长一些。所接负载的阻抗应介于。。。 

[最优解释]

引用:
LZ可以设置TIME定时去读就可以了.

正确!但做不到每隔几个毫秒读数据.
Option Explicit
    Dim strss As String

Private Sub Command1_Click()        '发送
    Dim strSend As String
    strSend = "#"
    MSComm1.Output = strSend
End Sub

Private Sub Form_Load()
    MSComm1.CommPort = 1            '串口号,
    MSComm1.Settings = "2400,n,8,1 "  '串口的属性
    MSComm1.InputLen = 0
    MSComm1.InputMode = comInputModeText
    MSComm1.RThreshold = 1
    MSComm1.PortOpen = True
    Timer1.Interval = 100
    Timer1.Enabled = True
End Sub

Private Sub MSComm1_OnComm()
    Select Case MSComm1.CommEvent
        Case comEvReceive


            strss = strss & MSComm1.Input
            If Right(strss, 2) = vbCrLf Then
                Label1.Caption = strss
                Open App.Path & "\DATA.txt" For Append As #1
                    Print #1, strss
                Close
                strss = ""
            End If
        End Select
End Sub

Private Sub Command2_Click() '停止接收
    If MSComm1.PortOpen = True Then
        MSComm1.PortOpen = False
    End If
End Sub

Private Sub Timer1_Timer()
    Command1_Click
End Sub


[其他解释]
这是LZ为同样的问题所开的第3贴.
[其他解释]
引用:
这是LZ为同样的问题所开的第3贴.

刚看到另一帖子你回复的代码。之前连接成功后,就去看其他相似的例子的VB代码,因为没有学过vb,在根据例子看语法理解什么意思,想试着编一编自己的,(不过问题重重,没有成功),没有及时查看自己发的帖子,不好意思!
我刚刚看到后就试了,很好,哎,自己弄好久,还不如及时看帖子,非常感谢!虽然一次只能显示一个数据,并且要手动点击,跟要求还有点距离
[其他解释]
LZ可以设置TIME定时去读就可以了.
[其他解释]
友情帮顶了!
[其他解释]
我运行了下,有两个问题想问下:
data文件中出现  +0.00  GS

    +0.00  GS

   +69.17  G 

   +69.16  GS

   +69.17  GS
也就是说首次出现69.17这个数 它后边只有G,按道理应该还是GS吧,虽然对数据没有影响,这是为什么?还有,数据之间空的距离较大?不是应该紧密排列吗?我运行时把时间间隔为5000ms
第二,当点击command2时,程序出现错误:实时错误“8018”,只有当端口打开时,操作有效。然后点击调试,程序语句MSComm1.Output = strSend被涂成黄色(不知怎样上传图片,所以就描述下)

[其他解释]
你的代码?
[其他解释]
引用:
我运行了下,有两个问题想问下:
data文件中出现? +0.00? GS

? ? +0.00? GS

? +69.17? G

? +69.16? GS

? +69.17? GS
也就是说首次出现69.17这个数 它后边只有G,按道理应该还是GS吧,虽然对数据没有影响,这是为什么?还有,数据之间空的距离较大?不是应该紧密排列吗?我运行时把时间间隔为5000ms
第二,当点击command2时,程序出现错误:实时错误“8018”,只有当端口打开时,操作有效。然后点击调试,程序语句MSComm1.Output = strSend被涂成黄色(不知怎样上传图片,所以就描述下)

见你自己提供的通信协议解释:
C3:代表稳定性,其功能与天平显示的“OK”功能相同,空格表示所传数字不稳定,,“S”表示所传数字稳定。立即打印输出时,C3后边还跟有一个回车和一个换行符,如果天平已设置了其它换行数,它们和回车符一起传送。
[其他解释]
引用:
你的代码?

不是 是你编写的代码
------其他解决方案--------------------


楼主看看这个:http://download.csdn.net/source/1262066
[其他解释]

引用:
引用:
你的代码?

不是 是你编写的代码

我现在的代码是由TIMER自询的,无须按COMMAND1按钮.
代码可修改为:
Option Explicit
    Dim strss As String

Private Sub Form_Load()
    MSComm1.CommPort = 1            '串口号,
    MSComm1.Settings = "2400,n,8,1 "  '串口的属性
    MSComm1.InputLen = 0
    MSComm1.InputMode = comInputModeText
    MSComm1.RThreshold = 1
    MSComm1.PortOpen = True
    Timer1.Interval = 100
    Timer1.Enabled = True
End Sub

Private Sub MSComm1_OnComm()
    Select Case MSComm1.CommEvent
        Case comEvReceive
            strss = strss & MSComm1.Input
            If Right(strss, 2) = vbCrLf Then
                Label1.Caption = strss
                Open App.Path & "\DATA.txt" For Append As #1
                    Print #1, strss
                Close
                strss = ""
            End If
        End Select
End Sub

Private Sub Command2_Click() '停止接收
    If MSComm1.PortOpen = True Then
        MSComm1.PortOpen = False
    End If
End Sub

Private Sub Timer1_Timer() '连续发送
    Dim strSend As String
    strSend = "#"
    MSComm1.Output = strSend
End Sub

[其他解释]
引用:
引用:
引用:
你的代码?

不是 是你编写的代码

我现在的代码是由TIMER自询的,无须按COMMAND1按钮.
代码可修改为:
VB codeOptionExplicitDim strssAsStringPrivateSub Form_Load()
    MSComm1.CommPort=1'串口号,    MSComm1.Settings="2400,n,8,1"'串口的属性    MSComm1.InputLen=0
    MSComm1.InputMode= comInputModeText
    MSComm1.RThreshold=1
    MSComm1.PortOpen=True
    Timer1.Interval=100
    Timer1.Enabled=TrueEnd SubPrivateSub MSComm1_OnComm()SelectCase MSComm1.CommEventCase comEvReceive
            strss= strss& MSComm1.InputIfRight(strss,2)= vbCrLfThen


                Label1.Caption= strss
                Open App.Path&"\DATA.txt"For AppendAs #1
                    Print #1, strss
                Close
                strss=""EndIfEndSelectEnd SubPrivateSub Command2_Click()'停止接收If MSComm1.PortOpen=TrueThen
        MSComm1.PortOpen=FalseEndIfEnd SubPrivateSub Timer1_Timer()'连续发送Dim strSendAsString
    strSend="#"
    MSComm1.Output= strSendEnd Sub


点击command2时,程序出现错误:实时错误“8018”,只有当端口打开时,操作有效。然后点击调试,程序语句MSComm1.Output = strSend被涂成黄色
和上边那个代码是一样的
[其他解释]
引用:
引用:
点击command2时,程序出现错误:实时错误“8018”,只有当端口打开时,操作有效。然后点击调试,程序语句MSComm1.Output = strSend被涂成黄色
和上边那个代码是一样的


我的代码无Command2按钮!
[其他解释]
Private Sub Command2_Click() '停止接收
    If MSComm1.PortOpen = True Then
        MSComm1.PortOpen = False
    End If
End Sub
怎么没有?
[其他解释]
看化了,修改下代码:
Option Explicit
    Dim strss As String

Private Sub Form_Load()
    MSComm1.CommPort = 1            '串口号,
    MSComm1.Settings = "2400,n,8,1 "  '串口的属性
    MSComm1.InputLen = 0
    MSComm1.InputMode = comInputModeText
    MSComm1.RThreshold = 1
    MSComm1.PortOpen = True
    Timer1.Interval = 100
    Timer1.Enabled = True
End Sub

Private Sub MSComm1_OnComm()
    Select Case MSComm1.CommEvent
        Case comEvReceive
            strss = strss & MSComm1.Input
            If Right(strss, 2) = vbCrLf Then
                Label1.Caption = strss
                Open App.Path & "\DATA.txt" For Append As #1
                    Print #1, strss
                Close
                strss = ""
            End If
        End Select


End Sub

Private Sub Timer1_Timer() '连续发送
    Dim strSend As String
    strSend = "#"
    If MSComm1.PortOpen = True Then
        MSComm1.Output = strSend
    End If
End Sub


[其他解释]
好的 非常感谢 不过还是喜欢最开始的代码 点击一下 开始记录数据 再点击另一个 终止

[其他解释]
引用:
那我的时间是不是这样 第一个数据出现在txt文本中时,时间已经过了5000ms?是否?

第一个数据出现在txt文本中时,离程序开始运行最短为100MS
设置Timer1.Interval = 100,则每100MS采集1次秤数据.
[其他解释]
那我的时间是不是这样 第一个数据出现在txt文本中时,时间已经过了5000ms?是否?
[其他解释]
看看我之前给人家回复的,问题一样:
LZ提醒你下 最好别用USB转串口的通信方式 最好是直接电路上的9针对台式机后的9针(其实只要3针就可以,2-2,3-3,5-5) 
为什么呢?因为转下,如果数据发送接收过快,容易丢失,以致你的VB程序死掉,都是有可能的,吾的亲身体会! 
至于怎么发送,给你个例子(这是发送AA AA FF 06 31 0 0 0 FF, 
格式: 
标志字节(帧首)  +  命令字节 + 数据参数字节    +    帧尾字节 
        2字节        2字节        4字节            1字节 

Private Sub Form_Load()
    MSComm1.CommPort = port
    MSComm1.Settings = setting
End Sub
Private Sub Command1_Click()
          Dim lngP As long
          Dim buff_out10() As Byte
          ReDim buff_out10(8)
          MSComm1.Settings = "9600,N,8,1"   ' 9600 波特,无奇偶校验,8 位数据,一个停止位。
          MSComm1.InputLen = 0
          If MSComm1.PortOpen = False Then
             MSComm1.PortOpen = True
          End If
          buff_out10(0) = &HAA
          buff_out10(1) = &HAA
          buff_out10(2) = &HFF
          buff_out10(3) = &H6
          buff_out10(4) = &H31
          buff_out10(5) = &H0
          buff_out10(6) = &H0
          buff_out10(7) = &H0
          buff_out10(8) = &HFF
          MSComm1.Output = buff_out10
          lngP = GetTickCount    'API函数


          Do
                 DoEvents
          Loop Until GetTickCount - lngP > 100 Or MSComm1.InBufferCount > 10 '当等待时间超过100毫秒或串口接受缓冲区的数据达到10个字节时退出等待循环,这就是一个通信等待的过程。
          DoEvents
End Sub


[其他解释]
好的 明白了
[其他解释]
 保存到TXT文本中是这样的
  +0.00  GS 

  +69.17  G 

  +69.16  GS 

  +69.17  GS 
处理数据的时候很不方便,能不能把GS不要保存到文本中
而且把换行符去掉,只回车换行就可以了
不然空一行处理数据还得一个一个去掉 实在是太麻烦了

[其他解释]
引用:
看看我之前给人家回复的,问题一样:
LZ提醒你下 最好别用USB转串口的通信方式 最好是直接电路上的9针对台式机后的9针(其实只要3针就可以,2-2,3-3,5-5)
为什么呢?因为转下,如果数据发送接收过快,容易丢失,以致你的VB程序死掉,都是有可能的,吾的亲身体会!
至于怎么发送,给你个例子(这是发送AA AA FF 06 31 0 0 0 FF,
格式:
标志字节(帧首)? +? 命令字节 + 数据参数字节? ? +? ? 帧尾字节
? ? ? ? 2字节? ? ? ? 2字节? ? ? ? 4字节? ? ? ? ? ? 1字节

VB codePrivateSub Form_Load()
    MSComm1.CommPort= port
    MSComm1.Settings= settingEnd SubPrivateSub Command1_Click()Dim lngPAslongDim buff_out10()AsByteReDim buff_out10(8)
          MSComm1.Settings="9600,N,8,1"' 9600 波特,无奇偶校验,8 位数据,一个停止位。          MSComm1.InputLen=0If MSComm1.PortOpen=FalseThen
             MSComm1.PortOpen=TrueEndIf
          buff_out10(0)=&HAA
          buff_out10(1)=&HAA
          buff_out10(2)=&HFF
          buff_out10(3)=&H6
          buff_out10(4)=&H31
          buff_out10(5)=&H0
          buff_out10(6)=&H0
          buff_out10(7)=&H0
          buff_out10(8)=&HFF
          MSComm1.Output= buff_out10
          lngP= GetTickCount'API函数Do
                 DoEventsLoop Until GetTickCount- lngP>100Or MSComm1.InBufferCount>10'当等待时间超过100毫秒或串口接受缓冲区的数据达到10个字节时退出等待循环,这就是一个通信等待的过程。          DoEventsEnd Sub

附议
[其他解释]
LZ:自己应该动点脑筋,对代码作修改去除回车换行,改变Mid(strss, 1, Len(strss) - 2)中的数字2,可往前取数据,从而去除数据后不要的部分:
Private Sub MSComm1_OnComm()
    Select Case MSComm1.CommEvent
        Case comEvReceive


            strss = strss & MSComm1.Input
            If Right(strss, 2) = vbCrLf Then
                Label1.Caption = strss
                Open "D:\DATA.txt" For Append As #1
                    Print #1, Mid(strss, 1, Len(strss) - 2) '去除回车换行
                Close
                strss = ""
            End If
        End Select
End Sub


[其他解释]
路过,帮顶.
[其他解释]
呵呵 我理解Vb语言还可以 一步一步搜该语句什么意思
自己编就有点难度了
多谢楼上的
[其他解释]
Private Sub MSComm1_OnComm()
    Select Case MSComm1.CommEvent
        Case comEvReceive
            strss = strss & MSComm1.Input
            If Right(strss, 2) = vbCrLf Then
                Label1.Caption = strss
                Open "D:\DATA.txt" For Append As #1
                    Print #1, Mid(strss, 1, Len(strss) - 6) '去除回车换行
                  Close
                strss = ""
            End If
        End Select
End Sub

[其他解释]
可以到威客上发帖求助。
[其他解释]
如何了 lz
[其他解释]
帮楼主顶上去!
[其他解释]
该回复于2010-03-12 11:39:31被版主删除
[其他解释]
也是串口通信问题
[其他解释]
俺博客里有相关文章,资源里有相关手册,找一下吧。

热点排行