串口设备数据发送接收

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 函数。
...全文
156 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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创作助手写篇文章吧