AVR usart与arduino通信

时间:2013-09-29 00:54:24

标签: serial-port arduino avr

我正在尝试在ATMEGA8515和Arduino Uno之间建立基本的串行通信链接。我是Putty连接到正确的com端口我可以看到Arudino打印“got:got:”突然两次出现延迟。所以问题在于Arduino正在认识到某些东西正在传播但没有得到任何角色。

我一直在尝试使用主循环中datasheet的第143页上的传输代码:

int main(void)
{
    //Baud is 9600
    USART_Init(USART_BAUDRATE); 
    //init interrupt
    sei();

    DDRA |= _BV(DDA6); 
    while(1)
    {
        USART_Transmit("a\n");
        _delay_ms(5000);
    }
}

尝试使用从here获取的代码来接收序列:

char val; // variable to receive data from the serial port
void setup() {
  Serial.begin(9600);       // start serial communication at 9600bps
}
void loop() {
  if( Serial.available() )       // if data is available to read
  {
    val = Serial.read();         // read it and store it in 'val'
    Serial.print("got:"+val);
  }

  delay(100);                    // wait 100ms for next reading
}

这导致“got:”每5秒打印两次: enter image description here

我将一个LED连接到AVR的TX线,可以看到它的传输时间。 AVR的TX线连接到arduino的RX线和AVR RX的相同功能。

任何想法为什么我看不到我想传递的字符?

有一件奇怪的事情是,RX灯永远不会在Arduino上眨眼,这使得它似乎没有得到任何东西,但TX总是在打印到com端口时闪烁。

编辑: 这是我用于传输的代码:

void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) )
;
/* Put data into buffer, sends the data */
UDR = data;
}

并将我的主要代码更改为USART_Transmit("a"); 我也在arduino上尝试Serial.print(val, HEX);打印0s。

4 个答案:

答案 0 :(得分:2)

在循环中设置延迟()并不是一个好习惯,更不用说如果您希望接收串行数据了。

对于您的arduino代码,您应该使用Serial.available()函数,而不是在收到串行数据后依赖serialEvent()运行。

您只需要实现此功能

void serialEvent() {
    //write your code here
}

请记住,只要串行数据通过相应的串行端口到达,就会调用此函数。

对于arduino mega,由于有多个串口,您还可以使用serialEvent1()serialEvent2()serialEvent3()

了解目前这些功能与Esplora,Leonardo或Micro不兼容也很重要。

您可以在arduino reference

中详细了解相关信息

这是example

答案 1 :(得分:2)

问题是波特率是错误的。

在示波器上测量后,我发现它是错误的。我使用了波特率预分频器:

#define BAUD_PRESCALE ( (F_CPU / (USART_BAUDRATE * 16UL)) - 1 )  

这给了我垃圾字符,但朝着正确的方向迈出了一步。然后我把波特打到了2400,得到了我想要打印到腻子的字符和字符串。

答案 2 :(得分:0)

This page对使用字符串+运算符有一些警告。无法正常工作的示例看起来像你的。

尝试

String got = "got:";
Strint toPrint = got + val;
Serial.print(toPrint);

答案 3 :(得分:0)

尝试将val打印为十六进制或十进制值。您可能正在尝试打印不可打印的字符。

Serial.print(val, HEX);
Serial.print(val, DEC);