Странная серийная ошибка - PullRequest
2 голосов
/ 18 февраля 2010

Хорошо, у меня есть 3 устройства.

  • микроконтроллер AVR Butterfly, настроенный с помощью USART
  • Bifferboard, на котором запущен Debian, с использованием специально созданной программы для последовательного интерфейса.
  • Настольный компьютер под управлением Br@y's.

Итак, я пытаюсь заставить Bifferboard отправлять серийный номер в AVR, но AVR никогда не получает сигнал (мы проверили провода). Но если я подключу AVR к настольной коробке и отправлю с Br @ y, он получит просто отлично.

Если я подключу Bifferboard к рабочему столу, Br @ y получит очень хорошо.

Вот код для Bifferboard.

#include "string2num.h" //a custom header
#include <cstdlib>
#include <iostream>
#include <SerialStream.h>
using namespace LibSerial;
//using namespace std;



int main(int argc, char*argv[])
{
        if (argc<2)
        {
                std::cout<<argv[0]<<" requires the device name eg \'dev/tty0\' as a parameter\nterminating.\n";
                return 1;
        }

        SerialStream theSerialStream(argv[1]); //open the device
        if(!theSerialStream.IsOpen()) //did the device succesfuilly open
        {       //open faile
                std::cerr<<"Open " << argv[1] << " failed\n Terminating.\n";
                return 1; //exit failure
        }

        theSerialStream.SetVMin(0);//no min number of characters to send
        theSerialStream.SetVTime(0);// don't wait betwenn characters

        theSerialStream.SetBaudRate( SerialStreamBuf::BAUD_19200);
        theSerialStream.SetCharSize(SerialStreamBuf::CHAR_SIZE_8); //8
        theSerialStream.SetParity(SerialStreamBuf::PARITY_NONE);//   N
        theSerialStream.SetNumOfStopBits(1);//                       1

        theSerialStream.SetFlowControl(SerialStreamBuf::FLOW_CONTROL_NONE);


        std::cout<<"Ready for serial trasmission. Press Ctrl+C to quit\n";
        //insert basic instructions here

        while (1)
        {
                char input[BUFSIZ];

                std::cin>>input;

                char* values=getAllValues(input); //DECODE any formatting (this function is in the custom header)
                std::cout<<"about to transmit: " << values << "\n";

                theSerialStream << values;
                free(values);
        }
        theSerialStream.Close();
        return 0;



}

Я также пытался использовать Minicom от Bifferboard - он может общаться с настольным Windows-компьютером, но не с AVR.

Ответы [ 3 ]

2 голосов
/ 18 февраля 2010

(мы проверили провода)

Это все еще звучит как проблема с кабелями. Если Br @ y может общаться с обоими, то это не проблема конфигурации. Вы должны включить логический анализатор или осциллограф на приемный вывод (и, возможно, проверить другие контакты) AVR и посмотреть, что происходит с помощью электричества, когда вы пытаетесь отправить данные с Bifferboard.

Могу поспорить, что вы видите данные на каком-то другом штифте. Но я бы не стал сильно рисковать, потому что подключение по последовательному интерфейсу RS232 очень утомительно.

2 голосов
/ 18 февраля 2010

Это длинный выстрел, но все ли последовательные порты работают с одинаковыми уровнями напряжения? Я вижу, что у Bifferboard есть UART 3.3 В, тогда как у AVR есть преобразователь уровня. Порт рабочего стола может быть более гибким в отношении напряжения.

0 голосов
/ 22 февраля 2010

Я выброшу еще одну возможность "дальнего удара".В зависимости от чипа приемопередатчика, используемого на плате, он может не иметь возможности генерировать свое собственное отрицательное напряжение питания (обычно через зарядный насос) для уровней RS232.Некоторые чипы «украдут» свои отрицательные запасы с другой стороны линии, и это прекрасно работает, если вы говорите с чем-то вроде ПК.Однако, если обе стороны придерживаются этого подхода, он не сработает.Трансиверы, такие как MAX232 (плюс внешние колпачки и резисторы) будут генерировать свое собственное отрицательное напряжение, а чипы, такие как DS275, - нет.

...