×
单片机 > 单片机程序设计 > 详情

AVR单片机教程——串口接收

发布时间:2024-05-16 发布时间:
|

上一讲中,我们实现了单片机开发板向电脑传输数据。在这一讲中,我们将通过电脑向单片机发送指令,让单片机根据指令控制LED。这一次,两端的TX与RX需要交叉连接,单片机TX连接串口工具RX也是需要的,因为程序会根据指令反馈信息。


为了简单起见,我们的程序只需要控制4个板载LED。指令包含两个字节:第一个字节为r、y、g、b中的一个,分别表示红、黄、绿、蓝灯;第二个字节为0或1,表示灯不亮或亮。


然而,a2这样的指令是没有意义的,却是可能出现的。即使用户已经熟悉了这8条指令,也可能会不小心打错。我们应当记住,用户是世界上最愚蠢的人,我们要把他们可能犯的错误都想到,然后在程序中合理地处理。比如,对于不合法的指令,程序忽略指令,并返回What?给电脑;对于合法的,则执行并返回Done!。


#include

#include


int main(void)

{

led_init();

uart_init(UART_DUPLEX);

char temp[3];

while (1)

{

uart_scan_string_n(temp, 2);

bool good = true;

led_t led;

switch (temp[0])

{

case 'r': led = LED_RED ; break;

case 'y': led = LED_YELLOW; break;

case 'g': led = LED_GREEN ; break;

case 'b': led = LED_BLUE ; break;

default: good = false; break;

}

bool on;

switch (temp[1])

{

case '0': on = false; break;

case '1': on = true ; break;

default: good = false; break;

}

if (good)

{

led_set(led, on);

uart_print_string("Done!n");

}

else

uart_print_string("What?n");

}

}


while循环的周期是多少呢?没有delay语句,是不是循环在很快地扫描呢?不是,uart_scan_string_n函数一直等待直到串口接收到了规定量的数据。


实际上,这一系列串口接收的函数的功能非常受限——程序必须等待数据到来,不能错过它,这与scanf等函数从缓冲区读取数据不同。当然,单片机系统中的串口输入(以及输出)也可以实现缓冲区,并且是一种实用并常用的做法,但这要涉及到中断,是以后的内容。你可以试着利用数据手册以及其他资源实现一个带缓冲的串口输入输出。在avr-gcc中,使用中断要先#include ,串口接收中断写为ISR(USART0_RX_vect) { }。


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
基于AT91M42800A的LED显示系统设计