1,串口通信数据接收不了
2,主函数中给LED变量赋值为0, 其他地方也改变过,但仿真时这个引脚输出为高电平
3,通信是按照$IIRSA,003.2(","后为数值),A,,V*+两位校验码+换行+回车 , 一共二十个字符
新手,刚接触,恳请大神们不吝赐教啊!
#include "pic.h" //PIC16F628A
__CONFIG(0x2138); //0011 1111 0011 1000 选择内部系统时钟、关看门狗、上电延时、RAM及ROM代码保护关
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
//串口通信相关变量定义
uchar comrxdread=0; //串口接收读指针
uchar comtxdread=0; //串口发送读指针
uchar comrxdwrite=0; //串口接收写指针
uchar comtxdwrite=0; //串口发送写指针
uchar comtxdbufempty=1; //串口的发送缓冲区空的标志
uchar comrxdtimeout=0; //串口接收超时
#define com_rxd_buffer_size 40 //接收缓冲区长度
#define com_txd_buffer_size 40 //发送缓冲区长度
uchar comrxdbuf[com_rxd_buffer_size]; //串口的接收缓冲区
uchar comtxdbuf[com_txd_buffer_size]; //串口的发送缓冲区
uchar combuf[com_rxd_buffer_size];
uchar send_timeout_count; //发送超时计数器
#define SEND_TIMEOUT 100 //发送定时:10*5ms
uchar sendtimeout;
#define COM_TIMEOUT 25 //串口接收超时
int angle_result=0,angle_result_old;
#define ANGLE_BUF_SIZE 8
uchar qian,bai,shi,ge;
//数码管显示变量定义
#define display_dat RA2
#define display_clk RA3
#define display_cs RA6
#define LED RA7
#define LED1 RA1 //用于发送
#define LED2 RA0
#define send_enable LED1=1;
#define send_disable LED1=0;
uchar display_count;
const uchar TABLE[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳
/*void DELAY() //延时程序
{
int i; //定义整形变量
for (i=1000;i--;); //延时
}*/
void init()
{
CMCON=0X07; //00000111B 关闭两个比较器
VRCON=0X00;
TRISA=0X20; //设置RA0-RA8为输出
TRISB=0X0B; //设置B口全为输出
LED1 = 0;
// LED2 = 1;
}
//*****************************************************************
//函数:timer1_init( )
//功能:定时器1初始化
//*****************************************************************
void timer1_init() //4M的晶体 T=(65536-初值)*(4/f)
{
TMR1ON=0;
TMR1H=0xFC; //定时1ms
TMR1L=0x18;
TMR1IF=0; //清除TMR0的中断标志
TMR1IE=1; //TMR1中断允许
TMR1CS=0; //TMR1工作于定时器方式
TMR1ON=1;
}
void uart_init()
{
SPBRG=0X33; //设置波特率为4800BPS
TXSTA=0X24; //使能串口发送,选择高速波特率 8位 异步 使能发送
RCSTA=0X90; //使能串口工作,连续接收 8位
RCIE=0X1; //使能接收中断
TXIE=0X1; //使能发送中断
GIE=0X1; //开放全局中断
PEIE=0X1; //使能外部中断
comtxdbufempty=1;
}
//****************************************************************
//函数:sendbyte_595()、light()
//功能:数码管显示
//*****************************************************************
void sendbyte_595(uchar data)
{
uchar i;
for(i=0; i<8; i++)
{
if(data & 0x80) display_dat = 1;
else display_dat = 0;
data <<= 1;
display_clk = 0;
display_clk = 1;
}
}
void light(uchar data1, uchar data2)
{
sendbyte_595(data1);
sendbyte_595(data2);
display_cs = 0;
display_cs = 1;
}
void interrupt usart(void)
{
if(TMR1IF) //定时器1中断
{
TMR1IF=0;
TMR1ON=0;
TMR1H=0xFC; //定时1ms
TMR1L=0x18;
send_timeout_count++;
if(send_timeout_count >= SEND_TIMEOUT) //串口查询定时1*100ms
{
sendtimeout = 1;
send_timeout_count = 0;
}
display_count++; //数码管显示
if(display_count >= 4) display_count = 0;
if(display_count == 0) //千
{
if(qian) light(0x01, TABLE[qian]);
else light(0x00, 0xFF);
}
else if(display_count == 1) //百
{
if(qian>0 || bai>0) light(0x02, TABLE[bai]);
else light(0x00, 0xFF);
}
else if(display_count == 2) //十
{
light(0x04, TABLE[shi] & 0x7F);
}
else if(display_count == 3) //个
{
light(0x08, TABLE[ge]);
}
TMR1ON=1;
}
if (RCIE&&RCIF) //接受中断
{
RCIE = 0;
comrxdbuf[comrxdwrite]=RCREG;
if(RCREG==0x0A) comrxdtimeout = 1; //接收到“回车”,即一个数据完成,要进行命令处理操作
comrxdwrite++;
if(comrxdwrite==com_rxd_buffer_size) comrxdwrite=0;
RCIE = 1;
}
}
//*****************************************************************
//函数:get_char( )
//功能:从串口缓冲区读取字符
//*****************************************************************
uchar get_char()
{
uchar temp;
temp=comrxdbuf[comrxdread++];
if(comrxdread==com_rxd_buffer_size) {comrxdread=0;}
return(temp);
}
void send_char(uchar ascii)
{
PEIE=0X0;//interrupt_disable;
comtxdbuf[comtxdwrite++]=ascii;
if(comtxdwrite==com_txd_buffer_size) comtxdwrite=0;
if(comtxdbufempty)
{
send_enable;
TXIE=0X1;
}
PEIE=0X1;//interrupt_enable;
}
/********************************************************************************
函数:process_command(void)
功能:命令处理程序
********************************************************************************/
void process_command(void) //命令处理子程序,返回命令处理结果serialmsg
{
uchar i,bytecrc,k;
comrxdtimeout = 0;
if(comrxdread != comrxdwrite) //串口数据的缓冲区中有数据,进入命令处理
{
i = 0;
bytecrc = 0;
while(comrxdread != comrxdwrite)
{
combuf[i] = get_char();
send_char(combuf[i]);
bytecrc ^= combuf[i];
i++;
if(combuf[i-1]==0x0A) break; //接收到“回车”
}
if (combuf[0]== '$' && combuf[3]=='R' && combuf[4]=='S')
{
angle_result=0;
for(k=7;k<i;k++)
{
if(combuf[k]==',')
{
break;
}
else
{
if(combuf[k]!='.') angle_result=angle_result*10+(combuf[k]-48);
else {angle_result=angle_result*10+(combuf[k+1]-48);break;}
}
}
if(angle_result>3600) angle_result=angle_result_old;
angle_result_old=angle_result;
qian=combuf[7]-48;
bai=combuf[8]-48;
shi=combuf[9]-48;
ge=(((combuf[11]-48)+1)*6)/10;
if(ge>5) ge=5;
}
else if (combuf[0]== '$' && combuf[6]=='*')
{
angle_result=(combuf[1]-48)*1000+(unsigned int)(combuf[2]-48)*100+(combuf[3]-48)*10+combuf[5]-48;
if(angle_result>3600) angle_result=angle_result_old;
angle_result_old=angle_result;
qian=combuf[1]-48;
bai=combuf[2]-48;
shi=combuf[3]-48;
ge=(((combuf[5]-48)+1)*6)/10;
if(ge>5) ge=5;
}
}
}
void main()
{
init();
timer1_init();
uart_init();
send_disable;
LED=0;
while(1)
{
if(comrxdtimeout) //接收到0x0A
{
process_command();
}
}
}
|