0

我正在尝试在ATMEGA8515和 Arduino Uno之间建立基本的串行通信链路。我是与正确 com 端口的 Putty 连接,我可以看到 Arudino 打印“got:got:”,有两个延迟。所以问题是 Arduino 正在识别正在传输的东西但没有得到任何字符。

我一直在尝试在我的主循环中使用数据表第 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);
    }
}

并尝试使用从此处获取的此代码接收序列:

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 秒打印两次: 在此处输入图像描述

我将一个 LED 连接到 AVR 的 TX 线上,可以看到它何时发射。AVR 的 TX 线连接到 arduino 的 RX 线和 AVR RX 的相同方式。

有什么想法为什么我看不到我要传输的字符?

一件奇怪的事情是 Arduino 上的 RX 灯从不闪烁,这使它看起来什么都没有,但 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"); 我还尝试 Serial.print(val, HEX);了打印 0 的 arduino。

4

4 回答 4

2

在循环中使用 delay() 不是一个好习惯,如果您希望接收串行数据,那就更不用说了。

对于您的 arduino 代码,Serial.available()您应该使用serialEvent()function.

你只需要实现这个功能

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

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

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

同样重要的是要知道,目前这些功能与 Esplora、Leonardo 或 Micro 不兼容。

您可以在arduino 参考中阅读更多相关信息

这是一个例子

于 2013-09-29T23:49:32.693 回答
2

问题是波特率是错误的。

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

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

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

于 2013-10-03T18:38:12.140 回答
0

此页面有一些关于使用字符串运算符的警告+。不能正常工作的例子看起来像你的。

尝试

String got = "got:";
Strint toPrint = got + val;
Serial.print(toPrint);
于 2013-09-29T04:20:30.713 回答
0

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

Serial.print(val, HEX);
Serial.print(val, DEC);
于 2013-09-29T15:11:17.523 回答