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



mscomm控件问题真的没人知道吗??


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


mscomm控件问题真的没人知道吗??[已结贴,结贴人:guxing110]
发表于:2007-03-15 10:57:38 楼主
'-----------------------------------------------------
'发送区
'-----------------------------------------------------
public   function   senddata(byref   bytdata()   as   byte)   as   long
on   error   resume   next

mscomm1.inbuffercount   =   0   '清空接收缓冲区
mscomm1.output   =   bytdata   '发送数据

do
doevents
loop   until   mscomm1.outbuffercount   =   0   '等待,直到数据发送完毕
mscomm1.outbuffercount   =   0
'-----------------------------------------------------
'接收区
'-----------------------------------------------------
private   sub   mscomm1_oncomm()
on   error   resume   next
        dim   bytreceived()   as   byte
        dim   strbuff   as   string
        dim   strdata   as   variant
        dim   i   as   integer
        dim   x   as   integer
        select   case   mscomm1.commevent
                        case   2
                                mscomm1.settings   =   "19200,m,8,2 "
                                mscomm1.inputlen   =   0
                                strbuff   =   mscomm1.input
                                bytreceived()   =   strbuff
                                for   i   =   0   to   ubound(bytreceived)
                                        if   len(hex(bytreceived(i)))   =   1   then
                                                strdata   =   0   &   hex(bytreceived(i))
                                        else
                                                strdata   =   hex(bytreceived(i))
                                        end   if
                                next
                                text1.text   =   text1.text
                              mscomm1.outbuffercount   =   0       '清空发送缓冲区
                              mscomm1.inbuffercount   =   0         '清空接收缓冲区
               
                               
        end   select
end   sub

'---------------------------------------
'发送数据
'---------------------------------------
private   sub   cmdconnect_click()

dim   bytdata1(0)   as   byte
dim   bytdata(21)   as   byte
dim   i   as   integer
        mscomm1.commport   =   1                                       'com端口
        mscomm1.settings   =   "19200,m,8,2 "
        mscomm1.inputmode   =   cominputmodebinary             '采用二进制传输
        mscomm1.inbuffercount   =   0       '清空接受缓冲区
        mscomm1.outbuffercount   =   0     '清空传输缓冲区
        mscomm1.sthreshold   =   1             '如果传输缓冲区完全空时产生mscomm事件
        mscomm1.rthreshold   =   1             '不产生mscomm事件
        mscomm1.portopen   =   true           '打开端口

bytdata1(0)   =   8
bytdata(20)   =   8
bytdata(21)   =   128
for   i   =   1   to   19
        bytdata(i)   =   0
next
mscomm1.settings   =   "19200,m,8,2 "                 '改变奇偶校验
call   senddata(bytdata1)                                   '发送
mscomm1.settings   =   "19200,s,8,2 "                 '改变奇偶校验
call   senddata(bytdata)                                     '发送
end   sub


当我改变mscomm1.settings   值后发送没问题,硬件收到信息。可是接收到的数据全部都是3f,我代码全部在这里。请问我的问题出的哪里?该如何解决。解决后100分。不给是小狗
发表于:2007-03-15 11:16:441楼 得分:0
已将你在另一处提问的代码修改,经vb6调试通过:

private   sub   form_load()
me.mscomm1.commport   =   2
me.mscomm1.portopen   =   true
me.mscomm1.rthreshold   =   1
end   sub

private   sub   mscomm1_oncomm()
on   error   resume   next
dim   bytesreceived()   as   byte
dim   buffer   as   string
dim   hdata   as   string
dim   i   as   integer
        'me.timer2.enabled   =   false
        mscomm1.settings   =   "19200,m,8,2 "                 '改变mscomm.settings值
        doevents
        select   case   mscomm1.commevent
                        case   comevreceive                               '接收十六进制数据。并以十六进制显示
                       
                                if   mscomm1.inbuffercount   <=   0   then
                                        me.timer2.enabled   =   true
                                        exit   sub
                                end   if
                                       
                                'mscomm1.inputlen   =   0
                                mscomm1.inputmode   =   cominputmodebinary     '设置当前以二进制数接收数据
                                buffer   =   mscomm1.input                                     '接收数据至字符串中
                                bytesreceived()   =   buffer                                 '将数据转入byte中
                       
                                for   i   =   0   to   ubound(bytesreceived)             '显示结果以十六进制显示
                                        if   len(hex(bytesreceived(i)))   =   1   then
                                                hdata   =   hdata   &   "0 "   &   hex(bytesreceived(i))
                                        else
                                                hdata   =   hdata   &   hex(bytesreceived(i))
                                        end   if
                                        text1.text   =   hdata               '最后将结果后入text1中
                                        mscomm1.outbuffercount   =   0             '清除发送缓冲区
                                        mscomm1.inbuffercount   =   0               '清除接收缓冲区
                                next
        end   select
        'me.timer2.enabled   =   true

end   sub

private   sub   timer1_timer()
on   error   resume   next
        'me.timer1.enabled   =   false
        dim   bytdata1(0)   as   byte
        dim   bytdata(21)   as   byte
        dim   i   as   integer
        bytdata1(0)   =   9
        bytdata(0)   =   3
        bytdata(20)   =   12
        bytdata(21)   =   136
        mscomm1.settings   =   "19200,m,8,2 "
        call   senddata(bytdata1)     '发送命令
        mscomm1.settings   =   "19200,s,8,2 "
        call   senddata(bytdata)
        'me.timer1.enabled   =   true
end   sub
public   function   senddata(byref   bytdata()   as   byte)   as   long
on   error   resume   next

mscomm1.inbuffercount   =   0   '清空接收缓冲区
mscomm1.output   =   bytdata   '发送数据

do
doevents
loop   until   mscomm1.outbuffercount   =   0   '等待,直到数据发送完毕
mscomm1.outbuffercount   =   0                     '清空发送缓冲区
end   function
'以下是我的自动接收.10/ms
private   sub   timer2_timer()
        'me.timer2.enabled   =   true
end   sub

发表于:2007-03-15 11:26:192楼 得分:0
更正,上述代码是另一网友的,你的代码在分析中,但他的问题与你相似。
发表于:2007-03-15 11:36:123楼 得分:0
你能告诉我。我的问题出在哪里吗?
我试过了问题没有解决。告诉我问题出的哪里好吗?
发表于:2007-03-15 11:55:344楼 得分:0
do
doevents
loop   until   mscomm1.outbuffercount   =   0   '等待,直到数据发送完毕
mscomm1.outbuffercount   =   0
这些代码不要,也没问题吧,
我以前也用过,用这个话,cup用的很多的
发表于:2007-03-15 12:09:015楼 得分:0
恩,没问题.我去掉了.问题还在.有人知道原因吗?
实在想不出.好心人帮帮忙吧
发表于:2007-03-15 12:12:196楼 得分:0
我调试时strbuff   =   mscomm1.input
到这里是我用监视看strbuff显示的是一个问题,我监视mscomm1.input中的值是63(这63是十进制的转十六进制后就是3f),而且我发送任何值出去返回来的都是3f.感到很奇怪.
发表于:2007-03-15 12:23:217楼 得分:0
option   explicit

'-----------------------------------------------------
'发送区
public   function   senddata(byref   bytdata()   as   byte)   as   long
        on   error   resume   next
        mscomm1.inbuffercount   =   0   '清空接收缓冲区
        mscomm1.output   =   bytdata   '发送数据
        do
                doevents
        loop   until   mscomm1.outbuffercount   =   0   '等待,直到数据发送完毕
        mscomm1.outbuffercount   =   0
end   function
'增加form_load事件,将cmdconnect_click事件中的部分代码移到form_load事件中,以避免串口多次打开错误
private   sub   form_load()
        mscomm1.commport   =   1                                       'com端口
        mscomm1.settings   =   "19200,m,8,2 "
        mscomm1.inputmode   =   cominputmodebinary             '采用二进制传输
        mscomm1.inbuffercount   =   0       '清空接受缓冲区
        mscomm1.outbuffercount   =   0     '清空传输缓冲区
        mscomm1.sthreshold   =   1             '如果传输缓冲区完全空时产生mscomm事件
        mscomm1.rthreshold   =   1             '不产生mscomm事件
        mscomm1.portopen   =   true           '打开端口
end   sub

'接收区
private   sub   mscomm1_oncomm()
on   error   resume   next
        dim   bytreceived()   as   byte
        dim   strbuff   as   string
        dim   strdata   as   string
        dim   i   as   integer
        dim   x   as   integer
        select   case   mscomm1.commevent
                case   2
                        mscomm1.settings   =   "19200,m,8,2 "
                        mscomm1.inputlen   =   0
                        strbuff   =   mscomm1.input
                        bytreceived()   =   strbuff
                        for   i   =   0   to   ubound(bytreceived)
                                if   len(hex(bytreceived(i)))   =   1   then
                                        strdata   =   strdata   &   "0 "   &   hex(bytreceived(i))   '此行修改
                                else
                                        strdata   =   strdata   &   hex(bytreceived(i))   '此行修改
                                end   if
                        next
                        text1.text   =   strdata   '此行修改,原text1.text   =   text1.text
                        mscomm1.outbuffercount   =   0       '清空发送缓冲区
                        mscomm1.inbuffercount   =   0         '清空接收缓冲区
        end   select
end   sub

'---------------------------------------
'发送数据
private   sub   cmdconnect_click()
        dim   bytdata1(0)   as   byte
        dim   bytdata(21)   as   byte
        dim   i   as   integer
        bytdata1(0)   =   8
        bytdata(20)   =   8
        bytdata(21)   =   128
        for   i   =   1   to   19
                bytdata(i)   =   0
        next
        mscomm1.settings   =   "19200,m,8,2 "                 '改变奇偶校验
        call   senddata(bytdata1)                                   '发送
        mscomm1.settings   =   "19200,s,8,2 "                 '改变奇偶校验
        call   senddata(bytdata)                                     '发送
end   sub
发表于:2007-03-15 12:59:598楼 得分:0
3f的出现应该是多次打开串口造成的。
建议你发送完第一次后用定时器延时,然后发第二个包。
发表于:2007-03-15 13:27:409楼 得分:0
不了解硬件方是怎么做的,但是单看软件部分,第二次改变校验时,并不能保证上一次的发送肯定已经结束,因为win是个多任务系统,基本上在doevents的时候,程序已经在执行下一句“mscomm1.settings   =   "19200,s,8,2 "”了。

public   function   senddata(byref   bytdata()   as   byte)   as   long
mscomm1.inbuffercount   =   0   '清空接收缓冲区
mscomm1.output   =   bytdata   '发送数据

do
doevents           ;**********
loop   until   mscomm1.outbuffercount   =   0   '等待,直到数据发送完毕
mscomm1.outbuffercount   =   0

;--------------------------------------------------------------

mscomm1.settings   =   "19200,m,8,2 "                 '改变奇偶校验
call   senddata(bytdata1)                                   '发送
mscomm1.settings   =   "19200,s,8,2 "                 '改变奇偶校验*******
call   senddata(bytdata)                                     '发送
发表于:2007-03-15 13:30:0410楼 得分:0
友情up
发表于:2007-03-15 13:34:3011楼 得分:0
改变校验应该mscomm的发送结束中断事件里改。在这里判断发送缓冲空是最及时和有效的。
发表于:2007-03-15 13:51:2312楼 得分:0
我觉得我的发送数据是没有问题的.因为我发送数据出去后我下面的机器提示我已经与他相连
我的硬件是这样设置的.一条记录一共有23组数据.第一组数据以19200,m,8,2发送.后面的22组以19200,s,8,2发送.发完一条数据后下面的硬件会返回来一个值以确定这条数据是否正确.现在的问题是我发给硬件这条数据硬件给出反映提示已连接上.返回来一个值.可是这个返回来的值都是3f.我感觉到很郁闷.我在想是否我的接收数据有问题?还是我的timer控件有问题?我timer控件设置的是1秒发一条数据.
发表于:2007-03-15 14:24:5013楼 得分:0
还有人在吗?帮帮我...
发表于:2007-03-15 15:02:0014楼 得分:0
http://community.csdn.net/expert/topic/5383/5383313.xml?temp=.1498224
请参阅上述网址下本人2007-3-8   18:20:24   及2007-3-8   18:21:34   的答复的代码,调试正常的简化串口调试精灵代码,用16进制编写命令于txtsend。运行它来观察返回的命令究竟是否符合要求。
发表于:2007-03-15 15:14:3615楼 得分:0
正常的话硬件分别返回什么?第一组以及第二至第二十三组?
看看zdingyun的代码应该是正确的.
发表于:2007-03-15 15:49:5816楼 得分:0
问题我已经知道出在哪里了。我是用mscomm控件接收数据的。是timer问题
用timer1发送数据,可是接收时我必须把奇偶改回19200,m,8,2
正如上面所说windows是多线程工作。当我在收数据时同时也在发数据,而发数据可能会改成19200,s,8,2所以就出现了所谓的3f现象。

现在我要控制的问题是当我在接收数据时timer1一定不能发数据。
可是这个时间我怎么就是控制不住。
有办法吗?
发表于:2007-03-15 16:35:4617楼 得分:0
用mscomm和硬件通讯需要注意时序匹配问题,发送不要用timer,在接收中断里发送,用timer做接收超时判断。19200bps下发送/接收一个字节(11位)约550微秒,看看几个字节,加点硬件处理时间,可以计算出timer的定时所需时长。
发表于:2007-03-15 16:41:3418楼 得分:0
那我想问问楼上的。
如果我要隔一段时间发送一条数据给硬件当前与它连接。
如果不用timer控件。用什么处理最合适???
发表于:2007-03-15 16:48:1219楼 得分:0
请核查返回数据的字节长度是否一致。如果是等长的话,可设置mscomm控件的属性rthreshold位固定值(等于返回数据字节长度),这样可保证在完成接收时mscomm的属性settings不至于发生变化。
timer控件的enabled   在   false   和   true   间交替改变。
此种用法需增加1timer控件,将其属性interval设置在30000左右,用于自动卸载通讯窗体模块。在其它的主窗体再用代码提及通讯窗体的任一控件属性来加载到内存。这样做的目的是避免接收出错而程序死,以保证通信正常。
发表于:2007-03-15 16:51:2820楼 得分:0
这需要把硬件方的串口工作方式列出来,因为到目前为止,问题仅限于用mscomm来适应硬件串口的时序和工作方式。说实话,如果不是硬件有地址识别功能的话,没事改串口参数是件比较困惑的事。
发表于:2007-03-15 16:55:1521楼 得分:0
private   sub   cmdconnect_click()

dim   bytdata1(0)   as   byte
dim   bytdata(21)   as   byte
dim   i   as   integer
bytdata1(0)   =   8
bytdata(20)   =   8
bytdata(21)   =   128

mscomm1.settings   =   "19200,m,8,2 "
call   senddata(bytdata1)     '发送命令
mscomm1.settings   =   "19200,s,8,2 "
call   senddata(bytdata)

end   sub
'********


private   sub   mscomm1_oncomm()
on   error   resume   next
        dim   bytreceived()   as   byte
        dim   strbuff   as   string
        dim   strdata   as   variant
        dim   i   as   integer

        select   case   mscomm1.commevent
                        case   2
                             
                                mscomm1.settings   =   "19200,m,8,2 "

                                mscomm1.inputlen   =   0         '读取缓冲区中所有字符
                                strbuff   =   mscomm1.input
                                bytreceived()   =   strbuff
                                for   i   =   0   to   ubound(bytreceived)
                                        if   len(hex(bytreceived(i)))   =   1   then
                                                strdata   =   0   &   hex(bytreceived(i))
                                        else
                                                strdata   =   hex(bytreceived(i))
                                        end   if
                                next
                                text1.text   =   text1.text   &   "   "   &   strdata   &   vbcrlf
                               
                                mscomm1.outbuffercount   =   0       '清空发送缓冲区
                                mscomm1.inbuffercount   =   0         '清空接收缓冲区
               
                               
        end   select
       
end   sub

我没有用timer控件控制为什么结果还是3f呢?真的把我急死了
请会的朋友帮帮我。一个人开发不容易啊。而且我刚刚上岗不久。先谢谢了。解决了一定给分
发表于:2007-03-15 16:58:0422楼 得分:0
我从硬件返回来的数据是十六进制的二位数“0f”成功“f0”失败。帮我写段代码好吗?
发表于:2007-03-15 16:58:2723楼 得分:0
另外,如果发送总是用同一种校验,接收总是用另一种校验,那么只需要设置settings为发送时的校验,而接收时只取数据,忽略其中的校验错信息。mscomm不会因为校验错而改变接收的有效的8位数的。
发表于:2007-03-15 17:19:3424楼 得分:0
你不提供软件与硬件方的握手方式,协议长度,串口工作及变化方式和硬件时序要求,很难给出确切的解决办法。
发表于:2007-03-15 17:26:4725楼 得分:0
我使用的串口只使用了三根线。一根接收线。一根发送线。一根地线。
没有使用握手协议
我发送一条数据给硬件是一个数组。这数组中有23个元素。
第一个元素以19200,m,8,2发送以后的22个元素以19200,s,8,2发送。发送完之后硬件会在10豪秒之内传回一个值。传回来的值以19200,m,8,2接收。这个值是一个十六进制数。别的就没有了。

能给我写段代码吗?非常感谢。我是一对一的通信(就是计算机串口直接对一台设备设置)。速度应该很快。
发表于:2007-03-15 19:19:4126楼 得分:0
private   sub   mscomm1_oncomm()
on   error   resume   next
        dim   bytreceived()   as   byte
        dim   strbuff   as   string
        dim   strdata   as   string
        dim   i   as   integer
        dim   x   as   integer
        select   case   mscomm1.commevent
                case   2
                        mscomm1.settings   =   "19200,m,8,2 "
                        mscomm1.inputlen   =   0
                        strbuff   =   mscomm1.input
                        bytreceived()   =   strbuff
                        for   i   =   0   to   ubound(bytreceived)
                                if   len(hex(bytreceived(i)))   =   1   then
                                        strdata   =     "0 "   &   hex(bytreceived(i))   '此行修改
                                else
                                        strdata   =     hex(bytreceived(i))   '此行修改
                                end   if
                        next
                        '增加判别代码
                        if   strdata   =   "0f "   or   strdata   =   "f0 "   then
                                text1.text   =   text1.text   &   "   "   &   strdata   &   vbcrlf
                                mscomm1.outbuffercount   =   0       '清空发送缓冲区
                                mscomm1.inbuffercount   =   0   '清空接收缓冲区
                        else
                        end   if
        end   select
end   sub
发表于:2007-03-16 08:19:2927楼 得分:0
谢谢楼上的回复.可是问题还是没解决.还是3f
能帮我写段源码测试一下吗?

解决之后500分.决不食言.骗人是小狗
发表于:2007-03-16 08:52:3728楼 得分:0
up   期待中
发表于:2007-03-16 09:00:4829楼 得分:100
中途改变   settings   之前,关闭   mscomm   控件,然后再打开。这样会比较慢,如果要求速度,可以用   api   来做。

'-----------------------------------------------------
'发送区
'-----------------------------------------------------
public   function   senddata(byref   bytdata()   as   byte)   as   long
on   error   goto   errhandler

mscomm1.output   =   bytdata   '发送数据

do
doevents
loop   until   mscomm1.outbuffercount   =   0   '等待,直到数据发送完毕
senddata   =   0
exit   function

errhandler:
senddata   =   err.number
end   function

'-----------------------------------------------------
'接收区
'-----------------------------------------------------
private   sub   mscomm1_oncomm()
on   error   resume   next
        dim   bytreceived()   as   byte
        dim   strbuff   as   variant
        dim   i   as   integer
        select   case   mscomm1.commevent
                        case   2
                                mscomm1.inputlen   =   0
                                strbuff   =   mscomm1.input             '必须用   variant   变量接收二进制值
                                                                                          '否则中文系统将其改为“?”=   chr(&h3f)
                                bytreceived()   =   strbuff
                                for   i   =   0   to   ubound(bytreceived)
                                        text1.text   =   text1.text   &   "   "   right( "0 "   &   hex(bytreceived(i),2)  
                                next
        end   select
end   sub

'---------------------------------------
'发送数据
'---------------------------------------
private   sub   cmdconnect_click()

dim   bytdata1(0)   as   byte
dim   bytdata(21)   as   byte
dim   i   as   integer
        mscomm1.commport   =   1                                       'com端口
        mscomm1.settings   =   "19200,m,8,2 "
        mscomm1.inputmode   =   cominputmodebinary             '采用二进制传输
        mscomm1.inbuffercount   =   0       '清空接受缓冲区
        mscomm1.outbuffercount   =   0     '清空传输缓冲区
        mscomm1.sthreshold   =   1             '如果传输缓冲区完全空时产生mscomm事件
        mscomm1.rthreshold   =   1             '不产生mscomm事件

bytdata1(0)   =   8
bytdata(20)   =   8
bytdata(21)   =   128
for   i   =   1   to   19
        bytdata(i)   =   0
next

mscomm1.settings   =   "19200,m,8,2 "                 '改变奇偶校验
mscomm1.portopen   =   true           '打开端口
call   senddata(bytdata1)                                   '发送
mscomm1.portopen   =   false           '关闭端口
mscomm1.settings   =   "19200,s,8,2 "                 '改变奇偶校验
mscomm1.portopen   =   true           '打开端口
call   senddata(bytdata)                                     '发送
mscomm1.portopen   =   false           '关闭端口
mscomm1.settings   =   "19200,m,8,2 "                 '改变奇偶校验
mscomm1.portopen   =   true           '打开端口
end   sub

发表于:2007-03-16 09:06:2830楼 得分:0
text1.text   =   text1.text   &   "   "   right( "0 "   &   hex(bytreceived(i)),2)
发表于:2007-03-16 09:18:1031楼 得分:0
哈哈...楼上的真是好心人啊.
真的是要好好谢谢你.
答应你500分的.
我上小号刷给你.哈哈


快速检索

最新资讯
热门点击