VB6 帮助中的 RS232c
大家好,我是 RS232c 命令发送方面的新手。这是我的 Yamaha A/V RX-A2000 的文档。
PWR
[PUT Command]
@MAIN:PWR=Parameter
[GET Command]
@MAIN:PWR=?
Operating & retrieving Power state of Main Zone
Initial Auto Feedback is Available
[Parameters]
Standby
PUT: turining its state to Standby / GET: indicating Standby status.
On
PUT: turining its state to On / GET: indicating On status.
On/Standby
PUT Only: toggling its status between On/Standby
我对如何通过 MSComm 控件发送这样的命令有点困惑。
MSComm.CommPort = 2
MSComm.Settings = "9600,n,8,1"
MSComm.PortOpen = True
If Not MSComm.PortOpen Then
MsgBox "not opened"
Else
MSComm.Output = "@MAIN:PWR=On" & Chr(13)
Do While MSComm.InBufferCount > 0
Text1.Text = Text1.Text & MSComm.Input
Loop
End If
那是正确的吗?
大卫
Hey all i am new at this RS232c command sending. This is what the documents has for my Yamaha A/V RX-A2000.
PWR
[PUT Command]
@MAIN:PWR=Parameter
[GET Command]
@MAIN:PWR=?
Operating & retrieving Power state of Main Zone
Initial Auto Feedback is Available
[Parameters]
Standby
PUT: turining its state to Standby / GET: indicating Standby status.
On
PUT: turining its state to On / GET: indicating On status.
On/Standby
PUT Only: toggling its status between On/Standby
I am a little confused as to how to send a command like that through the MSComm control.
MSComm.CommPort = 2
MSComm.Settings = "9600,n,8,1"
MSComm.PortOpen = True
If Not MSComm.PortOpen Then
MsgBox "not opened"
Else
MSComm.Output = "@MAIN:PWR=On" & Chr(13)
Do While MSComm.InBufferCount > 0
Text1.Text = Text1.Text & MSComm.Input
Loop
End If
Would that be correct?
David
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
该代码是健全的,但有一个小缺陷。请注意此代码:
在您发送一些数据后,然后立即期望看到响应。该代码不会进入 Do 循环,因为目前还没有任何内容可供读取。
因此,要么在短暂的停顿后检查 .InBufferCount,要么采用不同的方法。我通常有一个计时器每 200 毫秒左右检查一次端口(取决于紧急程度)。您还可以响应 OnComm 事件,但众所周知,如果处理的数据过多,此事件会将 CPU 使用率提高到 100%。听起来您将处理一小部分数据,因此您应该可以接受这两种方法。
The code is sound but has a small flaw. Note this code:
In you send some data, then immediately expect to see a response. The code will not enter the Do loop because there will be nothing to read as of yet.
So, either check for .InBufferCount after a small pause or adopt a different approach. I typically have a timer check the port every 200 ms or so (depending on urgency). You could also respond to the OnComm event, but this event has been known to ratchet the CPU usage to 100% if there is too much data going through. It sounds like you'll be dealing with a small set of data, so you should be ok with either approach.
您的代码看起来有点正确 - 无论如何从概念上讲 - 尽管 Do While 的设置确实不太正确。有关编码示例,请参阅 http://support.microsoft.com/kb/194922。
(但是“.Handshaking = 2 - comRTS”部分应该是“.Handshaking = 2”)使用事件是RS232 通信更可靠的方法。
请参阅http://www.vbrad.com/article.aspx?id=37 寻求进一步指导。
如果您的 PC 有超级终端(或其他一些 TTY 程序),请使用它尝试与您的 Yamaha 进行手动通信。希望您的用户手册中有一些您可以尝试的示例。谷歌“超级终端 rs232”以获得其他想法;例如 http://www.connectworld.net/interface-troubleshooting.html。走手动路线至少会确认您可以让您的电脑与您的雅马哈对话,并且它将帮助您考虑如何编写代码。
(Google“超级终端替代 Windows”用于其他 TTY 程序;例如 http://www.windowsreference.com/windows-vista/alternatives-to-hyperterminal-in-vista/)
Your code looks kinda right - conceptually anyway - although the setup for the Do While really isn't quite right. See http://support.microsoft.com/kb/194922 for a coding example.
(but the ".Handshaking = 2 - comRTS" part should be ".Handshaking = 2") Using events is the more reliable approach to RS232 communication.
See http://www.vbrad.com/article.aspx?id=37 for further guidance.
If your PC has HyperTerminal (or some other TTY program), use that to attempt manual communication with your Yamaha. Hopefully your users manual has some examples you could try. Google on "hyperterminal rs232" for other ideas; such as http://www.connectworld.net/interface-troubleshooting.html. Going the manual route will at least confirm that you can make your PC talk to your Yamaha, and it will help you think about how to write your code.
(Google "hyperterminal substitute windows" for other TTY programs; such as http://www.windowsreference.com/windows-vista/alternatives-to-hyperterminal-in-vista/)