PB串口通信问题

flyerlxg 2002-10-21 08:38:59
以下是用VB通过串口采集卡钟考勤数据的程序段,在PB中要怎样书写呢,请大家帮我看看
outstr(0) = machineadress '整型数据
outstr(1) = 2
outstr(2) = 1
If Not FrmGather.MSComm.PortOpen Then FrmGather.MSComm.PortOpen = True
FrmGather.MSComm.InBufferCount = 0
FrmGather.MSComm.OutBufferCount = 0
FrmGather.MSComm.InputMode = comInputModeBinary
FrmGather.MSComm.Output = outstr
Curtime1 = Timer
Do
Curtime2 = Timer
If Curtime2 - Curtime1 <= 1 Then
DoEvents
Else
LabInfo.Caption = "系统忙,请重试,发送采集指令时超时出错!"
Labgather.Visible = False
Call ComError '端口关闭过程
Exit Sub
End If
Loop Until FrmGather.MSComm.InBufferCount >= 1
FrmGather.MSComm.InputLen = 1
Vin = FrmGather.MSComm.Input
If Vin(0) <> machineadress Then
Labgather.Visible = False
LabInfo.Caption = "采集数据总数时没有得到正确的考勤机地址信号!"
Call ComError '端口关闭过程
Exit Sub
End If
Curtime1 = Timer
Do Until FrmGather.MSComm.InBufferCount >= 3
Curtime2 = Timer
If Curtime2 - Curtime1 < 3 Then
DoEvents
Else
Labgather.Visible = False
LabInfo.Caption = "接收采集数据总数时等待超时!"
Call ComError '端口关闭过程
Exit Sub
End If
Loop
FrmGather.MSComm.InputLen = 3
Vin = FrmGather.MSComm.Input
Datanum = (Vin(0) - 114) * 65536 + Vin(1) * 256 + Vin(2)
Datanum = Datanum / 10
If Datanum = 0 Then
Labgather.Visible = False
LabInfo.Caption = "没有数据可以采集"
Call ComError '端口关闭过程
Exit Sub
End If
i = 1
LabRecord.Visible = True
Do Until i > Datanum '循环次数等于纪录数
LabRecord.Caption = "共" & Datanum & "条,第" & i & "条纪录"
Curtime1 = Timer
Do '接收地址信号
Curtime2 = Timer
If Curtime2 - Curtime1 <= 1 Then
DoEvents
Else
Labgather.Visible = False
LabInfo.Caption = "没有得到正确的考勤机地址信号!"
Call ComError '端口关闭过程
Exit Sub
End If
Loop Until FrmGather.MSComm.InBufferCount >= 1
FrmGather.MSComm.InputLen = 1
Vin = FrmGather.MSComm.Input
Curtime1 = Timer
Do Until FrmGather.MSComm.InBufferCount >= 9
Curtime2 = Timer
If Curtime2 - Curtime1 < 1 Then
DoEvents
Else
Labgather.Visible = False
LabInfo.Caption = "没有得到正确的考勤机地址信号!"
Call ComError '端口关闭过程
Exit Sub
End If
Loop
FrmGather.MSComm.InputLen = 9
Vin = FrmGather.MSComm.Input '成功采集到一条纪录
nUD = UBound(Ind)
ReDim Preserve Ind(0 To nUD + 1)
n = Fix(Vin(0) / 16) * 10 + Vin(0) Mod 16
If n >= 0 And n <= 9 Then
c = "0" + CStr(n)
Else
c = CStr(n)
End If
n = Fix(Vin(1) / 16) * 10 + Vin(1) Mod 16
If n >= 0 And n <= 9 Then
c = c + "0" + CStr(n)
Else
c = c + CStr(n)
End If
n = Fix(Vin(2) / 16) * 10 + Vin(2) Mod 16
If n >= 0 And n <= 9 Then
c = c + "0" + CStr(n)
Else
c = c + CStr(n)
End If
Ind(nUD + 1).id = c
y = Fix(Vin(3) / 16) * 10 + Vin(3) Mod 16
m = Fix(Vin(4) / 16) * 10 + Vin(4) Mod 16
D = Fix(Vin(5) / 16) * 10 + Vin(5) Mod 16
H = Fix(Vin(6) / 16) * 10 + Vin(6) Mod 16
Mi = Fix(Vin(7) / 16) * 10 + Vin(7) Mod 16
Smid = CStr(y) + "-" + CStr(m) + "-" + CStr(D)
Ind(nUD + 1).indate = CDate(Smid) '日期
Smid = CStr(H) + ":" + CStr(Mi) + ":" + "00"
Ind(nUD + 1).intime = CDate(Smid) '时间
Ind(nUD + 1).machine_id = machineadress '机器编号
i = i + 1
Loop 'loop do datanum 采集循环 循环纪录数目
...全文
263 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
licena 2002-11-14
  • 打赏
  • 举报
回复
:),恭喜
flyerlxg 2002-11-14
  • 打赏
  • 举报
回复
谢谢楼上的"无花果",果然问题出在那里,我把其类型改为char就可以啦!高兴!
licena 2002-11-14
  • 打赏
  • 举报
回复
flyerlxg(飞鸟)
那么有可能是考勤钟方面出了问题,我也不清楚。别人的VB可以读取,我的PB却不能读取

是BCD编码格式的字符

奇怪,原来可以读一个字节出来的程序,现在一个都读不出来了,哎…………


sunboy_hb(无花果)
很可能是这样:
1.PB对COM读写时,对所有值为char(0)的字符均忽略.
2.string 字段遇到char(0)时就认为已经字串结束了.


看来如sunboy_hb(无花果)所说,
flyerlxg(飞鸟)你用vb取出来是什么,看一下.
若因为0x00的原因,先用C之类的处理一下吧
softdear 2002-11-13
  • 打赏
  • 举报
回复
up
flyerlxg 2002-11-12
  • 打赏
  • 举报
回复
奇怪,原来可以读一个字节出来的程序,现在一个都读不出来了,哎…………
gpg 2002-11-12
  • 打赏
  • 举报
回复
---- 1、 常用属性 CommPort:设置或返回串行端口号,缺省为1。
Setting:设置或返回串行端的波特率、奇偶校验位、 数据位数、停止位。缺省值为"9600,N,8,1"。
PortOpen:设置它为True则打开端口,设置它为False则关闭端口。
InBufferSize:设置或返回接收缓冲区的大小,缺省为1024 字 节。
InBufferCount:返回接收缓冲区内的等代读取的字节个数,设属性为0清除接收缓冲区。
OutBufferSize:设置或返回发送缓冲区,缺省为512字节。
OutBufferCounter:返回发送缓冲区内等待发送的字符数,可用0来清空缓冲区。
Output:向发送缓冲区传送数据
RThreshold: 该属性确定当接收缓冲区内字节个数达或超过该值后就产生代码为ComEventReceive
的OnComm事件,设置位0,则不产生OnComm事件。
CommEvent:有通讯错误或事件发生时产生OnComm事件,CommEvent事件的值可以用来确定引
发OnComm事件的具体的错误或事件常用的有以下几种(更详细的资料可参考MSComm控件帮助文件)
ComEventbreak:接受到中断信号
ComEventFrame:硬件检测到帧错误。
ComEventRxOver:接收缓冲区溢出。
ComEventTxFull:发送缓冲区溢出。
ComEventReceive:接受到规定的字符数。
InputLen:设置或返回接收缓冲区内用Input读入的个数。若取0,则读取整个缓冲区的内容。
Input:返回并删除接受缓冲区的数据。
---- 2、 示例:
---- 下面举一接收程序示例:制作一通讯接收窗口,选择菜单Controls→OLE→Insert Control→Microsoft
Communications Control,
---- 在窗口中出现通信控件图标单击鼠标右键,选择OCX Properties设置常用属性,也可在程序中进行设置
窗口的Open事件程序如下
ole_1.object.CommPort=2
ole_1.object.Settings="9600,N,8,1"
ole_1.object.PortOpen=ture
ole_1.object.Rthreshold=10
ole_1.object..Inputlen=0 . .
通信控件的oncomm事件的程序如下
choose case ole_1.object.CommEvent
case comEventBreak //接收到中断信号
case comEventCDTO //处理CD超时
. . .
case comEvReceive sle_1.text=ole_1.object.Input
. .
end choose
sunboy_hb 2002-11-08
  • 打赏
  • 举报
回复
很可能是这样:
1.PB对COM读写时,对所有值为char(0)的字符均忽略.
2.string 字段遇到char(0)时就认为已经字串结束了.
ddtid 2002-11-06
  • 打赏
  • 举报
回复
我用 PB6.5 + mscomm32 编过单片机的管理软件,原理应该差不多,没有见到什么问题
不过我做的编码不是BCD的,对中文支持没有问题,我甚至用我的程序收过手机短消息.

说这些是想说,工具应该没有问题
flyerlxg 2002-11-06
  • 打赏
  • 举报
回复
那么有可能是考勤钟方面出了问题,我也不清楚。别人的VB可以读取,我的PB却不能读取
flyerlxg 2002-11-04
  • 打赏
  • 举报
回复
那不是中文呀,是BCD编码格式的字符
flyerlxg 2002-11-01
  • 打赏
  • 举报
回复
谢谢楼上的兄弟,这个控件是全部利用API函数写的,我已经试过了,只能读两个字节的内容。如果用MSCOMM32.OCX控件,还可以读3个字节。
xuebuctxy 2002-11-01
  • 打赏
  • 举报
回复
pb 的ole 控件有问题,我在调用vba的时候在读取中文时总是不对,后来查了资料说ole 对中文的支持不好,你是不是也遇上了这样的问题
flyerlxg 2002-10-30
  • 打赏
  • 举报
回复
谢谢楼上的,我也那样写了,不然PB是通不过的,是不是考勤钟出了问题,但这又有点不可能,因为别人的VB程序可以正确读取呀!可能是我对PB了解地不够吧!
blazingstar 2002-10-30
  • 打赏
  • 举报
回复
去下载下面的控件试试行不行?
http://www.pdriver.com/display.asp?key_id=1485
jackygan 2002-10-26
  • 打赏
  • 举报
回复
简单来说,PB只要多写上ole_1.object.就行了。
flyerlxg 2002-10-26
  • 打赏
  • 举报
回复
谢谢!
iceriver521 2002-10-26
  • 打赏
  • 举报
回复
周一在看吧,先留个位置,免得找不着帖子!
licena 2002-10-24
  • 打赏
  • 举报
回复
hehe:)
一起学习...
chengkai 2002-10-23
  • 打赏
  • 举报
回复
你还是自己慢慢学吧,你想白吃干饭吗?
licena 2002-10-23
  • 打赏
  • 举报
回复
subroutine Sleep(ulong milli) Library "Kernel32.dll"
读写如下(API调用)
ulong hprinter
ulong writed
ulong ol
ulong toread,towrite
ulong uIndex,ReturnNumber
blob wdata,rdata
string params
DCB s_dcb
COMMTIMEOUTS commtimeout
string cmd
string portname

setnull(ol)
wdata=blob(space(1700))
rdata=blob(space(1700))
portname ="COM1"
//portname ="COM2"


/*
hprinter 端口据柄
toread,towrite 读写数据长度
rdata,wdata 读写的数据
ReturnNumber,writed 实际长度
*/

toread=2
blobedit(wdata,1,10)
blobedit(wdata,2,11)
WriteFile(hprinter,wdata,towrite,writed,ol)

Sleep(500)
cmd="串口通讯"
cmd=cmd+"演示"
toread=len(cmd)
wdata=blob(cmd)
WriteFile(hprinter,wdata,toread,writed,ol)

/*

*/
ReadFile(hprinter,rdata,toread,ReturnNumber,ol)

closehandle(hprinter)
加载更多回复(10)

740

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 脚本语言
社区管理员
  • 脚本语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧