小弟在使用Toledo 8142 仪表,发现从该仪表中读取出来的数据,在由Variant转化成String时变成了乱码,具体的原因我自己也简单的分析了一下,可能由于该仪表在数据的传输过程中在开始位后面包含了ABC三个字符,后面是7位的数据位,在使用StrConv函数将Variant 转化成String就变成了乱码,小弟虽然发现了这个原因,但是不知道如何解决该问题,希望各位大峡指点江山。仪表的传输格式:02H + ABC + 6位数据位+ 6位数据位 + 2位停止位 (一共18位)
COM1的设置:1200,n,8,2

解决方案 »

  1.   

    读取的时候就用Byte数组,否则那些不可见字符都会被变成问号
      

  2.   

    晕倒, TOLEDO 8142是汽车衡的表头, 直接用文本接收就好啦,干嘛还要再转??.InputMode = comInputModeText '使用这个文本方式接收.RThreshold = 12 '你先用12再用18我忘了,太久没用了, 我记得是16位, 你接收时算看看有几位,改变12的值直到一排排很整齐的数据出来.使用 MSComm1_OnComm() 事件接收到的数据再用Instr找 chr(2)的STX(启始符)位置开始算起几位, 再用trim涵数去掉前置零, 有必要的话也可以再加上instr找到ETX(终止符)的位置,我记得是chr(3),然后用mid涵数取出STX与ETX之间的字符.搞不定我再帮你写.
      

  3.   

    cbm666
    今天按照你说的方法做了,可是最终读出来得还是乱码。从仪表中接受到数据中查找Chr(2),返回值始终是零,无法进行字符串分析,现在一点法子也没有了。
    MSCOMM1中的代码如下:
            Case comEvReceive
                Dim Buffer As Variant
                Buffer = MSComm1.Input
                Dim nPos As Integer
                Dim strComText As String
                strComText = Buffer
                nPos = InStr(1, strComText, Chr(2))
                If nPos > 0 Then
                   Dim strTemp1 As String
                   strTemp1 = Mid(Buffer, nPos +2, 7)
                End Ifcbm666,你看问题出在什么地方呢?其他信息:仪表显示内容:03490
    Buffer内容:"崅?牋03?0?0000崅?牋03?0?0000崅?牋03?0?0000崅?牋03?0?0000崅?牋03?0?0000崅?牋03?0?0000崅?牋03?0?0000崅?牋03?0?0000崅?牋03?0?0000崅?牋03?0?0000崅?牋03?0?0000崅"小弟,先谢谢咯
      

  4.   

    给你的油箱,我给你发检测工具去,需要也可以给点别的
    我很少来这里[email protected] or QQ249496745
      

  5.   

    1200,n,8,2 ?? 不会这样吧 ?你试一下1200,n,8,1
    2400,n,8,1
    4800,n,8,1
    9600,n,8,1  
      

  6.   

    算你运气好, 昨晚三更半夜醒来突然想起我有8142的操作手册,找了近一个小时呵呵找到了,连中文的ASC码打印设置都找到了.我不知道你设置表头时在 F3串口流程设置时你做了什么动作,
    F3.1 波特率 300,1200,2400,4800,9600
    F3.2 数据位 X=7 X=8
    F3.3 校验位 X=0(None) X=1(Odd) X=2(Even)
    F3.4 校验和 X=0(不发送) X=1(发送)原厂设置 1200,E,7,1 
    出厂设置 9600,N,8,1 (比较懒时他们出货时没设)你用 1200,n,8,2 肯定是乱码,你这样设试看看, 除非你的设置已被你改掉了,否则应该可以With MSComm1
       .CommPort = 1
       .Settings = "1200,E,7,1"
       .InputLen = 0
       .InputMode = comInputModeText '使用这个文本方式接收 
       .RThreshold = 18 '第一位是chr(2) 2-4位是状态别管它,第5位开始到第10位共6位是重量,11-16是皮重(不管它),第17位是chr(13)第18位是CKS
       If Not .PortOpen Then .PortOpen = True
    End With在Private Static Sub MSComm1_OnComm()事件中If MSComm1.InBufferCount <> 0 Then
       rcvdata = MSComm1.Input
       List1.additem rcvdata '如还不行你把它截图出来给我看
    end if
      

  7.   

    cbm666
    谢谢你的提示,今天我在试试看咯,如果不可以,我就和你说~~~cbm666和wei001001,这俩都是十分热心的人,小弟先谢谢咯。小弟的邮件:[email protected]
      

  8.   

    cbm666 谢谢你的回答,问题已经解决。
    但是也提出一点小问题:
    If MSComm1.InBufferCount  <> 0 Then 
    end if
    这个判断条件在代码始终为零。我最后通过判断读取出来得字符长度来判断的。cbm666 再次对你的回答表示感谢。
      

  9.   

    呵呵, 那是被你搞昏了,自己边用我厂自己的表头测试写的代码.那两本操作手册如你需要的话把你的地址发邮件到我邮箱,我寄给你,复印完后再寄还我[email protected]