Связь RS-232 с использованием Arduino Duemilanove и интерфейса Cutedigi RS-232 - PullRequest
2 голосов
/ 04 декабря 2011

У меня возникли проблемы с тем, чтобы мой микроконтроллер Arduino считывал сигналы RS-232 . Мой проект требует, чтобы я прочитал данные, которые выводятся монитором качества воздуха.

Мои компоненты:

Чтобы проверить, работает ли последовательная связь должным образом, я нашел пример кода на веб-сайте Arduino. Это точный код, который я использую:

//Created August 23 2006
//Heather Dewey-Hagborg
//http://www.arduino.cc

#include <ctype.h>

#define bit9600Delay 84
#define halfBit9600Delay 42
#define bit4800Delay 188
#define halfBit4800Delay 94

byte rx = 0;
byte tx = 1;
byte SWval;

void setup() {
    pinMode(rx,INPUT);
    pinMode(tx,OUTPUT);
    digitalWrite(tx,HIGH);
    digitalWrite(13,HIGH); //turn on debugging LED
    SWprint('h');  //debugging hello
    SWprint('i');
    SWprint(10); //carriage return
}

void SWprint(int data)
{
    byte mask;
    //startbit
    digitalWrite(tx,LOW);
    delayMicroseconds(bit9600Delay);
    for (mask = 0x01; mask>0; mask <<= 1) {
        if (data & mask){ // choose bit
            digitalWrite(tx,HIGH); // send 1
        }
        else{
            digitalWrite(tx,LOW); // send 0
        }
        delayMicroseconds(bit9600Delay);
    }
    //stop bit
    digitalWrite(tx, HIGH);
    delayMicroseconds(bit9600Delay);
}

int SWread()
{
    byte val = 0;
    while (digitalRead(rx));
    //wait for start bit
    if (digitalRead(rx) == LOW) {
        delayMicroseconds(halfBit9600Delay);
        for (int offset = 0; offset < 8; offset++) {
            delayMicroseconds(bit9600Delay);
            val |= digitalRead(rx) << offset;
        }
        //wait for stop bit + extra
        delayMicroseconds(bit9600Delay);
        delayMicroseconds(bit9600Delay);
        return val;
    }
}

void loop()
{
    SWval = SWread();
    SWprint(toupper(SWval));
}

Я изменил контакты RX и TX на 0 и 1 соответственно, потому что именно эти контакты использует чип Cutedigi RS-232. Теперь, когда я открываю окно терминала и набираю символы, я получаю искаженные символы и буквы (например: ¾_ò_òòËÌßÌËßÌÊÌòyofyofsæóÙöÇ æü æ).

В соответствии с примером веб-сайта кода, если я наберу abcdefg, в окне терминала должно появиться ABCDEFG.

Почему это так? Я установил скорость передачи 9600, как указано в sketch , но проблемы все еще возникают. Сброс Arduino, похоже, тоже не помогает - я все еще получаю искаженный текст.

1 Ответ

2 голосов
/ 08 января 2012

Я понял, в чем проблема.

Оказывается, я пытался соединить два устройства DCE вместе, что означает, что для замены контактов TX / RX на кабеле был необходим нуль-модемный адаптер. Раньше я использовал простую смену пола, но именно это вызывало у меня проблемы.

Попробуйте получить адаптер нуль-модема, если у вас возникли подобные проблемы.

...