我正在尝试在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秒打印两次:
我将一个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。
答案 0 :(得分:2)
在循环中设置延迟()并不是一个好习惯,更不用说如果您希望接收串行数据了。
对于您的arduino代码,您应该使用Serial.available()
函数,而不是在收到串行数据后依赖serialEvent()
运行。
您只需要实现此功能
void serialEvent() {
//write your code here
}
请记住,只要串行数据通过相应的串行端口到达,就会调用此函数。
对于arduino mega,由于有多个串口,您还可以使用serialEvent1()
,serialEvent2()
,serialEvent3()
。
了解目前这些功能与Esplora,Leonardo或Micro不兼容也很重要。
中详细了解相关信息这是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);