Visual Studio 2010 — последовательный обмен данными между ПК и Arduino через RS232 с использованием переполнения стека

Я пытаюсь связаться с моим arduino duemilanove через шнур RS232. Я просто хочу иметь возможность отправлять байт (или символ) на мой Arduino из настольного приложения. Arduino подключается к USB COM5 на моем компьютере. Я подключил RS232 к COM1, и затем у меня есть контакты 2, 3 и 5 на другом конце RS232, подключенные к контактам Arduino TX, RX и GND, соответственно.

Я нашел класс последовательной связи для C ++ по следующей ссылке:

http://playground.arduino.cc/Interfacing/CPPWindows

Я добавил файлы .h и .cpp из приведенного выше примера как Serial.h и Serial.cpp (я думаю, что в примере используются SerialClass.h и SerialClass.cpp, я просто изменяю имена).


На моем arduino у меня работает следующий код:

// ARDUINO
char incomingByte = 0;

void setup() {
Serial.begin(9600);
}

void loop() {

// send data only when you receive data:
if (Serial.available() > 0) {
// read the incoming byte:
incomingByte = Serial.read();

// say what you got:
Serial.print("I received: ");
Serial.println(incomingByte, HEX);
}
}

И моя программа на С ++ выглядит следующим образом:

// C++
#include <iostream>
#include <Windows.h>
#include "Serial.h"
using namespace std;

int main(void)
{
Serial port("COM1");

char* msg = "Hello Arduino!";
int msgLen = strlen(msg);
bool writeSuccess = port.WriteData(msg, msgLen);

cout << "\n\n";
system("PAUSE");
}

Когда я использую средство просмотра последовательного порта Arduino, чтобы увидеть, что печатается, я получаю очень странные значения, которые не соответствуют тому, что я отправляю (насколько я могу судить).

Когда я посылаю «Hello Arduino!», Arduino печатает следующее:

I received: FFFFFFAB
I received: 3A
I received: 3A
I received: A
I received: FFFFFFFA
I received: FFFFFFEB
I received: 6D
I received: 37
I received: 15
I received: 2D
I received: 23
I received: 21
I received: FFFFFFBD
I received: 0

Это не правильный гекс для «Hello Arduino!», Но я понятия не имею, почему это не правильно. Кто-нибудь знает, что я делаю не так?

1

Решение

Arduino использовал логику TTL для последовательного соединения. Ожидаются значения при 0 и 5 В. RS232 использовал другое напряжение от -V до + V. Вам может понадобиться конвертер.

1

Другие решения

Эмм … Нет! подтягивать и опускать не по этой причине ..

  • TTL = низкий: 0 В, высокий: 5 В

  • RS232 = низкий: +3: + 15 В, высокий: -3: -15 В

Следовательно … Вам нужен преобразователь напряжения (и инвертор), как правильно указал Дэвид Скоган.

Примеры:

  1. Использование дискретных компонентов (имеет функцию автоматического эха, т. Е. На ПК вы увидите отправленные вами данные): http://project.irone.org/simple-rs232-to-ttl-level-converter.html или же http://circuit-diagram.hqew.net/Simple-TTL$ 2dRS232-Level-конвертер-Using-Transistor_2757.html
  2. Общая схема с MAX232 (или эквивалентной) и четырьмя конденсаторами
  3. Вместо использования преобразователя USB-RS232 используйте преобразователь USB-UART, например, с FT232 или чем-то в этом роде. Это не требует никакого интерфейса

Или .. просто используйте USB-порт на Arduino, на котором уже установлен FT232.

Личный комментарий: я бы избежал решения 1 …

1

По вопросам рекламы [email protected]