Подключение трансивера HC-05 к MSP430G2 с помощью PySerial

Поэтому я пытался подключить этот приемопередатчик HC-05 на мой MSP-430G2. Поскольку я использую MacBook, я пытаюсь отправлять сообщения с помощью PySerial. Я использую:

  • OS X 10.9.5
  • Питон 2.7
  • МСП-430G2553
  • Энергия 0101E0016

Это мой код Энергии:

int gLed = GREEN_LED;

void setup()
{
  pinMode(gLed, OUTPUT);
  digitalWrite(gLed,LOW);
  Serial.begin(9600);
}

void loop()
{
  int buf_size = Serial.available();
  if (buf_size > 0) {

    char input = Serial.read();
    if (input == '1'){
      digitalWrite(gLed, HIGH);
    }
    else if (input == '0'){
      digitalWrite(gLed, LOW);
    }
  }    
}

После того, как я проверю и загружу это на микроконтроллер, я подключу 3,3 В к VCC, GND к земле, TXD-RXD от трансивера к P1.2-P1.1 на микроконтроллере (напротив, это означает, что TXD на трансивере входит в P1.2). (RXD) и наоборот), а GND и VCC от трансивера к верхним контактам GND и VCC с обеих сторон микроконтроллера. Затем я подключаю свой ноутбук к HC-05 и использую следующие скрипты на Python для отправки сообщений:

import serial

s = serial.Serial(port='/dev/tty.HC-05-DevB', baudrate=9600)

s.write('1')

Что происходит, ничего. Абсолютно ничего. И трудно понять, какой шаг я испортил, поскольку это может быть любой из них. Это PySerial? Это как я его подключаю? Это мой код Энергии? Любая подсказка будет очень полезна. Большое тебе спасибо.

ОБНОВЛЕНИЕ: этот код работал:

void loop()
{
  int buf_size = Serial.available();
  if (buf_size > 0) {
      digitalWrite(gLed, HIGH);
      delay(1000);
      digitalWrite(gLed, LOW);
      delay(1000);
    }
}   

Светодиод начал мигать после того, как я закончил писать предыдущий скрипт Python. Возможно, важно отметить, что он начал мигать только после того, как я написал s.write('1') (или любую другую строку в качестве аргумента) в Python. Также это не прекращается после того, как я напишу s.close() и отключу трансивер HC-05 от своего компьютера.

Я думаю, это означает, что соединение установлено, но по какой-то причине операторы if не работают должным образом. Большое спасибо за помощь всем вам, ребята. Я был бы очень признателен, если бы кто-нибудь помог мне понять, что не так с оценкой сообщения.

ОБНОВЛЕНИЕ 2: этот код также работал:

void loop()
{
  int buf_size = Serial.available();
  if (buf_size > 0) {
      char input = Serial.read();
      if (input){
        digitalWrite(gLed, HIGH);
        delay(1000);
        digitalWrite(gLed, LOW);
        delay(1000);
    }
  }    
}

Каждый раз, когда я отправлял ввод, свет включался, а затем выключался. Он оставался выключенным, пока я не отправил другой ввод. Я думаю, это означает, что входные данные принимаются трансивером и передаются на микропроцессор. Проблема может заключаться в том, что входные данные, которые я отправляю, не распознаются микропроцессором.

Проблема в том, что я отправляю однобайтовые символьные сообщения, которые я ранее определил в своем коде Energia. Я использую Python 2.7 и пробовал разные способы отправки сообщений из PySerial, включая: s.write('1'), s.write(1), s.write(b'1'), s.write('1'.encode()), s.write(bytearray('1')). На данный момент я действительно не знаю, как отправить его таким образом, чтобы это помогло мне решить эту проблему, но я считаю, что на этом этапе я смог сузить его до PySerial.

ОБНОВЛЕНИЕ 3: Ситуация становится все более странной. Заставив MCU мигать в соответствии с его вводом, я заметил следующую ситуацию.

Когда я использовал s.write('1'), приемопередатчик Bluetooth получил двоичный файл «11110100». После этого я попытался использовать s.write('2') и s.write('3') и понял, что они были получены моим MCU как один и тот же двоичный файл: «11110100». Следующее, что я сделал, это попробовал s.write('4') и понял, что это дало тот же результат, что и s.write('1'). Я написал следующий скрипт, чтобы попробовать его (также включает скрипт для распечатки ввода с помощью мигания светодиода).

void loop()
{
  int buf_size = Serial.available();
  if (buf_size > 0) {
    char input = Serial.read();
    if (byte(input) == B11110100){
        for (int i=0; i < 10; i++){
          digitalWrite(rLed, HIGH);
          delay(100);
          digitalWrite(rLed, LOW);
          delay(100);
      }
    }
    else if (input){
        digitalWrite(gLed, HIGH);
        digitalWrite(rLed, HIGH);
        delay(1000);
        digitalWrite(gLed, LOW);
        digitalWrite(rLed, LOW);
        delay(1000);
        for (int i=0; i < 8; i++){
          int val = bitRead(input,i);  // get the voltage from the microphone
          if (val == 0){
              digitalWrite(rLed, HIGH);
              delay(1000);
              digitalWrite(rLed, LOW);
          }
          else if (val == 1){
              digitalWrite(gLed, HIGH);
              delay(1000);
              digitalWrite(gLed, LOW);
          }
          delay(1000);
       }
    }
  }  
}

И s.write('1'), и s.write('4') дают одинаковый результат. Кто-нибудь знает, о чем это может быть? Большое спасибо за вашу помощь и время.

РЕШЕНИЕ: Я понял, что Energia не была настроена для работы с моей моделью MSP, а была тесно связана с ней. Исправление, которое устранило все проблемы. Спасибо всем за вашу помощь.


person user3001358    schedule 10.08.2015    source источник
comment
Работает ли простая программа мигания светодиодов? Работает ли программа, которая вслепую отправляет последовательные данные?   -  person CL.    schedule 10.08.2015
comment
Будет ли простая программа мигания светодиодов, которую вы предлагаете, просто включать пустой светодиод, не глядя на вход? Что влечет за собой слепая отправка последовательных данных? Как я могу проверить, работает ли он?   -  person user3001358    schedule 10.08.2015
comment
Я проверил первую идею и опубликовал обновление. Спасибо, что помогли мне немного приблизиться к пониманию этого!   -  person user3001358    schedule 10.08.2015
comment
Вывести все восемь бит полученного байта: короткое мигание для 0 бита, длинное для 1.   -  person CL.    schedule 10.08.2015
comment
Итак, я попробовал это для s.write('1'). Я получил этот байт «11110100». На самом деле все становится еще более запутанным, у меня то же самое для «4». Я получил «11110101» для «2» и «3». Все эти вызовы вернули 1, что, как я полагаю, относится к количеству переданных байтов. Я понятия не имею, что происходит, но сейчас это просто странно.   -  person user3001358    schedule 11.08.2015
comment
Я смог убедиться, что эта странность действительно имеет место. Добавлю обновление.   -  person user3001358    schedule 11.08.2015


Ответы (1)


Раньше я использовал HC-06 для подключения последовательного порта Arduino к MacBook, и самым сложным было найти правильный порт.
После сопряжения укажите доступные порты с помощью ls /dev/{tty,cu}.* и попробуйте другой. Для меня это показало два разных порта для одного устройства.

person Voro    schedule 10.08.2015
comment
Спасибо за ваше предложение. Я просто сделал то, что вы предложили, и проверил все появившиеся порты, к сожалению, ни один из них не работал. Однако я думаю, что тот, который я использую, относится к приемопередатчику Bluetooth, поскольку s.close() разъединил HC-05, а s.open() восстановил его. Чтобы добавить, у меня были cu и tty для одного и того же устройства, но ни один из них не работал. - person user3001358; 10.08.2015