合宙 CSDK串口调试记录 Cat.1

3 篇文章 0 订阅
3 篇文章 0 订阅

1 前言

在这之前,串口收发配置只在单片机、VS环境C#上位机有实现过,本次项目需要,头一次使用CSDK调试开发。按照套路,本来以为很简单,一下子就可以实现了,但是现实却打了我的脸,折腾了几个小时。在调试完成之余,对自己学习过程过一个记录。

2 串口配置

2.1 初始化串口

BOOL Usart_cfg_init(E_AMOPENAT_UART_PORT port, E_AMOPENAT_UART_BAUD baud)
{
    T_AMOPENAT_UART_PARAM uartCfg = {0x0};
    unsigned char ret;
    memset(&uartCfg, 0, sizeof(T_AMOPENAT_UART_PARAM));
    uartCfg.baud = baud;  
    uartCfg.dataBits = 8;    
    uartCfg.stopBits = 1;  
    uartCfg.parity = OPENAT_UART_NO_PARITY;  
    uartCfg.flowControl = OPENAT_UART_FLOWCONTROL_NONE;  
    uartCfg.txDoneReport = TRUE; 
    uartCfg.uartMsgHande = NULL;      //如果需要串口中断接收数据,需要实现回调函数
    ret = iot_uart_open(port, &uartCfg);
    return ret;
}

2.2 串口发送接口

/**写uart
*@param		port:		UART 编号
*@param		buf:		写入数据地址
*@param		bufLen:		写入数据长度
*@return	UINT32:     实际读取长度
**/
UINT32 iot_uart_write(                                        
                        E_AMOPENAT_UART_PORT port,           
                        UINT8* buf,                         
                        UINT32 bufLen                     
                    )
{
    return OPENAT_write_uart(port, buf, bufLen);
}

2.3 自定义实现 printf

#include <stdio.h>                        //uart redirect fputc
#include <string.h>                        //copy function
#include <stdarg.h>                        //va_start /vsnprintf /va_end function

void sy_Debug_Printf(E_AMOPENAT_UART_PORT port, char *format, ...) //自定义实现printf
{
	unsigned char uart_buff[256];

	unsigned char *pStr = uart_buff;	
	unsigned char delay_max;
	unsigned char  tem;
	va_list ap;
	
	va_start(ap, format);	                					//初始化 ap 变量
	vsnprintf((char *)pStr, sizeof(uart_buff), format, ap);		//可变参数。用于向字符串中打印数据、数据格式用户自定义
	va_end(ap);													//允许使用了 va_start 宏的带有可变参数的函数返回
	
	while((*pStr) != '\0')
	{
	// 这部分针对不同 MCU 自己实现单字节发送
     tem = (unsigned char)*pStr;
     iot_uart_write(port, &tem, 1);
	 pStr++;					                                            //address data add
	}	
}

2.4 测试demo

int appimg_enter(void *param)
{
    Usart_cfg_init(DEBG_UART_PORT,115200);   
    sy_test_task_handle = iot_os_create_task(sy_test_task, NULL, 4096, 1, OPENAT_OS_CREATE_DEFAULT, "sy_test");
    return 0;
}
void appimg_exit(void)
{
    iot_debug_print("[sy_test_task_handle]appimg_exit");
}
 
 
static void sy_test_task(PVOID pParameter) //测试任务
{
    char write_buff[] = "uart hello world 8888888888888888888888";
    int32 write_len;
   while(1){
 write_len = iot_uart_write(UART_PORT2, (UINT8*)write_buff, strlen(write_buff));
 iot_os_sleep(100); //这个是必须的
}
}


3特别说明

整个程序配置下来看着很简单是不是?对的,整个流程都跟简单。但是这里有一点需要特别注意,如果串口打开过了,就不能二次打开,否则就会引起串口打开失败而不工作。错误代码例子如下:

BOOL Usart_cfg_init(E_AMOPENAT_UART_PORT port, E_AMOPENAT_UART_BAUD baud)
{
    T_AMOPENAT_UART_PARAM uartCfg = {0x0};
    unsigned char ret;
    memset(&uartCfg, 0, sizeof(T_AMOPENAT_UART_PARAM));
    uartCfg.baud = baud;  
    uartCfg.dataBits = 8;    
    uartCfg.stopBits = 1;  
    uartCfg.parity = OPENAT_UART_NO_PARITY;  
    uartCfg.flowControl = OPENAT_UART_FLOWCONTROL_NONE;  
    uartCfg.txDoneReport = TRUE; 
    uartCfg.uartMsgHande = NULL;      //如果需要串口中断接收数据,需要实现回调函数
    ret = iot_uart_open(port, &uartCfg);
    ret = iot_uart_open(port, &uartCfg);  //多配置了一次
    return ret;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值