Последовательная связь между ПК и Arduino через RS232 с использованием C++

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

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

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


На моем Arduino запущен следующий код:

// АРДУИНО
char incomingByte = 0;

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

void loop() {

        // отправлять данные только при получении данных:
        if (Serial.available() > 0) {
                // читаем входящий байт:
                incomingByte = Serial.read();

                // скажи, что у тебя получилось:
                Serial.print("I received: ");
                Serial.println(incomingByte, HEX);
        }
}

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

// 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

Похоже, это не правильный hex для "Hello Arduino!", но я понятия не имею, почему он не правильный. Кто-нибудь знает, что я делаю не так?

, 👍2

Обсуждение

Вы не можете напрямую подключать выводы кабеля RS232 к выводам микроконтроллера по двум причинам. Во-первых, чрезмерное напряжение, скорее всего, разрушит входы. Во-вторых, сигналы должны быть инвертированы по смыслу при перемещении между стандартами RS232 и сигналами логического уровня, используемыми UART ATMEGA. Вам нужен транслятор уровня или замена настоящего последовательного соединения на *логический уровень* USB-последовательный. Есть ли причина, по которой вы не можете использовать существующий последовательный интерфейс USB Arduino?, @Chris Stratton

Кроме того, "FFFFFFFA" скорее всего происходит от **sign exstension**, когда ошибочно подписанное байтовое значение неявно преобразуется в больший тип int. Вместо этого объявите переменную unsigned char., @Chris Stratton

@ChrisStratton Единственная проблема с работой с существующим последовательным интерфейсом USB заключается в том, что я не могу понять, как отправлять данные через USB с помощью C++. Было тривиально научиться отправлять данные через RS232, но я не могу найти никакой информации о том, как это сделать через USB. Кроме того, не возникнет ли конфликта, если я попытаюсь заставить одну программу писать COM5, пока терминал Arduino просматривает COM5?, @user50333

Существующий интерфейс USB эмулирует последовательный порт, поэтому вы будете использовать те же самые последовательные API, просто другое имя порта (то, которое вы используете для загрузки эскизов). Также убедитесь, что вы закрыли последовательный монитор Arduino, прежде чем пытаться общаться с ним из вашей программы., @Chris Stratton

Вы не отправляете его через USB, вы отправляете его через виртуальный COM-порт., @Ignacio Vazquez-Abrams

@ChrisStratton я этого не понял... ну спасибо! Это именно то, на что я надеялся!, @user50333