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;
}