奇怪,使用MSCOM控件控制信号灯,相同的程序结果却不同?

Hellenmec 2005-06-27 08:31:17
硬件是:电脑+控制盒+信号灯

编程语言:VBScript

我使用的是VB6.0 的 Interdev,事情很奇怪,因为我使用另外的程序控制信号灯,发现传输信号后,灯可以正常开启,亮灯正常,而相同的逻辑在我的程序中居然发生了不同的结果:信号传输后,灯只是闪了一下,然后熄灭。

研究很久不得法,不知我是否少掉什么设置而导致信号传输的问题,希望各位大侠给予指点!

程序如下:

‘控件属性设置


MSComm1.CommPort = 1
MSComm1.Settings = "9600,n,8,1"
MSComm1.RThreshold = 1
MSComm1.SThreshold = 1
MSComm1.Handshaking = comNone
MSComm1.PortOpen = True

’需要传出的二进位码

dim LightNo(192)

for i=1 to 192
LightNo(i)="0"
next
for j=1 to 192
if j mod 4=0 then
LightNo(j-1)="1" ‘亮灯的位置为:3,7,11,15……,也就是说,二进制码为0010 0010 0010……

end if

LNO=""
for w=1 to 192
LNO=LNO&LightNo(i)
next
call ConvertLToA(LNO) ’ConvertLToA程序在下面

next

‘将二进制码转化为十进制,并使用CByte()函数转化,传出

function ConvertLTOA (LG)
'msgbox LG
dim i,k,aaa
dim L(192)
dim cha(24)
for i=1 to 192
L(i)=int(Mid(LG,i,1))
next

k=1
for i=1 to 192
if i Mod 8=1 then
aaa=0
if L(i)=1 then aaa=aaa+1

'msgbox "aaa="&cstr(aaa)
elseif i Mod 8=0 then

if L(i)=1 then aaa=aaa+2^7


cha(k)=CByte(aaa) ’注:该处使用函数不知可否,原来使用的Chr()

k=k+1
else
if L(i)=1 then aaa=aaa+2^((i Mod 8)-1)


end if
next
str=""
for i=1 to 24
str=str&cha(i)
next
MSComm1.OutPut=str
End function
...全文
230 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hellenmec 2005-06-28
  • 打赏
  • 举报
回复
恩,对呀,是VBScript,我早就说了嘛:)
你的回复都让我受益匪浅。开心。:)
传输信号的时候,都要避开第八位,这是我们一直难以解决的问题,目前做的尝试也都以失败告终。
呵呵
jadeluo 2005-06-28
  • 打赏
  • 举报
回复
原来你在VBScript中用啊,怪不得你的代码中都没有具体的类型申明。

没有类型申明的话,那个字节数组就无法实现了,因为Dim Buffer(0 to 23) 和Dim Buffer(0 to 23) As Byte所分配的内存空间是不同的,前者是24个Variant类型变量,后者是24个字节。

还没想出解决的方法。
Hellenmec 2005-06-28
  • 打赏
  • 举报
回复

另外,我觉得你这段程序确实比我原来的要好的多,所以使用你改的那段程序,但是放到VBScript中,无论如何也调试不成功。总说前面一行少“)”,还有就是"AS integer"类似语句居然不能有,next i 等语句也会出错,真是困惑。
我始终查不出来这段程序有什么错误。只是觉得好。呵呵,可惜没办法用。
Hellenmec 2005-06-28
  • 打赏
  • 举报
回复
好,谢谢jadeluo!!
我的email地址为:zhaoyamei327@126.com

多多感谢啦!
jadeluo 2005-06-28
  • 打赏
  • 举报
回复
我只要把上面CByte改为Chr,亮灯正常,但是第八位必须避开,因为Chr传输的是0——127,一旦第八位有数值,就传输不到控制盒。
不知什么原因。

因为ASC码>128的字符会被VB另行处理,这也是我把ConvertLTOA改一下的原因。修改之后的ConvertLTOA是以字节数组的形式来发送数据的。
jadeluo 2005-06-28
  • 打赏
  • 举报
回复
Give me your Email address?
Hellenmec 2005-06-28
  • 打赏
  • 举报
回复
Dear jadeluo,真的很感谢你!如果能发给我串口调试工具,那更加感激不尽了!
我需要串口调试工具,因为第一次用软件连硬件,所以遇到问题很多,能不能发给我?太感谢了!

另,我这里出现的问题在于:
cha(k)=CByte(aaa) ’注:该处使用函数不知可否,原来使用的Chr()

我只要把上面CByte改为Chr,亮灯正常,但是第八位必须避开,因为Chr传输的是0——127,一旦第八位有数值,就传输不到控制盒。
不知什么原因。


jadeluo 2005-06-27
  • 打赏
  • 举报
回复
把ConvertLTOA改一下:

Private Sub ConvertLTOA(ByVal LG As String)
Dim i As Integer, j As Integer
Dim Buffer(0 To 23) As Byte
For i = 0 To 23
Buffer(i) = 0
For j = i * 8 + 1 To i * 8 + 8
Buffer(i) = Buffer(i) * 2
If Mid(LG, j, 1) = "1" Then
Buffer(i) = Buffer(i) + 1
End If
Next j
Next i
MSComm1.OutPut = Buffer
End Sub
DooDu 2005-06-27
  • 打赏
  • 举报
回复
既然别的程序可以,你就可以用Serial Monitor来监听下它发送的指令是什么,这个软件不占用串口资源而能够监听串口通信的内容,看看是不是少了什么,比如有的要回车符有的要中止符,等等。
domhuang 2005-06-27
  • 打赏
  • 举报
回复
同意楼上的
你可以看看 你另外一个程序发送的是什么
和自己的程序发送的比较一下就知道了
of123 2005-06-27
  • 打赏
  • 举报
回复
你说的“相同的逻辑”是指什么?
按我的理解,控制盒只看你发送的是什么。

Debug.Print str '看看你发送是什么
MSComm1.OutPut=str

需要注意的是,中文系统下的 String 类型变量中的非法字符,会被系统篡改。
你改用 Byte 数组试试。
jadeluo 2005-06-27
  • 打赏
  • 举报
回复
你原来的程序应该也没什么问题,我只是帮你整理了一下。
建议你找个串口调试工具,然后把24个字节通过串口调试工具发送给控制盒,看看结果怎样?
如果需要串口调试工具,我可以发一些给你。
Hellenmec 2005-06-27
  • 打赏
  • 举报
回复
弱弱的問一句,会不会控制盒有问题?这种情况可能性大吗?
jadluo,不知你还会不会上这里来哦,都焦头烂额了,哎……
Hellenmec 2005-06-27
  • 打赏
  • 举报
回复
还请各位大虾多多指点小女子!!!
Hellenmec 2005-06-27
  • 打赏
  • 举报
回复
谢谢各位了!!!
jadluo,我原来的程序有什麽错误?逻辑上会导致控制盒有接收的问题吗?


现在发现另外一个程序和这个情况是相同的,
我想问的是,如果我想发送一个信号使得前三个灯亮,那么就是111000000000……(共192位),结果就是灯没有反应。

1,451

社区成员

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

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