回 帖 发 新 帖 刷新版面

主题:[讨论]串口读数不完整?100元充话费求救!

串口读数不完整?用了控件和myfll都不行,还是自己比较菜,

现100元充话费求救!说话算数!请联系我QQ:424658155,请在回复中留下电话或QQ,有热心帮忙或想免费充电话费的朋友请联系,谢谢!

我从一个手持售票端终里的串口,读数,数据最后是一个'e'字母,当读完出'e'后,说明读完了,数据用逗号隔开,但手持终端的数是总是读不全!用mscom控件也是这样,郁闷。这是用myfll的代码。

PUBLIC cretmsg,hCom1
cRetMsg=''

Set Library To myFll
   hCom1=ComOpen(1,"115200,n,8,1")
  If hCom1==""
     MessageBox("无法打开端口")
     Return 
  EndIf 
    DO whil .t.
         cRetMsg=cRetMsg+ComRead(hCom1,0.1)
         ?cretmsg
         IF AT('e',cretmsg,1)>0
             MESSAGEBOX(cretmsg)
             EXIT
        ENDIF
 *     WAIT WINDOW 'a' TIMEOUT 0.01
  ENDDO
messagebox(cretmsg)
ComClose(hCom1)&&关闭串口

Set Library To 


读的数据不全,少字符,有时读不出字符‘e’,各位vfper帮忙。

回复列表 (共3个回复)

沙发

ANSEC=Datetime()
 NSEC=0
 cRetMsg=''
With Thisform.mscomm1
    If .PORTOpen =.T.
        .PORTOpen =.F.
    Endif

    If .PORTOpen =.F.
        .INBufferSize =1024
        .OutBufferSize =1024
        .CommPort = 1
        .Settings = "115200,N,8,1"
        .InputLen = 0
        .Rthreshold = 1
        .PORTOpen = .T.
    Endif

    .OutBufferCount = 0              &&清空发送缓冲区
    .InBufferCount = 0               &&清空接收缓冲区
Endwith       

Do While Right(Alltrim(cRetMsg),1)<>'e' .And. NSEC<10
                cRetMsg=cRetMsg+Thisform.mscomm1.Input
                BNSEC=Datetime()
                NSEC=BNSEC-ANSEC
                Loop
        Enddo

**要求最长不超过10秒读完,否则退出提示操作超时

板凳

我也想研究一下,最近

3 楼

我是用mscomm控件试的,请参考下面示例,希望对你有用!

#define COM1  1
#define M_out  101
#define MAXCOUNT  14  
//创建Microsoft Comm 控件对象
comm1=createobject("mscommlib.mscomm.1")
comm1.commport=COM1 //指定COM1口工作
comm1.portopen=.t. //打开COM1口
//设置传输速率,奇偶校验,数据位,停止位
comm1.settings="115200,n,8,1"
indata1="" //变量初始化
//从接收缓冲区读出字符串
do while comm1.inbuffercount<=MAXCOUNT
  comm1.inbuffercount=0 //清缓冲区
  comm1.inputmode=0 //设置字符输入输出方式
  comm1.inputlen=1 //仅输入输出一个字符
  //判断头一个字符是否是“e”,如不正确循环判断
  do while .t.
    indata=comm1.input
    if asc(indata)=M_out
      exit
    endif
  enddo
  //从缓冲区读字符
  indata=comm1.input
  //生成字符串
  indata1=indata1+indata
enddo
comm1.portopen=.f //关闭串行端口

注意对字符串indata1的处理。因为接收的“字符串”会碰到的“低级”问题。要知道VFP只支持可打印的字符内码!对控制码和“零字符”要做变换处理,否则不是“丢”掉就是“乱”掉。祝顺!

我来回复

您尚未登录,请登录后再回复。点此登录或注册