您的位置:程序门 -> vb -> 控件



请vb高手指教mscomm控件接收数据问题?


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


请vb高手指教mscomm控件接收数据问题?[无满意答案结贴]
发表于:2008-02-19 14:53:04 楼主
        本人是vb的初学人员,现有以下问题需要各位师傅指点,用vb   写代码对人机介面通信,现在对人机介面发送信息(内容)时人机介面可以接收到,但没有返回数据,如果用串口调试软件发相同的信息(内容),转为十六进制数(103a410d),在串口调试软件中“接收”框中能显示返回数据(103a410d1a)。不知程序错在哪,附程序:(若错了请指正确附代码)

private   sub   form_load()
    mscomm1.commport   =   1                                                                                       'com端口
    mscomm1.settings   =   "9600,n,8,1   "
    mscomm1.portopen   =   true
    mscomm1.inputmode   =   cominputmodetext
end   sub
-----------------------------------------------------
private   sub   cmdsenddata_click()
      pr   ("a")
end   sub

option   explicit


public   function   pr(pf$)
      dim   i   as   integer
      dim   s   as   integer
      dim   dblendtime   as   double
      dim   lok   as   integer
      select   case   left(pf$,   1)
                case   "a"
                        lok   =   4
                case   "b"
                        lok   =   10
                case   else
        end   select
   
    if   lok   =   4   then
        form1.list1.additem   "握手..."
       
        for   s   =   0   to   20
            if   form1.mscomm1.ctsholding   =   true   and   form1.mscomm1.inbuffercount   =   0   then   form1.list1.additem   "未响应!"
            dblendtime   =   timer   +   1
            form1.mscomm1.output   =   chr$(16)   +   chr$(58)   +   pr   +   chr$(13)
           
            do   while   dblendtime   >   timer
            doevents
            loop
           
            form1.text1.text   =   form1.mscomm1.input
            if   form1.mscomm1.ctsholding   =   true   and   form1.mscomm1.inbuffercount   >   0   then
            form1.list1.additem   "成功"
            exit   for
            end   if
            form1.list1.additem   "重新握手..."
       
        if   s   > =   20   and   form1.mscomm1.inbuffercount   =   0   then
          form1.list1.additem   "通信失败"
           
            exit   function
           
          end   if
        if   s   > =   20   and   form1.mscomm1.ctsholding   =   false   then
        form1.list1.additem   "失败"
        exit   function
 
        end   if
        next   s
        '----------------------
        else
        form1.mscomm1.output   =   chr$(16)   +   chr$(58)   +   pr   +   chr$(13)
        end   if
             
          do
        for   i   =   0   to   20000
          if   form1.mscomm1.inbuffercount   > =   lok   then
       
        exit   do
        end   if
      next
      if   msgbox("通信线路故障!",   53,   "通信异常")   =   2   then   end
    loop
  form1.text1.text   =   form1.mscomm1.input
end   function

发表于:2008-02-19 15:20:271楼 得分:0
我作通讯的时候从来没有考虑握手,唉,学习学习
发表于:2008-02-19 15:23:402楼 得分:0
lz:
本人是vb的初学人员,现有以下问题需要各位师傅指点,用vb       写代码对人机介面通信,现在对人机介面发送信息(内容)时人机介面可以接收到,但没有返回数据,如果用串口调试软件发相同的信息(内容),转为十六进制数(103a410d),在串口调试软件中“接收”框中能显示返回数据(103a410d1a)。不知程序错在哪,附程序:(若错了请指正确附代码)

你附的代码是人机界面的代码?
执行cmdsenddata_click
vbscript code
form1.mscomm1.output = chr$(16) + chr$(58) + pr + chr$(13)

发出命令16进制为
103a0d
而非
103a410d
如果有数据进入可接收(按ascii码文本)
发表于:2008-02-19 15:40:213楼 得分:0
不好意思,应该发出命令16进制为103a0d而非103a410d,但是总接收不到数据.  

 

发表于:2008-02-19 15:41:504楼 得分:0
不好意思,应该发出命令16进制为103a0d而非103a410d,但是总接收不到数据.  

 

发表于:2008-02-19 15:44:405楼 得分:0
lz:
你附的代码是人机界面的代码?
你代码可接收数据。
发表于:2008-02-19 15:49:176楼 得分:0
一般发送与接收不会像你那样写代码,可参阅下列网址本人的答贴:
发表于:2008-02-19 16:39:477楼 得分:0
t0:zdingyun
      你好!
        我看过你的答贴,让我有要个想法:是不是发送与接收的数据都是二进制数才行,但我不知发送与接收的数据都是二进制数的代码如何写。
       
发表于:2008-02-19 16:54:038楼 得分:0
按你的问题,发送chr$(16)   +   chr$(58)   +   pr   +   chr$(13),其中chr$(16)和chr$(13)可发送,如果接收到chr$(16)和chr$(13)等不能显示的ascii字符,建议使用二进制方式发送,通常是将16进制字符串转为二进制的byte数据类型发送。
接收的ascii码值有> 128到255,同样建议按二进制方式接收。给你连接的代码就是按二进制方式接收的。我将我的代码修改如下:
vbscript code
option explicit dim sj() as byte dim strdata as string private sub command1_click() '发送数据 dim buffer as variant dim strsend as string dim i as integer redim sj(len(text1.text) / 2 - 1) for i = 0 to len(text1.text) - 1 step 2 sj(i / 2) = val("&h" & mid(text1.text, i + 1, 2)) next mscomm1.output = sj strdata = "" end sub private sub form_load() mscomm1.settings = "9600,n,8,1" mscomm1.rthreshold = 1 mscomm1.portopen = true text1 = "103a0d" end sub private sub mscomm1_oncomm() '通讯事件发生 dim indata as variant dim bytinput() as byte dim intinputlen as integer dim i as integer select case mscomm1.commevent case comevreceive '...有接受事件发生 '此处添加处理接收的代码 mscomm1.inputmode = cominputmodebinary '二进制接收 intinputlen = mscomm1.inbuffercount redim bytinput(intinputlen) bytinput = mscomm1.input 'jieshou for i = 0 to ubound(bytinput) if lenhex(bytinput(i))) = 1 then strdata = strdata & "0" & hex(bytinput(i)) else strdata = strdata & hex(bytinput(i)) end if next text2.text = strdata end select mscomm1.inbuffercount = 0 mscomm1.outbuffercount = 0 end sub

如需连续发送可通过timer计时器按固定时间间隔
call   command1_click事件
vbscript code
private sub command1_click() timer1.enabled = true end sub private sub form_load() mscomm1.settings = "9600,n,8,1" mscomm1.rthreshold = 1 mscomm1.portopen = true text1 = "103a0d" timer1.interval = 1000 ' timer1.enabled = false end sub private sub timer1_timer() call command1_click end sub


发表于:2008-02-20 19:08:349楼 得分:0
    来晚了,不好意思!
    我现在按zdingyun的方法去试,都不能接收到数据,但是用串口调试工具去发送这组数据,它能在串口调试工具中接收到数据,我检查过vb写的格式及速率都对,所以现在就不知道错在哪里。为什么我写的接收不到数据呢?有哪位能指明下?谢了!
发表于:2008-02-20 20:04:1710楼 得分:0
在窗体声明处写
vbscript code
private declare sub sleep lib "kernel32" alias "sleep" (byval dwmilliseconds as long)

在接收代码中适当延迟
vbscript code
sleep (10)
发表于:2008-02-20 20:19:1711楼 得分:0
vbscript code
option explicit private declare sub sleep lib "kernel32" (byval dwmilliseconds as long) dim sj() as byte dim strdata as string private sub command1_click() '发送数据 dim buffer as variant dim strsend as string dim i as integer redim sj(len(text1.text) / 2 - 1) for i = 0 to len(text1.text) - 1 step 2 sj(i / 2) = val("&h" & mid(text1.text, i + 1, 2)) next mscomm1.output = sj strdata = "" end sub private sub form_load() mscomm1.settings = "9600,n,8,1" mscomm1.rthreshold = 1 mscomm1.portopen = true text1 = "103a0d" end sub private sub mscomm1_oncomm() '通讯事件发生 dim indata as variant dim bytinput() as byte dim intinputlen as integer dim i as integer select case mscomm1.commevent case comevreceive '...有接受事件发生 '此处添加处理接收的代码 sleep (10) mscomm1.inputmode = cominputmodebinary '二进制接收 intinputlen = mscomm1.inbuffercount redim bytinput(intinputlen) bytinput = mscomm1.input 'jieshou for i = 0 to ubound(bytinput) if lenhex(bytinput(i))) = 1 then strdata = strdata & "0" & hex(bytinput(i)) else strdata = strdata & hex(bytinput(i)) end if next text2.text = strdata end select mscomm1.inbuffercount = 0 mscomm1.outbuffercount = 0 end sub
发表于:2008-02-21 12:44:4112楼 得分:0
首先感谢zdingyun   的支持!
      我现在改text1   =   "103e430d"
      按照zdingyun的方法试过,一直不能接收到数据。但是我用vb写的程式发送了text1   =   "103e430d"后关闭它。再打开串口调试软件中的”打开串口“,在接收区中能看到接收的数据。附图:

[img=c:\documents   and   settings\administrator\桌面\23.bmp]


这个程序是哪里出了问题?
发表于:2008-02-21 12:58:0213楼 得分:0
首先感谢zdingyun   的支持!
      我现在改text1   =   "103e430d"
      按照zdingyun的方法试过,一直不能接收到数据。但是我用vb写的程式发送了text1   =   "103e430d"后关闭它。再打开串口调试软件中的”打开串口“,在接收区中能看到接收的数据。附图:
  ][/img]


这个程序是哪里出了问题?
发表于:2008-02-21 15:17:4914楼 得分:0
to:   rcdrcd
你再打开串口调试软件中的”打开串口“,在接收区中能看到接收的数据。

1)接收的数据是?
图看不到。
2)发送的命令究竟是:
"103e430d"  
"103a410d"
"103a0d"  
是那一个?
从你的叙述看,你是pc的程式发命令,下位机接收到正确命令才返回数据。

发表于:2008-02-21 16:12:5515楼 得分:0
to:zdingyun  
      三个都可以,主要是以0d为结束的都可以。
      是pc的程式发命令,下位机接收到正确命令才返回数据。
      按你二进制接收例子试,琢语句查(发送后)不会产生oncomm事件。因此无接收数据。
      但用“串口调试软件”发这些数据在串口调试软件中能接收到数据。
      我用pc的程式发命令后关闭pc的程式,开启串口调试软件后一样在“串口调试软件”中的接收框有接收数据显示,好像   人机返回了数据,pc的程式就是接收不了。


      真的不明白。
发表于:2008-02-21 19:45:5016楼 得分:0
请说明你的pc机有几个串口?
我的代码是通过vb6调试,能发送命令串口调试精灵,接收来自串口调试精灵发送的数据.
发表于:2008-02-22 08:18:3817楼 得分:0
我的pc机有1个com口,是com1。其它的是usb口。我用ser232mon监视过没有数据返回。
发表于:2008-02-22 09:11:2818楼 得分:0
usb口
mscomm控件是否支持usb口?这问题的讨论超出现在的范围,存在难度。看看其它专家的意见。
你可以使用pci插槽的串口扩展卡来解决收发问题。
发表于:2008-02-22 11:33:5119楼 得分:0
to:zdingyun    
      我手提电脑是使用pci插槽的串口扩展卡来连线的.使用bbl   pcmcia   rs-232   card.就是接收不到数据.我可将测试的图发邮件给你.
发表于:2008-02-22 12:45:5620楼 得分:0
在设备管理器中能否见到com口?
发表于:2008-02-22 12:54:0021楼 得分:0

先不要把握手协议做进去,先简单的调试数据收发的情况,看看有没有问题。

不能先闷头写个几百行代码再去调试,那不是号的编程思路。


建议你,先做下简单的收发,然后再一步一步做复杂的逻辑。

可以自己把串口短接了来测试程序。
发表于:2008-02-22 13:00:3922楼 得分:0
    在设备管理器中能见到com口。连线都是一直连着人机的,只不过是用vb写的程序发数据后收不到数据,用串口发则可以。
发表于:2008-02-22 13:13:0323楼 得分:0
vb写的程序发数据是通过com口吗?
发表于:2008-02-22 13:52:2224楼 得分:0
是通过com口的。如果将vb写的程序(接收为二进制,按你提供的例子)发送数据后关闭,再开启后在接收框中有二个数据。但再按“发送”按钮后一样没有数据返回。
发表于:2008-02-22 14:11:2025楼 得分:0
这里com口即串口非usb口。
你用下列代码检测下你的com口号和是否有效。
vbscript code
option explicit dim a as integer private sub command1_click() on error goto uerror for a = 1 to 4 mscomm1.commport = a mscomm1.portopen = true if mscomm1.portopen = true then print "可用com号= "; a mscomm1.portopen = false else end if next exit sub uerror: if err.number = 8005 then print "占用com号= "; a elseif err.number = 8002 then print "出错com号= "; a end if resume next end sub
发表于:2008-02-22 14:41:5626楼 得分:0
    用过了,是com1有效。
发表于:2008-02-22 14:57:0927楼 得分:0
  多谢zdingyun几天来的支持,现本人已经知道问题在哪里。在此多谢各位!
发表于:2008-02-22 15:00:1528楼 得分:0
应该设置硬件握手协议。
发表于:2008-02-22 15:36:3129楼 得分:0
lz:
两串口连接线接法:
两串口间
2-3
3-2
5-5
接线
各自串口
4-6
7-8
短接
可回避握手


快速检索

最新资讯
热门点击