奇怪的串行误传

时间:2010-02-18 15:33:24

标签: c++ serial-port debian avr libserial

好的,所以我有3台设备。

  • AVR Butterfly微控制器,使用USART设置
  • 一个运行Debian的Bifferboard,使用自定义的串行程序。
  • 运行Br @ y的桌面计算机。

所以我试图让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;



}

我也尝试过使用Bifferboard中的minicom - 它可以与桌面Windows机器通信,但不能与AVR通信。

3 个答案:

答案 0 :(得分:2)

这是一个很长的镜头,但所有的串口都运行在相同的电压水平?我看到双板有一个3.3V的UART,而AVR有一个电平转换器。桌面端口可能对电压更加灵活。

答案 1 :(得分:2)

  

(我们检查了电线)

这仍然听起来像布线问题。如果Br @ y可以与两者通信,那么它似乎不是配置问题。您应该在AVR的接收引脚(可能探测其他引脚)上放置一个逻辑分析仪或示波器,并在尝试从Bifferboard发送数据时查看发生的电气情况。

我敢打赌,你会看到其他针​​脚的数据。但我不会打赌很多,因为串行RS232连接是一件非常敏感的事情。

答案 2 :(得分:0)

我会抛弃另一种“远射”的可能性。根据电路板上使用的收发器芯片,它可能无法为RS232电平产生自己的负电源电压(通常通过电荷泵)。一些芯片会从线路的另一端“窃取”它们的负电源,如果你正在谈论像PC这样的东西,它会很有效。然而,如果双方采取这种方法,那么它就不会那么有效。像MAX232这样的传感器(加上外部电容和电阻)会产生自己的负电源,但像DS275这样的芯片却没有。