串口设备数据发送接收

old_chen 2008-12-01 09:20:29
我有一个简单的串口设备,叫满意度评价器。
控制它需要传递参数分别为0x01、0x02、0x03、0x04、0x05、0x06、0x07、0x08、0x09、0x0a(十种情况)
采用win API 函数 WriteFile()我不会传递,所以用mscomm32.ocx,ole_1.object.output = blob(char(1)) 可以实现发送0x01的效果。同样blob(char(2~10))能分别实现以上所有功能。
然而,接收时出现问题:我是用
BOLB lb_data
IF ole_1.object.InBufferCount <> 0 THEN
lb_data=ole_1.object.input
if lb_data = blob(char(1)) then
//没有进入
end if
if lb_data = blob(char(2)) then
//没有进入
end if
if lb_data = blob(char(3)) then
//没有进入
end if
if lb_data = blob(char(4)) then
//没有进入
end if
END IF
设备说明上说接收到的数据应该分别为0x01、0x02、0x03、0x04
我应该如何处理?如何判断接收到的数据?

如果采用WIN API 函数如何传递以上数据?
我发现mscomm32.ocx不好用,每次开机都要我重新注册,所以如果可能最好还是用 WIN API 函数。
...全文
153 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
PS小码农 2010-01-18
  • 打赏
  • 举报
回复
我是新手,还是学习中了。
old_chen 2008-12-16
  • 打赏
  • 举报
回复
感谢各位帮忙,其实我的程序没有错,只是跟踪的位置错了,无意中正常运行时得到正确结果。

现在最想知道的是这段代码如何用PB来写,目的是取得串口设备名称和端口号,VB/VC都可以的。
下边是人家写的代码:
Private Sub Form_Load()
Dim str1, str2 As String
Dim portnumber As Integer
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_PnPEntity")
For Each objItem In colItems
str1 = objItem.Name
str2 = Replace(str1, ")", "")
If Left(str2, 15) = "USB-SERIAL CH34" Then
str1 = Mid(str2, 22)
portnumber = Val(str1)
MSComm1.CommPort = portnumber
MSComm1.InputMode = 1
MSComm1.RThreshold = 1
MSComm1.Settings = "9600,n,8,1"
MSComm1.PortOpen = True
End If
Next
End Sub
这是VC的,以下是VB的:
Private Sub Form_Load()
Dim str1, str2 As String
Dim portnumber As Integer
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_PnPEntity")
For Each objItem In colItems
str1 = objItem.Name
str2 = Replace(str1, ")", "")
If Left(str2, 15) = "USB-SERIAL CH34" Then
str1 = Mid(str2, 22)
portnumber = Val(str1)
MSComm1.CommPort = portnumber
MSComm1.InputMode = 1
MSComm1.RThreshold = 1
MSComm1.Settings = "9600,n,8,1"
MSComm1.PortOpen = True
End If
Next
End Sub
谁能帮忙呀!
184270428 2008-12-03
  • 打赏
  • 举报
回复
三楼干嘛搞的那么复杂
blob lb_1
lb_1 = blob(char(3))
messagebox('',integer(asc(char(lb_1))))

修改 删除 举报 引用 回复

加为好友
发送私信
在线聊天
184270428

等级:
可用分等级:中农
总技术分:105
总技术分排名:88746

发表于:2008-12-03 00:18:228楼 得分:0
引用楼主 old_chen 的帖子:
向设备发送数据只限于0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a十种情况,从串口接收数据只限于0x0z,0x02,0x03,0x04四种情况,换算成字符都是不可见的。当然,字符接收也不可见。
我有这样一组换算,请帮忙解决好换算关系,或许就是个基本知识,但对于半路出家的我老说可能就是转不过弯了。
blob lb_1
lb_1 = blob(char(3))//这个应该是0x03

我现在想通过对lb_1的转换再看到一个数值3或者字符"3"
string l…


blob lb_1
lb_1 = blob(char(3))
转字符3: string(asc(char(lb_1)))
转integer3:integer(asc(char(lb_1)))
这样也可以:
integer(blob(char(0)) + lb_1)
string(integer(blob(char(0)) + lb_1))
转换时配好对应的位数就可以了.你想转什么就是什么.

jlwei888 2008-12-02
  • 打赏
  • 举报
回复
我知道了!要用asc

ls_1 = string(lb_1)

messagebox('',asc(ls_1))
old_chen 2008-12-02
  • 打赏
  • 举报
回复
向设备发送数据只限于0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a十种情况,从串口接收数据只限于0x0z,0x02,0x03,0x04四种情况,换算成字符都是不可见的。当然,字符接收也不可见。
我有这样一组换算,请帮忙解决好换算关系,或许就是个基本知识,但对于半路出家的我老说可能就是转不过弯了。
blob lb_1
lb_1 = blob(char(3))//这个应该是0x03

我现在想通过对lb_1的转换再看到一个数值3或者字符"3"
string ls_1
int il_1
ls_1 = string(lb_1)
il_1 = integer(lb_1)
结果:ls_1 = " " //绝不是""
il_1 = 0

谢谢
jlwei888 2008-12-01
  • 打赏
  • 举报
回复
直接用十进制数试试!

0x01 1
0x02 2
0x03 3
0x04 4
...
liubocy 2008-12-01
  • 打赏
  • 举报
回复
发送要转换成字符,再接收字符的

string ls_input

ls_input = ole_com.object.input
jlwei888 2008-12-01
  • 打赏
  • 举报
回复
那直接用int来接收呢
old_chen 2008-12-01
  • 打赏
  • 举报
回复

Private Sub Form_Load()
Dim str1, str2 As String
Dim portnumber As Integer
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_PnPEntity")
For Each objItem In colItems
str1 = objItem.Name
str2 = Replace(str1, ")", "")
If Left(str2, 15) = "USB-SERIAL CH34" Then
str1 = Mid(str2, 22)
portnumber = Val(str1)
MSComm1.CommPort = portnumber
MSComm1.InputMode = 1
MSComm1.RThreshold = 1
MSComm1.Settings = "9600,n,8,1"
MSComm1.PortOpen = True
End If
Next
End Sub

Private Sub MSComm1_OnComm()
Dim indata As Variant
Dim recbyte As Byte
If MSComm1.CommEvent = comEvReceive Then
indata = MSComm1.Input
recbyte = AscB(indata)
MSComm1.InBufferCount = 0
If recbyte = 1 Then
MsgBox ("基本满意!")
End If
If recbyte = 2 Then
MsgBox ("满意!")
End If
If recbyte = 3 Then
MsgBox ("不满意!")
End If
If recbyte = 4 Then
MsgBox ("未评价!")
End If
End If
End Sub
以上是他们提供的一段VB代码,麻烦高手改成PB的可以吗?我会再加分的,谢谢!!!
old_chen 2008-12-01
  • 打赏
  • 举报
回复
哈,试过的,不行呀
看过几个程序,WriteFile()好象传字符型的,不能传二进制的吧
然后输出0x01我也不知道怎么转换出来

680

社区成员

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

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