[技术问答] NUC120写串口一通信时,不能发送数据,该怎么写?第一次用新塘的。

[复制链接]
1696|9
 楼主| rocHP 发表于 2019-4-27 17:35 | 显示全部楼层 |阅读模式


  1. uint8_t ComInBuf[128];
  2. uint8_t ComOutBuf[128];
  3. uint8_t ComOrderData[9];   //接收到的命令
  4. uint8_t ComOrderDataBuf[9];   //接收到的命令缓存
  5. uint8_t SendDataNum;       //需要发送的实际数据个数
  6. uint8_t ComdataRead=0;    //com串口数据已读取
  7. uint8_t ComdataReady=0;   //com串口数据接收完成
  8. uint8_t ComOrdertype=0;   //串口接收到的命令类型
  9. uint8_t Comreturn;  //软件判断串口返回给软件的数据,并回复给MCU确认上一返回数据是否正确接收,1 true ;0 fault

  10. /*
  11. -
  12. --函数名:Uart1串口初始化
  13. --功  能:
  14. -
  15. */
  16. void Uart1Init(void)
  17. {
  18.   STR_UART_T sParam;

  19.         // Set UART Pin
  20.         DrvGPIO_InitFunction(E_FUNC_UART1);

  21.         SYSCLK->CLKSEL1.UART_S = 0;
  22.         /*
  23.         UART_S
  24.                 UART 时钟源选择
  25.                 00 = 时钟源为外部 4~24 MHz 晶振时钟
  26.                 01 = 时钟源为 PLL 时钟
  27.                 11 = 时钟源为内部 22.1184 MHz 振荡器时钟
  28.         */
  29.        
  30.         // UART Setting
  31.     sParam.u32BaudRate                 = 115200;           
  32.     sParam.u8cDataBits                 = DRVUART_DATABITS_8;
  33.     sParam.u8cStopBits                 = DRVUART_STOPBITS_1;
  34.     sParam.u8cParity                   = DRVUART_PARITY_NONE;         //无检验
  35.     sParam.u8cRxTriggerLevel= DRVUART_FIFO_1BYTES;

  36.         // Select UART Clock Source From 12Mhz
  37.         //DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC,0); E_SYS_UART_CLKSRC
  38.        
  39.         DrvUART_Open(UART_PORT1,&sParam);
  40. //        DrvUART_EnableInt(UART_PORT1,DRVUART_RDAINT & DRVUART_RDAINT,COM_INT_HANDLE);
  41.         DrvUART_EnableInt(UART_PORT1,  DRVUART_RDAINT, Uart1_ISR); //使能设置串口中断
  42. //        UART1->IER.RDA_IEN  = 1; //接收中断使能  
  43. //        UART1->IER.THRE_IEN        =        0; //发送中断禁止
  44.   NVIC_SetPriority (UART1_IRQn, (1<<__NVIC_PRIO_BITS) - 4);  //设置串口中断优先级(0~3,0最高,3最低)               

  45. }

  46. /**
  47. --函数名:Uart1_ISR 串口1中断函数
  48. --功  能:串口数据接收与发送
  49. **/


  50. void Uart1_ISR(uint32_t u32IntStatus)
  51. {
  52.          uint8_t bInChar[1];       
  53.          static uint8_t  comsendcnt=0;        //发送数据计数
  54.    static uint16_t comreccnt=0;   //接收数据计数
  55.          
  56.          if(u32IntStatus& DRVUART_RDAINT)         //接收中断
  57.          {                 
  58.                  while(UART1->ISR.RDA_IF==1)
  59.                  {
  60.                          if(ComdataRead==1)
  61.                          {
  62.                                  ComdataRead=0;
  63.                                  comreccnt=0;
  64.        }
  65.                          DrvUART_Read(UART_PORT1,bInChar,1);
  66.                          if(comreccnt<128) ComInBuf[comreccnt]= bInChar[0];        //将接收到的数据复制到缓存区
  67.                          comreccnt++;
  68.        if(comreccnt>=128) comreccnt=128;
  69.                          ResetTMR0Start();  //复位串口接收超时定时器0
  70.                  }
  71.          }

  72.          if(u32IntStatus & DRVUART_THREINT) //发送中断  //DrvUART.H修改DRVUART_THREINT定义为BIT9
  73.          {               
  74.                  if(UART1->ISR.THRE_IF)
  75.                  {
  76.                          /*
  77.                          THRE_INT
  78.                                 发送保持寄存器空中断标志 (Read Only).
  79.                                 如果 THRE_IEN 和 THRE_IF 都被置1,该位置 1。
  80.                                 1 = THRE中断产生
  81.                                 0 = 无 THRE中断产生
  82.                          */
  83.                          if(comsendcnt<SendDataNum)  //实际需要发送的数据个数
  84.                    {
  85.                                  //DrvUART_Write(UART_PORT1,&ComOutBuf[comsendcnt],1);
  86.                            UART1->DATA =ComOutBuf[comsendcnt];        //test
  87.                comsendcnt++;                         
  88.                    }
  89.                          
  90.                    else  //数据发送完毕
  91.                    {
  92.                            if(UART1->FSR.TE_FLAG)
  93.                            {/*
  94.                                          TE_FLAG
  95.                                                 发送空标志位 (Read Only)
  96.                                                 当 TX FIFO (UA_THR) 为空,而且最后一个字节的 STOP 位已发送,该位由硬件置位。
  97.                                                 当 TX FIFO 不为空或最后一个字节传输未完成,该位自动清除。
  98.                                          */
  99.                                   
  100.                                    comsendcnt=0;             //重置发送计数
  101.                                    UART1->IER.THRE_IEN = 0;  //关闭中断使能,需要发送数据时开启
  102. //                                         UART1->DATA =0;
  103.                            }
  104.                    }
  105.      }
  106.                         
  107.          }
  108. }

  109. /*
  110. //Uart1发送数据
  111. //
  112. */
  113. void SendCOMdata(uint8_t *buf,uint8_t datanum)
  114. {
  115.   uint8_t i;
  116.         for(i=0;i<datanum;i++)
  117.         {
  118.     ComOutBuf[i]=buf[i];
  119.   }
  120.         SendDataNum = datanum;
  121.         TMR1Delay(1);//1ms延时
  122.         UART1->IER.THRE_IEN = 1;  //开启中断使能,需要发送数据时开启
  123.        
  124. }



评论

刚接触NUC230,你的底层程序是怎么配置的,是有例程吗?小白一个,望指教  发表于 2019-5-20 11:25
xinpian101 发表于 2019-5-21 23:54 | 显示全部楼层
没有下载BSP吗,BSP里面应该有串口1的演示吧
jasontu 发表于 2019-5-22 08:49 | 显示全部楼层
gpio沒有初始化成uart mode.
QQ1099811789 发表于 2019-5-22 09:11 | 显示全部楼层
玛尼玛尼哄 发表于 2019-5-23 23:21 | 显示全部楼层
楼主搞个BSP跑啊
玛尼玛尼哄 发表于 2019-5-23 23:22 | 显示全部楼层
看样子楼主自己写的代码,不如参考官方的库函数。
dongliushui 发表于 2019-5-23 23:56 | 显示全部楼层
参考串口0的配置
dongliushui 发表于 2019-5-23 23:57 | 显示全部楼层
BSP里有个串口0的例子。
森林长老 发表于 2020-6-29 08:01 | 显示全部楼层
学习了,谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

36

帖子

1

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