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



mscomm很奇怪的问题............200分..............可能只有高手才能解决..............200分...........


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


mscomm很奇怪的问题............200分..............可能只有高手才能解决..............200分...........[已结贴,结贴人:guxing110]
发表于:2007-03-16 17:37:38 楼主

http://community.csdn.net/expert/topic/5397/5397147.xml?temp=.4492609
上面那个问题解决后又出现了另一个奇怪的问题

                mscomm1.portopen   =   false
                mscomm1.settings   =   "19200,m,8,2 "         '更改settings值
                mscomm1.portopen   =   true
                call   senddata(bytdata1)                   '发送第一组数据
                mscomm1.portopen   =   false
                mscomm1.settings   =   "19200,s,8,2 "
                mscomm1.portopen   =   true
                call   senddata(bytdata2)                   '发送第二组数据
                mscomm1.portopen   =   false
                mscomm1.settings   =   "19200,m,8,2 "         '更改settings值
                mscomm1.portopen   =   true
'-------这是暂停500毫秒(0.5秒)用于解发接收事件---------
                delay   500
                if   text1.text   =   "0f "   then
                  msgbox   "接收成功 "
                endif

                mscomm1.portopen   =   false
                mscomm1.settings   =   "19200,m,8,2 "         '更改settings值
                mscomm1.portopen   =   true
                call   senddata(bytdata1)                   '发送第一组数据
                mscomm1.portopen   =   false
                mscomm1.settings   =   "19200,s,8,2 "
                mscomm1.portopen   =   true
                call   senddata(bytdata2)                   '发送第二组数据
                mscomm1.portopen   =   false
                mscomm1.settings   =   "19200,m,8,2 "         '更改settings值
                mscomm1.portopen   =   true
'-------这是暂停500毫秒(0.5秒)用于解发接收事件---------
                delay   500
                if   text1.text   =   "0f "   then
                  msgbox   "接收成功 "
                endif

                mscomm1.portopen   =   false
                mscomm1.settings   =   "19200,m,8,2 "         '更改settings值
                mscomm1.portopen   =   true
                call   senddata(bytdata1)                   '发送第一组数据
                mscomm1.portopen   =   false
                mscomm1.settings   =   "19200,s,8,2 "
                mscomm1.portopen   =   true
                call   senddata(bytdata2)                   '发送第二组数据
                mscomm1.portopen   =   false
                mscomm1.settings   =   "19200,m,8,2 "         '更改settings值
                mscomm1.portopen   =   true
'-------这是暂停500毫秒(0.5秒)用于解发接收事件---------
                delay   500
                if   text1.text   =   "0f "   then
                  msgbox   "接收成功 "
                endif

                mscomm1.portopen   =   false
                mscomm1.settings   =   "19200,m,8,2 "         '更改settings值
                mscomm1.portopen   =   true
                call   senddata(bytdata1)                   '发送第一组数据
                mscomm1.portopen   =   false
                mscomm1.settings   =   "19200,s,8,2 "
                mscomm1.portopen   =   true
                call   senddata(bytdata2)                   '发送第二组数据
                mscomm1.portopen   =   false
                mscomm1.settings   =   "19200,m,8,2 "         '更改settings值
                mscomm1.portopen   =   true
'-------这是暂停500毫秒(0.5秒)用于解发接收事件---------
                delay   500
                if   text1.text   =   "0f "   then
                  msgbox   "接收成功 "
                endif
由于程序需要。我连续向硬件发送5条数据。
这5条数据都会有返回值“0f”成功。“f0”失败。

代码和上面代码一样的。只是改变了一下bytdata1和bytdata2的值
一共五条记录。发了前四条记录没有问题。发最后一条的时候就没有返回值了。
感觉到很奇怪

我把最后一条发送语句的暂停移上了之后能收到结果。但结果是3f老问题又跟着来了。求高手解决。解决之后200分。决不食言。编人是小狗

                mscomm1.portopen   =   false
                mscomm1.settings   =   "19200,m,8,2 "         '更改settings值
                mscomm1.portopen   =   true
                call   senddata(bytdata1)                   '发送第一组数据
                mscomm1.portopen   =   false
                mscomm1.settings   =   "19200,s,8,2 "
                mscomm1.portopen   =   true
                call   senddata(bytdata2)                   '发送第二组数据
'-------这是暂停500毫秒(0.5秒)用于解发接收事件---------
                delay   500一                       '移上来
                mscomm1.portopen   =   false
                mscomm1.settings   =   "19200,m,8,2 "         '更改settings值
                mscomm1.portopen   =   true
'-------这是暂停500毫秒(0.5秒)用于解发接收事件---------
'                 delay   500     (先前暂停在这里。)
                if   text1.text   =   "0f "   then
                  msgbox   "接收成功 "
                endif
发表于:2007-03-16 20:49:351楼 得分:0
mscomm1.settings   在   portopen=true的情况下,   可以动态设置的,   不需要portopen=false。
发表于:2007-03-16 20:54:322楼 得分:20
试试这样行不行:

option   explicit

private   sub   form_load()
        mscomm1.commport   =   1
        mscomm1.inputmode   =   cominputmodebinary
        mscomm1.inputlen   =   0
        mscomm1.rthreshold   =   1
        mscomm1.sthreshold   =   1
        mscomm1.portopen   =   true
end   sub

private   sub   form_unload(cancel   as   integer)
        mscomm1.portopen   =   false
end   sub

public   function   senddata(byref   bytdata()   as   byte)   as   long
        on   error   resume   next
        mscomm1.output   =   bytdata
        if   err.number   =   0   then
                do
                        doevents
                loop   until   mscomm1.outbuffercount   =   0
        end   if
        senddata   =   err.number
        err.clear
        on   error   goto   0
end   function

private   sub   mscomm1_oncomm()
        dim   bytreceived   as   variant
        dim   i   as   integer
        on   error   resume   next
        select   case   mscomm1.commevent
        case   comevreceive
                bytreceived   =   mscomm1.input
                for   i   =   0   to   ubound(bytreceived)
                        text1.text   =   text1.text   &   right( "0 "   &   hex(bytreceived(i)),   2)
                next
        end   select
        on   error   goto   0
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
       
        text1.text   =   " "
        mscomm1.settings   =   "19200,m,8,2 "
        call   senddata(bytdata1)
        mscomm1.settings   =   "19200,s,8,2 "
        call   senddata(bytdata)
        mscomm1.settings   =   "19200,m,8,2 "
        delay   500
        if   text1.text   =   "0f "   then
                msgbox   "接收成功 "
        end   if

        text1.text   =   " "
        mscomm1.settings   =   "19200,m,8,2 "
        call   senddata(bytdata1)
        mscomm1.settings   =   "19200,s,8,2 "
        call   senddata(bytdata)
        mscomm1.settings   =   "19200,m,8,2 "
        delay   500
        if   text1.text   =   "0f "   then
                msgbox   "接收成功 "
        end   if

        text1.text   =   " "
        mscomm1.settings   =   "19200,m,8,2 "
        call   senddata(bytdata1)
        mscomm1.settings   =   "19200,s,8,2 "
        call   senddata(bytdata)
        mscomm1.settings   =   "19200,m,8,2 "
        delay   500
        if   text1.text   =   "0f "   then
                msgbox   "接收成功 "
        end   if

        text1.text   =   " "
        mscomm1.settings   =   "19200,m,8,2 "
        call   senddata(bytdata1)
        mscomm1.settings   =   "19200,s,8,2 "
        call   senddata(bytdata)
        mscomm1.settings   =   "19200,m,8,2 "
        delay   500
        if   text1.text   =   "0f "   then
                msgbox   "接收成功 "
        end   if

        text1.text   =   " "
        mscomm1.settings   =   "19200,m,8,2 "
        call   senddata(bytdata1)
        mscomm1.settings   =   "19200,s,8,2 "
        call   senddata(bytdata)
        mscomm1.settings   =   "19200,m,8,2 "
        delay   500
        if   text1.text   =   "0f "   then
                msgbox   "接收成功 "
        end   if
end   sub
发表于:2007-03-17 08:06:423楼 得分:0
多谢楼上的回复.
改变settings的值后一定要先关闭串口再打开串口才可以收到数据
你的方法试过了.不行

csdn高手上哪去了哦
发表于:2007-03-17 09:48:144楼 得分:0
有一点很是弄不明白,为何与这个程序通讯的上位机要采用两种不同的奇偶校验方式。
在实际施工中,很少看到有这样的设备。
发表于:2007-03-17 10:38:455楼 得分:0
公司用的就是这种校验方式
我也没有办法啊.刚刚入这个行.以前我都是做erp的.没搞过嵌入式

我对csdn感觉不是这样的人.应该来说有问题都能解决的.怎么没人呢?

是不是星期六都睡觉去了...郁闷哦...
发表于:2007-03-19 17:21:386楼 得分:0
用两种奇偶校验是为了减轻下位机的负荷,不过上位机程序写着够累
发表于:2007-03-19 17:41:067楼 得分:0
楼主的通讯过程应该是  
发送:   一次m   +   一次s
接收:   一次m   +   一次s
对不对?
m的数据是一字节的吗?
s的数据包有格式吗?
如果s的有格式的话,其实不必太在意这个m
出现这个3f是因为奇偶校验错误产生的,
如果是用usb-rs232线调试的话这个程序还会有很多头痛的地方
还有就是千万要确定下位机的通讯是否可靠,19200速度下的波形可能不好,降到9600试试,看看会不会有相同现象
发表于:2007-03-20 08:49:558楼 得分:0
mscomm1.portopen   =   false
                mscomm1.settings   =   "19200,m,8,2 "         '更改settings值
                mscomm1.portopen   =   true
                call   senddata(bytdata1)                   '发送第一组数据
                mscomm1.portopen   =   false
                mscomm1.settings   =   "19200,s,8,2 "
                mscomm1.portopen   =   true
                call   senddata(bytdata2)                   '发送第二组数据
                mscomm1.portopen   =   false
                mscomm1.settings   =   "19200,m,8,2 "         '更改settings值
                mscomm1.portopen   =   true
'-------这是暂停500毫秒(0.5秒)用于解发接收事件---------
                delay   500
                if   text1.text   =   "0f "   then
                  msgbox   "接收成功 "
                endif
其实我现在的问题是为什么要暂停500毫秒才能接收到数据呢?如果把delay   500去掉就接收不到数据了。

暂停500毫秒前几组数据都可以接收得到。就最后一组数据接收不到。发过去的数据硬件接收到了。就是收不到返回值。
如果我把delay   500放在下面这中间。能发到3f。就是阁下所说的奇偶校验错误.
我想请教原因
call   senddata(bytdata2)                   '发送第二组数据
delay   500                                
mscomm1.portopen   =   false
发表于:2007-03-20 09:05:299楼 得分:0
try:
private   sub   mscomm1_oncomm()
接收到上次发送的返回值后,改变mscomm1.settings,并发关第二个值.
end   sub
发表于:2007-03-20 09:26:2410楼 得分:0
由于你需要不断地切换   setting   并多次重发,最好不用事件触发方式来读串口,而改用轮询。

如果一定要采用事件方式可以这样:

public   blnrecept   as   boolean

dim   i   as   integer
dim   tt   as   date

 
for   i   =   1   to   5
                mscomm1.portopen   =   false
                mscomm1.settings   =   "19200,m,8,2 "         '更改settings值
                mscomm1.portopen   =   true
                call   senddata(bytdata1)                   '发送第一组数据
                mscomm1.portopen   =   false
                mscomm1.settings   =   "19200,s,8,2 "
                mscomm1.portopen   =   true
                call   senddata(bytdata2)                   '发送第二组数据
                mscomm1.portopen   =   false
                mscomm1.settings   =   "19200,m,8,2 "         '更改settings值
                mscomm1.portopen   =   true

                blnrecept   =   false
                tt   =   timer   +   0.5  
                do   until   blnrecept
                        doevents
                        if   timer   >   tt   then   exit   do
                loop
                if   not   blnrecept   then   msgbox   "timeout   ! "   :   exit   sub

                if   text1.text   =   "0f "   then   msgbox   "接收成功 "
next   i

在你的接收事件处理中,加上一句:
blnrecept   =   true

另外,用   timer   处理超时存在跨零点的问题,如果你的系统在午夜也工作且超时概率较高,可以用   gettickcount   api   来计时。否则,有可能进入死循环。

你最后的   delay   不可以提前的,因为   setting   不对了。不知你的   delay   是如何做的,是否有   doevents   ?
发表于:2007-03-20 15:43:4611楼 得分:0
楼主是用oncomm事件来接收数据的吗?
.rthreshold是1吗?
如果不延时oncomm事件会触发吗?
如果是的话,那你要分次才能把数据接收完整,一个oncomm事件无法收完整个数据包的
发表于:2007-03-20 16:51:5512楼 得分:0
骗人。。。。哪里有200分,只有20分


快速检索

最新资讯
热门点击