当前位置:   article > 正文

52840串口_nortic 52840串口透传

nortic 52840串口透传

谷雨52832板子的串口代码
#define RX_PIN_NUMBER  8
#define TX_PIN_NUMBER  6
.rx_pin_no    = RX_PIN_NUMBER,
.tx_pin_no    = TX_PIN_NUMBER,
也就是P0.06---TX  P0.08---RX
对我们52840的板子来说这2个脚也是可以出来的!

外接传感器的地方 2个线可以对接USB串口!

硬件准备 -----------我是想做一个MCU--PC通过串口TXRX的案例

也就是连接这2根线

 

代码准备

先屏蔽硬定时器timer1的测试 因为谷雨的串口模型用到这个定时器

最后测试成功!如下图

 

现在分析代码

1----- UART_Init(APP_UartEvtHandle);   //初始化串口

这一句话就完成全部设定

 首先  uart_fifo_init();  uart_timer_init();

然后 管脚+115200

最后 nrf_drv_uart_init

还有最后关键的一句话   nrf_drv_uart_rx(&m_Uart, rxBuf,1);// RX NO.1 这和我以前编码一样的 这就是设定第一次接受一个字节放在哪里呢?就是放在这个1位的数组里面的

 

那么后面的话 就是消防数据以后再次接受下一个UART的数据

 

2---    UART_Write("Uart Test\r\n",strlen("Uart Test\r\n"));

这是主动TX一个数据

    nrf_drv_uart_tx(&m_Uart, (uint8_t const*)&tmp, 1); 

这样就把第一个数据发出去 那么后面的呢? 它是依靠上面的 一旦上面的TX完成 就会有完成事件 那么就会使得 nrf_drv_uart_tx_in_progress 为真!

后面的TX是在

//串口事件回调数据
static void uart_event_handler(nrf_drv_uart_event_t * p_event, void* p_context)
{
  switch (p_event->type)
  {
    case NRF_DRV_UART_EVT_TX_DONE:
      {
        uint8_t tmp;
        if (uart_data_get(&m_TxBuf,&tmp) == NRF_SUCCESS)
        {
            nrf_drv_uart_tx(&m_Uart, &tmp, 1);
            NRF_LOG_INFO("nrf_drv_uart_tx [%c]\r\n",tmp);
        }
 

3--如何完成我电脑TX啥板子返回啥的呢

前面描述过 只接受了一个 后面还需要连续接受

//串口事件回调数据
static void uart_event_handler(nrf_drv_uart_event_t * p_event, void* p_context)
{
  switch (p_event->type)
  {
    case NRF_DRV_UART_EVT_RX_DONE:
      {
        //关闭超时定时器
        nrf_drv_timer_disable(&m_TimerUart);
        if(UART_BUF_FREE_SAPCE_LEN(&m_RxBuf))  
        {
          nrf_drv_uart_rx(&m_Uart, rxBuf,1); //RX NO.234567----这就是继续接受下一个字节!
          //启动超时定时器
          nrf_drv_timer_enable(&m_TimerUart);
        }

      break;

TXRX是怎么联系的呢?电脑过来的是一股脑放FIFO放 也就是前面的联系接受 而发送时一股脑的读FIFO 有数据就TX出去 、

看后面的描述

 

和定时器怎么联系的呢?

 一旦接收到一个就启动定时器 然后滴滴答答开始计数 一旦在接受一个数据就停止定时器 就是割韭菜 每次韭菜长高一点就割掉 又长高一点又割掉

所谓张高就是RX以后定时器启动 

所谓割韭菜就是再RX一次就把定时器归零

所以没有新RX的话 就不会有人割韭菜 那就定时器一直++会超市的

void timer_uart_event_handler(nrf_timer_event_t event_type, void* p_context)
{
  switch (event_type)
  {
    case NRF_TIMER_EVENT_COMPARE0:
      //串口接收超时
      {
        uart_user_evt.evt_type = UART_EVT_RX_TIMEOUT;       
        uart_user_evt.status = UART_BUF_DATA_LEN(&m_RxBuf);
        if(m_uart_callback != NULL)
        {
          m_uart_callback(&uart_user_evt);
        }
        
      }
      break;

 

这个事件 在main死循环处理

    for (;;)
    {
        switch(uart_evt.evt_type)
        {
          case UART_EVT_RX_TIMEOUT:
          case UART_EVT_RX_OVERFLOW:
            len = UART_Read(Buf,uart_evt.status);
            UART_Write(Buf,len);      //从串口发出
            Buf[len] = 0;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/194203
推荐阅读
相关标签
  

闽ICP备14008679号