赞
踩
谷雨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;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。