打印
[PIC®/AVR®/dsPIC®产品]

PIC18F25K22串口发送问题

[复制链接]
1816|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yuan286|  楼主 | 2015-4-17 14:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/中断响应
void interrupt ISR(void)
{
  
  if(RC2IF) //串口2中断处理
        {
       recv_buff[recv_pt++]=RCREG2;    //所有数据接收下来       
           recv_cnt=0;                               //超时计数器清0
           if(recv_pt>=USART_RECV_MAX)recv_pt=0;       //防止溢出
    }
  if(TMR0IF)          //定时器溢出中断
    {
        TMR0IF = 0;                          //清除T0IF      
                TMR0=0xF3; //20ms
                asm("nop");
                asm("nop");
                time_us++;
    }
}
void senddata1(uchar byte)
{       
        while(!TRMT2)          //串口2的发送中断标记      
                continue;
        TXREG2 = byte;
}
void comm_recv(uint time)
{
uint crc_num;
static uchar cnter=0;   
uchar send_arr[50],i;

if(cnter!=time)  //20ms
        {
        cnter=time;
        //通过时间超时 判断串口2接收完毕
        if(recv_ok==0)
                {
                if(recv_pt>0)
                        {
                        recv_cnt++;
                        if(recv_cnt>=USART_OVER_TIME)   //100ms  超时 表面接收完成
                                {
                                recv_cnt=0;
                                recv_ok=1;    //接收完成标记
                                }
                        }
                }
        if(OERR2==1)  //溢出错误
                {
                CREN2=0;Delay(10);CREN2=1;  //清除溢出错误
                }

        if(recv_ok==1)
                {
         
                    crc_num=crc16(recv_buff,recv_pt-2);   //计算CRC16值
                        if(recv_buff[0]==0xAA)//开头正确  AA
                                {
                                if(recv_buff[1]==0xBB)         
                                        {
                    senddata1(13);//发送温度
                    senddata1(13);//发送土壤湿度
                    
                                        if(recv_buff[2]==0xCC)         
                                                {
                         senddata1(real_light/256);//发送光照
                         senddata1(real_light%256);
                                                }
                                        if(recv_buff[3]==0xDD)        
                                                {
                                                senddata1(real_CO2/256);//发送CO2浓度
                        senddata1(real_CO2%256);
                                                }
                                        if(recv_buff[4]==0XEE)       //发送小时、分钟、秒
                                                {

                                                senddata1(13);      
                        senddata1(nowtime.minute);
                        senddata1(nowtime.second);
                                                }
                                        }
                                }
                       
                recv_ok=0;
                recv_pt=0;
                }
        }
}
这是中断接收和发送程序,上位机发送指令后,收到指令发送对应的数据,可是senddata1(13);时上位机接收到的确实0A也就十,发送其他数据都好的,就是唯独13,求解啊。。。
沙发
JY-DX-JY| | 2015-4-17 19:07 | 只看该作者
13貌似回车还是换行。10可以吗?

使用特权

评论回复
板凳
yuan286|  楼主 | 2015-4-18 08:50 | 只看该作者
JY-DX-JY 发表于 2015-4-17 19:07
13貌似回车还是换行。10可以吗?

发送10接收到的是0A就是,可以的

使用特权

评论回复
地板
秋雨| | 2016-3-22 11:02 | 只看该作者
请问楼主这个问题解决了吗?我现在遇到串口2一直在接收数据的问题。上位机没发也接收,检查硬件没有输入,是不是与debug有关?
由于第二串口和调试口重合,因此调试情况下肯定不能用第二串口,我现在用KIT3烧录程序后拔掉kit3的话,第二串口发送没问题,但是接受却不对,总是一直在不停的收到数据,实际并没有数据进来(测量串口输入管脚一直为高电平,没有信号)。是不是debug的问题?烧录程序选择kit3的话,配置中 DEBUG = OFF是不是不管用?只要使用kit3的话debug就关不掉吧?是不是用并口烧录器的话应该能关掉debug吧?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

7

帖子

1

粉丝