您的位置:程序门 -> vb -> 基础类



急!串口编程问题,在线等~~~


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


急!串口编程问题,在线等~~~[已结贴,结贴人:ycyiduli]
发表于:2007-08-22 20:15:54 楼主
需要从4个串口读数据,两台电子秤,两个条码枪,电子称是不停的在发字符串,里面含有一段采集来的重量值,重量数字的前后都有字母。条码枪是采集到条码信号就发送条码字符串。我用了4个timer控件来不停的扫描input区,等到inbuffercount大于12就读出input区的内容,用的是if来判断inbuffercount的情况,条件不满足就跳出sub过程。读出的电子称数据用mid语句挖出其中的重量值后将其赋给label显示出来。但实际中出现的情况mid挖出的值有时候含有字母,导致重量值显示不全,条码值有时候也显示不全。请问各位高手献出高招~~~谢谢先~~~
请先告诉我我这思路有问题吗?
菜鸟在线等~~~~~~

谢谢
发表于:2007-08-22 20:38:221楼 得分:0
关注!
发表于:2007-08-22 20:39:422楼 得分:0
谢谢关注
发表于:2007-08-23 09:01:133楼 得分:0
自己顶
发表于:2007-08-23 09:44:014楼 得分:0
为什么不用事件驱动方式?
发表于:2007-08-23 09:59:545楼 得分:0
帮顶
发表于:2007-08-23 10:20:356楼 得分:0
要是有串行中断就好了
发表于:2007-08-23 12:33:127楼 得分:0
可以这样,将传送的数据发送到文本框,然后在文本框中进行判断,数字长度大于12就开始读数据,每次读12个长度数据。
发表于:2007-08-23 13:11:238楼 得分:0
楼上的,我现在是等缓冲区数据的长度大于12就读数据,用mid函数挖出我要的数据。但由于缓冲取的数据不只一次发送的数据,造成mid函数挖出数据不对。
发表于:2007-08-23 16:18:029楼 得分:0
事件驱动不行吗?我觉得用time扫描的方式不好,如果波特率高,12个字符很快的,time不一定来到及。
发表于:2007-08-23 17:26:1310楼 得分:0
是mscomm1_oncomm()事件,rthreshold设为12,收到12个字符后mscomm1_oncomm()发生,如果是comevreceive,即可处理数据。
我给你一些地址,csdn的,你看看是否对你有帮助。
http://community.csdn.net/expert/topic/5611/5611214.xml?temp=.6590998
http://community.csdn.net/expert/topic/5655/5655991.xml?temp=.1419947
http://community.csdn.net/expert/topic/5682/5682611.xml?temp=8.358401e-02
还有很多,你可以看一下。
发表于:2007-08-23 17:47:5011楼 得分:0
其实,主要是接收过来的数据你怎么拼成一个合格的数据,这个数据中含有你需要的数据,还有要注意你每次收到的长度都是12个,看你要用什么方式显示,显示方式很重要,看看是ascii码,还是二进制,显示对了很容易就出来了,显示选的不对,累死你
发表于:2007-08-23 17:49:2412楼 得分:25
今天没空了,看看明天有没空关注,
发表于:2007-08-23 19:42:4913楼 得分:0
从你贴子叙述,看不出你机器有几个串口?从4个串口读数据,这4串口是rs232口并联还是用rs485口分地址区别?
其次两台电子秤及两个条码枪与你接收代码间的通信协议.楼上有人提到使用事件驱动,我同意此观点.
使用mscomm控件的oncomm事件进行接收,接收时要依据通信协议来处理数据.不知两台电子秤及两个条码枪发送的数据字节长度都是12字节,如是的话,则应设置mscomm控件属性
rthreshold   =   12
接收ascii码或二进制数据,mscomm控件属性inputmode也不一样.数据处理方式也有差异.
发表于:2007-08-23 19:53:1614楼 得分:0
4个口相互没有联系,个东西用了4个串口
楼上真是好人啊
谢谢
发表于:2007-08-24 08:49:2015楼 得分:25
既然用了4个串口那么你应使用4个mscomm控件,分别使用mscomm的oncomm事件来进行接收数据。代码中不要使用msgbox语句,那会中断程序。4个mscomm的接收代码需分别按各自的通信协议作好接收算法。祝好运。
发表于:2007-08-24 09:57:5616楼 得分:0
我自己做过的一个串口数据接收
private   sub   mscomm1_oncomm()
      on   error   resume   next
      dim   bytdata   as   variant
      dim   errornum   as   integer
      doevents
      if   startscan   =   true   then
        with   mscomm1
            if   .inbuffercount   > =   21   then
              bytdata   =   .input
              .inbuffercount   =   0
              datastr   =   bytdata
              errornum   =   instr(1,   datastr,   "ffffff ")
                if   errornum   =   0   then
                    scanfinish   =   false
                      scanning   =   true
                    tempstr   =   trim(processstr(datastr))
                    comcount   =   comcount   +   1
                    if   comcount   > =   6000   then
                        startscan   =   false
                        scanfinish   =   true
                        comcount   =   0
                    end   if
                    m_data   =   mid(tempstr,   4,   8)
                    n_data   =   mid(tempstr,   13,   8)
                    if   comcount   > =   2   then
                        '收集数据  
                    end   if
                else
                    if   scanning   =   true   then   scanedcount   =   scanedcount   +   1
                    if   scanedcount   >   20   then
                        scanfinish   =   true
                    end   if
                end   if
            end   if
        end   with
      else
          with   mscomm1
          if   .inbuffercount   > =   21   then
              bytdata   =   .input
              .inbuffercount   =   0
              datastr   =   bytdata   'replace(trim(bytdata),   chr(13),   "s ",   1)
              errornum   =   instr(1,   datastr,   "ffffff ")
                if   errornum   =   0   then
                    comcount   =   comcount   +   1
                    if   comcount   >   6000   then   comcount   =   0
                    tempstr   =   trim(processstr(datastr))
                    m_data   =   mid(tempstr,   4,   8)
                    n_data   =   mid(tempstr,   13,   8)
                end   if
            end   if
          end   with
      end   if
end   sub
发表于:2007-08-27 21:32:5317楼 得分:0
谢谢各位
问题已经解决的差不多了


快速检索

最新资讯
热门点击