[讨论] 一个简单易懂的串口通讯例子程序

黑衣人   2008-1-23 12:11 楼主
只有基本的功能,用于串口操作的演示,如果需要结构化的程序,到http://www.avrvi.com/avr_examples/usart.html RS232电路图 本程序在本站的开发板上通过,绝对没有问题,欢迎讨论。 测试效果,启动时发送http://www.avrvi.com加回车换行,然后,收到什么,返回什么,如果给它发送一个小a,会多发回一个OK,如果发的是大A,则发回Hello字符串。 串口程序测试

回复评论 (10)

回复: 一个简单易懂的串口通讯例子程序

// ICC-AVR application builder : 2007-5-20 17:21:25 // Target : M16 // Crystal: 7.3728Mhz // AVR mega16 串口测试 // AVR与虚拟仪器 http://www.avrvi.com 古欣 #include <iom16v.h> #include <macros.h> #define F_CPU 7372800 const unsigned char buffer[]="http://www.avrvi.com"; void USART_Init( unsigned int baud ) { unsigned int tmp; /* 设置波特率*/ tmp= F_CPU/baud/16-1; UBRRH = (unsigned char)(tmp>>8); UBRRL = (unsigned char)tmp; /* 接收器与发送器使能*/ UCSRB = (1<<RXEN)|(1<<TXEN); /* 设置帧格式: 8 个数据位, 2 个停止位*/ UCSRC = (1<<URSEL)|(1<<USBS)|(1<<UCSZ0)|(1<<UCSZ1); } /* UMSEL 模式选择 0 异步操作 1 同步操作 USBS 停止位位数 0 1 1 2 UCSZ2 UCSZ1 UCSZ0 字符长度 0 0 0 5 位 0 0 1 6 位 0 1 0 7 位 0 1 1 8 位 1 0 0 保留 1 0 1 保留 1 1 0 保留 1 1 1 9 位 */ // ICC 生成的初始化 //UART0 initialize // desired baud rate: 9600 // actual: baud rate:9600 (0.0%) // char size: 8 bit // parity: Disabled void uart0_init(void) { UCSRB = 0x00; //disable while setting baud rate UCSRA = 0x00; UCSRC = BIT(URSEL) | 0x06; UBRRL = 0x2F; //set baud rate lo UBRRH = 0x00; //set baud rate hi UCSRB = 0x18; } //下面两个函数直接从数据手册上拷贝过来的 // 数据发送【发送5 到8 位数据位的帧】 void USART_Transmit( unsigned char data ) { /* 等待发送缓冲器为空 */ while ( !( UCSRA & (1<<UDRE)) ) ; /* 将数据放入缓冲器,发送数据 */ UDR = data; } // 数据接收【以5 到8 个数据位的方式接收数 据帧】 unsigned char USART_Receive( void ) { /* 等待接收数据*/ while ( !(UCSRA & (1<<RXC)) ) ; /* 从缓冲器中获取并返回数据*/ return UDR; } //连续发送字符 void USART_Transmit_2( void ) { while ( !( UCSRA & (1<<UDRE)) ) ; UDR = 'H'; while ( !( UCSRA & (1<<UDRE)) ) ; UDR = 'e'; while ( !( UCSRA & (1<<UDRE)) ) ; UDR = 'l'; while ( !( UCSRA & (1<<UDRE)) ) ; UDR = 'l'; while ( !( UCSRA & (1<<UDRE)) ) ; UDR = 'o'; } void main(void) { unsigned char n=0,tmp=0; USART_Init(9600); //波特率9600 初始化串口 // uart0_init(); for(i=0;n<20;n++) //发送数组里面的字符串,http://www.avrvi.com { USART_Transmit(buffer[n]); } USART_Transmit(0x0d); //发送一个回车 USART_Transmit(0x0a); //发送一个换行 while(1) { if(UCSRA&(1<<RXC)) //如果接收缓存区有数据 { tmp=USART_Receive(); //接收数据 USART_Transmit(tmp); //发送数据 if(tmp=='a') //对接收到的数据进行,如果是a,再发一个OK回来 { USART_Transmit('O'); USART_Transmit('K'); } if(tmp=='A') //对接收到的数据进行,如果是A,再发一个Hello回来 { USART_Transmit_2(); } } } }
点赞  2008-1-23 12:11

回复:一个简单易懂的串口通讯例子程序

幸福或许不排名次,但成功必排名次
点赞  2008-2-14 11:26
DING.........
点赞  2008-10-27 21:18
KKKKKKKKKKKKKKKKKKKKKKKKKKKKK
点赞  2008-11-26 15:36
好东西怎么没有人支持啊
点赞  2008-11-26 17:27

Re: 一个简单易懂的串口通讯例子程序

好东西怎么没有人支持啊
点赞  2009-4-8 18:05

Re: 一个简单易懂的串口通讯例子程序

你的高层协议能说说吗?
点赞  2009-4-17 17:23

Re: 一个简单易懂的串口通讯例子程序

比如:FF XXXXXXX ~~~FF
点赞  2009-4-17 17:24
支持楼主,顶一个先!
点赞  2009-7-16 22:53
支持楼主,顶一个先!
点赞  2010-1-6 15:53
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复