发个带有可选回车换行符输出的MEGA162的双UART程序给大家。
发送采用查询方式,接收采用中断方式。晶振7.3728M,无分频。unsigned char uartrbuffer; //uart接受缓存100字节
unsigned char uarttbuffer; //uart发送缓存50字节
int stringlon=0;
//UART0 initialisation
// desired baud rate:115200
// actual baud rate:115200 (0.0%)
// char size: 8 bit
// parity: Disabled
void uart0_init(void)
{
UCSR0B = 0x00; //disable while setting baud rate
UCSR0A = 0x00; //disable while setting baud rate
UBRR0L =0x03; //set baud rate
UBRR0H=0x00;
UCSR0C =(1<<URSEL0)|0b00000110;
UCSR0B=0b10011000; //enable
}
#pragma interrupt_handler uart0_rx_isr:20
void uart0_rx_isr(void)
{
//uart has received a character in UDR
uartrbuffer=UDR0;
stringlon++;
urflag=1;
if(stringlon>=100)
stringlon=0;
}
//UART1 initialisation
// desired baud rate: 4800
// actual: baud rate:4800 (0.0%)
// char size: 7 bit
// parity: Even
void uart1_init(void)
{
UCSR1B = 0x00; //disable while setting baud rate
UCSR1A = 0x00; //disable while setting baud rate
UCSR1C = 0b10100100;
UBRR1L =0x5F; //set baud rate
UBRR1H =0x00;
UCSR1B = 0b10011000; //enable
}
#pragma interrupt_handler uart1_rx_isr:21
void uart1_rx_isr(void)
{
//uart has received a character in UDR
uartrbuffer=UDR1;
stringlon++;
urflag=1;
if(stringlon>=100)
stringlon=0;
}
//*******************************************uart字符输出***************************
void putchar(int upart,unsigned char charx)
//upart表示UART标号,0表示UART0,其他表示UART1;char0表示要发出的数据;
{
if(upart==0)
{
while(!(UCSR0A&(1<<UDRE0)));
UDR0=charx;
}
else
{
while(!(UCSR1A&(1<<UDRE1)));
UDR1=charx;
}
}
//******************************************uart字符输出函数结束***************
//*******************************带可选回车换行的字符串输出函数******
//upart表示发出数据使用的端口号0表示使用UART0,其他表示使用UART1;
//*s表示要发出数据的指针
//senter0表示结尾是否使用0x0d,0表示使用,其他表示不使用
//senter1表示结尾是否使用0x0a,0表示使用,其他表示不使用
//stringl表示所要输出的字符串长度,0表示无限制
void puts(unsigned char *s,int upart,int senter0,int senter1,int stringl)
{
stringlon=0;
if(upart==0)
{
if(stringl==0)
{
while(*s)
{
outchar=*s;
putchar(0,outchar);
s++;
}
if(senter0==0)
putchar(0,0x0d);
if(senter1==0)
putchar(0,0x0a);
}
else
{
while(stringlon<=(stringl-1))
{
outchar=*(s+stringlon);
putchar(0,outchar);
stringlon++;
}
if(senter0==0)
putchar(0,0x0d);
if(senter1==0)
putchar(0,0x0a);
}
}
else
{
if(stringl==0)
{
while(*s)
{
outchar=*s;
putchar(1,outchar);
s++;
}
if(senter0==0)
putchar(1,0x0d);
if(senter1==0)
putchar(1,0x0a);
}
else
{
while(stringlon<=(stringl-1))
{
outchar=*(s+stringlon);
putchar(1,outchar);
stringlon++;
}
if(senter0==0)
putchar(1,0x0d);
if(senter1==0)
putchar(1,0x0a);
}
}
}
//************************************函数结束************************************
字符串输出函数使用方法:
比如要在UART0输出“OURAVR 我们的AVR!”,并且带有回车,换行符,
请使用如下语句:
puts("OURAVR 我们的AVR!",0,0,0,0);
如果要输出确定长度的字符串,则请这样使用:
比如要在UART1输出数组String中的10个字符,不带有回车换行符。
puts(String,1,1,1,10); 大家不要光看,光下哦!:)多提点意见啊,没意见也顶一下支持一下哦:)./emotion/em011.gif 帮你顶一下! 呵呵 谢谢ARMOK啦! icc的风格啊,我喜欢!哈哈 呵呵 就是用ICC做的哦! 写得好
正好满足需要 谢谢借鉴一下 谢谢 这个一定要顶一下。 非常感谢! UP一下 刚才仔细看了一下
void puts(unsigned char *s,int upart,int senter0,int senter1,int stringl)
//senter0表示结尾是否使用0x0d,0表示使用,其他表示不使用
//senter1表示结尾是否使用0x0a,0表示使用,其他表示不使用
其中senter0和senter1建议使用BOOLEAN类型,以增强程序的可读性;
typedef BOOLEAN unsigned char; 还有发送以及接收中断里的
if(stringlon>=100)
在发送中断里是不是应该为
if(stringlon>=50) 确实有错误,不好意思了。
帖子已经不能改了,后来的看到后注意下吧。 顶一个 顶一个,正好要用 我刚好也要写这段程序,谢谢,可受益拉 不错! 顶下! 写得很好,
学习了 怎么发送汉字呢? 直接写就可以啦,ICC的编译器会自己把汉字转成相应的ASCII码的,只要接收端能够接收显示中文就行了。 好帖。 收到!回去琢磨琢磨 学习了,正在找这样的资料 puts("OURAVR 我们的AVR!\r\n") 这么写不行吗? 能够发生的数据量太小了吧!能不能发个支持大数据量的啊!! 能够发生的数据量太小了吧!能不能发个支持大数据量的啊!! 厉害 谢谢,我是初学者,看到你的程序,学到了很多,我也会将这份爱心接力下去的,让后来的初学者有资源可学。
页:
[1]