打印

只能发送不能接受

[复制链接]
420|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
supernan|  楼主 | 2020-1-12 10:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
PIC18F24K22串口1和串口2 都只能发送,不能接受,求问什么问题?

使用特权

评论回复
沙发
chenho| | 2020-1-12 10:32 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
板凳
supernan|  楼主 | 2020-1-12 10:36 | 只看该作者
void main(void) {
    uart1_init();                //串口1初始化
    //uart2_init();                //串口2初始化
    Uart1RxCallBack((void *)Ut1Recv);
    //Uart2RxCallBack((void *)Ut2Recv);
    GIE=0X1;                    //开放全局中断
    PEIE=0X1;                   //使能外设中断
    RCIE=0X1;                   //使能接收中断

    TRISC2 = 0;
    //Uart1PollPutc(&aa, 5);
    RC2 = 0;
    delay(500);
    RC2 = 1;
    delay(500);
    RC2 = 0;
    while(1)
    {
        //Uart2PollPutc(&aa, 5);
        //delay(5000);

        NetCmdExe();      
    }
}
static srlrxcexe uart1callback = NULL;
static srlrxcexe uart2callback = NULL;

void Uart1RxCallBack(void *fun)
{
        uart1callback = (srlrxcexe)fun;
}
void Uart2RxCallBack(void *fun)
{
        uart2callback = (srlrxcexe)fun;
}

void uart1_init()
{
    BAUDCONbits.ABDEN =0;    //关闭自动波特率检测
    BAUDCONbits.BRG16 = 1;  //选择波特率生成器为16方式
    TXSTA1bits.BRGH = 1;    //选择高速波特率方式
    TXSTA1bits.SYNC=0;      //选择异步方式
    SPBRGH1=0;
    SPBRG=0x44; //设置波特率为115200BPS, 115200 = 32M/4(0x44+1))  
    TRISC7 = 1;
    TRISC6 = 1;
    TXSTA1bits.TXEN=1;
    RC1IE = 1;
    RCSTA1=0x90; //串口工作使能,连续接收
}

void uart2_init()
{
    INTCONbits.RBIE = 0;
    BAUDCON2bits.ABDEN =0;    //关闭自动波特率检测
    BAUDCON2bits.BRG16 = 1;  //选择波特率生成器为16方式
    TXSTA2bits.BRGH = 1;    //选择高速波特率方式
    TXSTA2bits.SYNC=0;      //选择异步方式
    SPBRGH2=0;
    SPBRG2=0x44; //设置波特率为115200BPS, 115200 = 32M/4(0x44+1))
    TRISB7 = 1;
    TRISB6 = 1;
    TXSTA2bits.TXEN=1;
    RC2IE = 1;
    RCSTA2=0x90; //串口工作使能,连续接收
}

void uart1_send(unsigned char data)
{
    int index;
    for (index = 0; index < 1000; index++)//检测发送器是否为空
    {
        if (TXSTA1bits.TRMT == 1)  // 发送移位寄存器状态位 1 = TSR 空  0 = TSR 满
            break;
    }
    TXREG1 = data; //把数据写入缓冲区
    for (index = 0; index < 1000; index++)//等待发送完毕
    {
        if (TX1IF == 1)  
            break;
    }
    //TX1IF=0;                                                //发送中断清零
}

void uart2_send(unsigned char data)
{
    int index;
    for (index = 0; index < 1000; index++)//检测发送器是否为空
    {
        if (TXSTA2bits.TRMT == 1)  // 发送移位寄存器状态位 1 = TSR 空  0 = TSR 满
            break;
    }
    TXREG2 = data; //把数据写入缓冲区
    for (index = 0; index < 1000; index++)//等待发送完毕
    {
        if (TX2IF == 1)  
            break;
    }
    //TX1IF=0;                                                //发送中断清零
//    TXREG2 = data;
//    while(TXSTA2bits.TRMT==0);// loop
}

unsigned int Uart1PollPutc(unsigned char *buf, unsigned int size)
{
        unsigned char i;
        for (i = 0; i < size; i++)
        {
        uart1_send(*buf);
                buf++;
        }
        return 1;   
}

unsigned int Uart2PollPutc(unsigned char *buf, unsigned int size)
{
        unsigned char i;
        for (i = 0; i < size; i++)
        {
        uart2_send(*buf);
                buf++;
        }
        return 1;   
}

void interrupt usart(void)
{
   if(RC1IE&&RC1IF)            //判断是否为串口1接收中断
   {
       //TXREG=RCREG;           //把接收到的数据发送回去
       if (uart1callback)
       {
           uart1callback(RCREG1);        
       }
   }
   if(RC2IE&&RC2IF)            //判断是否为串口2接收中断
   {
       //TXREG=RCREG;           //把接收到的数据发送回去
       if (uart2callback)
       {
           uart2callback(RCREG2);        
       }
   }
}

使用特权

评论回复
地板
bqyj| | 2020-1-12 10:39 | 只看该作者
关闭RX端口上的模拟输入功能吗?

使用特权

评论回复
5
songqian17| | 2020-1-12 10:44 | 只看该作者
哈哈,我的却只能接收不能发送,,,

使用特权

评论回复
6
liuzaiy| | 2020-1-12 10:48 | 只看该作者

TRISCbits.TRISC6=0;          //将该脚配置为TX
TRISCbits.TRISC7=1;           //将该脚配置为RX

使用特权

评论回复
7
ousj| | 2020-1-12 10:52 | 只看该作者
我的也是只能发不能收。不过mcu型号不同。楼主解决了?

使用特权

评论回复
8
songqian17| | 2020-1-12 10:55 | 只看该作者

;Uart初始化   
Uart_Init
BANKSEL    TRISC
    MOVLW   B'10111111'             ;PORTC.6 RXD PORTC.7 TXD
    MOVWF   TRISC   
BANKSEL    BAUDCON1
    MOVLW   B'00001000'
    MOVWF   BAUDCON1                  
BANKSEL    RCSTA1   
    MOVLW   B'10010000'                    
    MOVWF   RCSTA1                    ;串口1使用16位波特率
    MOVLW   B'00100000'
    MOVWF   TXSTA1
    MOVLW   .35
    MOVWF   SPBRG1
    MOVLW   00H
    MOVWF   SPBRGH1   
    RETURN  

使用特权

评论回复
9
supernan|  楼主 | 2020-1-12 10:58 | 只看该作者
解决了
串口1是RC7/RX没有设为数字通道,关闭RC7的模拟功能就可以了,串口2是可以的,是我的485串口工具有问题

使用特权

评论回复
10
happy_10| | 2020-1-12 11:06 | 只看该作者

呵呵,解决了就好啊,很有效率的嘛

使用特权

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

本版积分规则

730

主题

10412

帖子

6

粉丝