[PIC®/AVR®/dsPIC®产品] PIC18F24K22串口1和串口2 都只能发送,不能接受,求问什么问题?代码如下

[复制链接]
 楼主| miaoshanfa 发表于 2017-4-5 20:20 | 显示全部楼层 |阅读模式
  1. void main(void) {
  2.     uart1_init();                //串口1初始化
  3.     //uart2_init();                //串口2初始化
  4.     Uart1RxCallBack((void *)Ut1Recv);
  5.     //Uart2RxCallBack((void *)Ut2Recv);
  6.     GIE=0X1;                    //开放全局中断
  7.     PEIE=0X1;                   //使能外设中断
  8.     RCIE=0X1;                   //使能接收中断

  9.     TRISC2 = 0;
  10.     //Uart1PollPutc(&aa, 5);
  11.     RC2 = 0;
  12.     delay(500);
  13.     RC2 = 1;
  14.     delay(500);
  15.     RC2 = 0;
  16.     while(1)
  17.     {
  18.         //Uart2PollPutc(&aa, 5);
  19.         //delay(5000);

  20.         NetCmdExe();      
  21.     }
  22. }
  23. static srlrxcexe uart1callback = NULL;
  24. static srlrxcexe uart2callback = NULL;

  25. void Uart1RxCallBack(void *fun)
  26. {
  27.         uart1callback = (srlrxcexe)fun;
  28. }
  29. void Uart2RxCallBack(void *fun)
  30. {
  31.         uart2callback = (srlrxcexe)fun;
  32. }

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

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

  62. void uart1_send(unsigned char data)
  63. {
  64.     int index;
  65.     for (index = 0; index < 1000; index++)//检测发送器是否为空
  66.     {
  67.         if (TXSTA1bits.TRMT == 1)  // 发送移位寄存器状态位 1 = TSR 空  0 = TSR 满
  68.             break;
  69.     }
  70.     TXREG1 = data; //把数据写入缓冲区
  71.     for (index = 0; index < 1000; index++)//等待发送完毕
  72.     {
  73.         if (TX1IF == 1)  
  74.             break;
  75.     }
  76.     //TX1IF=0;                                                //发送中断清零
  77. }

  78. void uart2_send(unsigned char data)
  79. {
  80.     int index;
  81.     for (index = 0; index < 1000; index++)//检测发送器是否为空
  82.     {
  83.         if (TXSTA2bits.TRMT == 1)  // 发送移位寄存器状态位 1 = TSR 空  0 = TSR 满
  84.             break;
  85.     }
  86.     TXREG2 = data; //把数据写入缓冲区
  87.     for (index = 0; index < 1000; index++)//等待发送完毕
  88.     {
  89.         if (TX2IF == 1)  
  90.             break;
  91.     }
  92.     //TX1IF=0;                                                //发送中断清零
  93. //    TXREG2 = data;
  94. //    while(TXSTA2bits.TRMT==0);// loop
  95. }

  96. unsigned int Uart1PollPutc(unsigned char *buf, unsigned int size)
  97. {
  98.         unsigned char i;
  99.         for (i = 0; i < size; i++)
  100.         {
  101.         uart1_send(*buf);
  102.                 buf++;
  103.         }
  104.         return 1;   
  105. }

  106. unsigned int Uart2PollPutc(unsigned char *buf, unsigned int size)
  107. {
  108.         unsigned char i;
  109.         for (i = 0; i < size; i++)
  110.         {
  111.         uart2_send(*buf);
  112.                 buf++;
  113.         }
  114.         return 1;   
  115. }

  116. void interrupt usart(void)
  117. {
  118.    if(RC1IE&&RC1IF)            //判断是否为串口1接收中断
  119.    {
  120.        //TXREG=RCREG;           //把接收到的数据发送回去
  121.        if (uart1callback)
  122.        {
  123.            uart1callback(RCREG1);       
  124.        }
  125.    }
  126.    if(RC2IE&&RC2IF)            //判断是否为串口2接收中断
  127.    {
  128.        //TXREG=RCREG;           //把接收到的数据发送回去
  129.        if (uart2callback)
  130.        {
  131.            uart2callback(RCREG2);       
  132.        }
  133.    }
  134. }
shaoziyang 发表于 2017-4-6 10:22 | 显示全部楼层
关闭RX端口上的模拟输入功能吗?
szyonggui 发表于 2017-4-14 16:39 | 显示全部楼层
哈哈,我的却只能接收不能发送,,,
szyonggui 发表于 2017-4-14 16:48 | 显示全部楼层

TRISCbits.TRISC6=0;          //将该脚配置为TX
TRISCbits.TRISC7=1;           //将该脚配置为RX
zhengdahai2017 发表于 2017-4-21 22:24 来自手机 | 显示全部楼层
我的也是只能发不能收。不过mcu型号不同。楼主解决了?
zhoujunfeng 发表于 2017-4-25 09:50 | 显示全部楼层
;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  
 楼主| miaoshanfa 发表于 2017-4-26 17:36 | 显示全部楼层
解决了
串口1是RC7/RX没有设为数字通道,关闭RC7的模拟功能就可以了,串口2是可以的,是我的485串口工具有问题
yangzj1974 发表于 2018-2-13 15:33 | 显示全部楼层
学习
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

1

主题

2

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部