📄 serial._c
字号:
//ICC-AVR application builder : 2007-10-18 21:13:05
// Target : M8
// Crystal: 8.0000Mhz
#include <iom8v.h>
#include <macros.h>
#include <string.h>
#include "serial.h"
#include "main.h"
//UART0 initialize
// desired baud rate: 110
// actual: invalid baud rate
SERIAL_PORT_STATUS com_status;
char recv_buf[RECV_BUFLEN];
char send_buf[SEND_BUFLEN];
void uart0_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = BIT(URSEL) | 0x06;
UBRRL = 0x03; //set baud rate lo
UBRRH = 0x00; //set baud rate hi
UCSRB = 0x98;
com_status.read_start_ptr=recv_buf;
com_status.read_end_ptr=recv_buf;
com_status.recv_cur_ptr=recv_buf;
com_status.send_cur_ptr=send_buf;
com_status.sending=0;
}
#pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
void uart0_rx_isr(void)
{
char c;
c=UDR;
if (sysoption.echo){
if (c=='\r') c='\n';
UDR=c;
}
if (c==0) return;
*com_status.recv_cur_ptr++=c;
if (com_status.recv_cur_ptr==recv_buf+RECV_BUFLEN)
com_status.recv_cur_ptr=recv_buf;
if (c==LINE_END_CHAR) {
com_status.read_end_ptr=com_status.recv_cur_ptr;
}
}
#pragma interrupt_handler uart0_udre_isr:iv_USART0_UDRE
void uart0_udre_isr(void)
{
UDR=*com_status.send_cur_ptr++;
if (*com_status.send_cur_ptr==0 || com_status.send_cur_ptr==send_buf+SEND_BUFLEN){
UCSRB&=~0x20;
com_status.sending=0;
}
}
void serial_send(char *buf)
{
if (*buf==0) return;
while (com_status.sending);
strcpy(send_buf,buf);
com_status.send_cur_ptr=send_buf;
com_status.sending=-1;
UCSRB|=0x20;
}
unsigned int serial_recv(char *buf,unsigned int buflen)
{
unsigned int len=0;
if (com_status.read_start_ptr==com_status.read_end_ptr) return 0;
while(com_status.read_start_ptr!=com_status.read_end_ptr && len<buflen-1){
*buf++=*com_status.read_start_ptr++;
len++;
if (com_status.read_start_ptr==recv_buf+RECV_BUFLEN)
com_status.read_start_ptr=recv_buf;
}
*(--buf)=0;
return --len;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -