RS232c в справке VB6

Привет всем, я новичок в этой отправке команды 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

Это было бы правильно?

Дэйвид


person StealthRT    schedule 17.05.2011    source источник


Ответы (2)


Ваш код выглядит довольно правильно - во всяком случае, концептуально - хотя настройка Do While на самом деле не совсем правильная. См. http://support.microsoft.com/kb/194922 пример кода. (но часть ".Handshaking = 2 - comRTS" должна быть ".Handshaking = 2") Использование событий является более надежным подходом к связи RS232.

См. http://www.vbrad.com/article.aspx?id=37 для дальнейшего руководства.

Если на вашем ПК установлен HyperTerminal (или какая-либо другая программа TTY), используйте ее, чтобы попытаться установить связь с Yamaha вручную. Надеюсь, в вашем руководстве пользователя есть несколько примеров, которые вы могли бы попробовать. Google на «гипертерминал rs232» для других идей; например, http://www.connectworld.net/interface-troubleshooting.html. Ручной путь, по крайней мере, подтвердит, что вы можете заставить свой компьютер общаться с Yamaha, и это поможет вам подумать о том, как написать свой код.

(Погуглите «hyperterminal replace windows» для других программ TTY, таких как http://www.windowsreference.com/windows-vista/alternatives-to-hyperterminal-in-vista/)

person rskar    schedule 17.05.2011
comment
@AngryHacker - Добро пожаловать! И за статью тоже спасибо! - person rskar; 18.05.2011
comment
ХОРОШО. Я не уверен, что мне даже нужно Do While в этом, так как я просто хочу отправить команду и все. Все, что я ищу, это отправка команды и работа :o) И, к сожалению, у Yamaha не было NO примеров rs232c для этого. Мне пришлось копаться очень-очень действительно далеко, чтобы хотя бы найти лист команд rs232 для него. Даже у самой компании не было ни одного, чтобы предоставить мне! Шиш! - person StealthRT; 18.05.2011
comment
@StealthRT: К сожалению, порт Control Expansion Terminal не предназначен для потребительских товаров — они предназначены для специализированных коммерческих приложений. Это может показаться глупым, но, возможно, вам следует сначала выяснить, как заставить старомодный телефонный модем rs232 набирать номер через HyperTerminal (или что-то еще). По крайней мере, эта диверсия даст вам некоторый опыт управления устройством через rs232. Просто Google hayes модемные команды, подключите старый модем и дайте ему вихрь. По крайней мере, помощь модема доступна во многих местах. - person rskar; 18.05.2011
comment
Спасибо за ваш ответ. Тем не менее, я не новичок в RS232c - я просто плохо знаком с тем, как это управляется. Я привык отправлять на устройство шестнадцатеричные числа или числа, а не слова :о), поэтому я немного запутался. - person StealthRT; 18.05.2011

Код хороший, но есть небольшой недостаток. Обратите внимание на этот код:

MSComm.Output = "@MAIN:PWR=On" & Chr(13)

Do While MSComm.InBufferCount > 0
     Text1.Text = Text1.Text & MSComm.Input
Loop

В вы отправляете какие-то данные, то сразу же ожидаете увидеть ответ. Код не войдет в цикл Do, потому что читать пока нечего.

Итак, либо проверьте наличие .InBufferCount после небольшой паузы, либо примените другой подход. Обычно у меня есть таймер, проверяющий порт каждые 200 мс или около того (в зависимости от срочности). Вы также можете реагировать на событие OnComm, но известно, что это событие увеличивает использование ЦП до 100%, если передается слишком много данных. Похоже, вы будете иметь дело с небольшим набором данных, поэтому вам подойдет любой подход.

person AngryHacker    schedule 17.05.2011
comment
ХОРОШО. Я не уверен, что мне даже нужно Do While в этом, так как я просто хочу отправить команду и все. Все, что я ищу, это отправить команду и работать: o) - person StealthRT; 18.05.2011
comment
Я попробовал этот код, и он ничего не сделал :o(. Есть идеи, почему это может быть? - person StealthRT; 26.05.2011
comment
Я имел в виду НЕ использовать этот код с циклом. Вместо этого используйте паузу, а затем прочитайте порт. Но чтобы убедиться, что устройство вообще работает, установите соединение из HyperTerminal или TeraTerm и попробуйте оттуда. - person AngryHacker; 26.05.2011