在这之前,串口收发配置只在单片机、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 //uart redirect fputc
#include //copy function
#include //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) != ')'// 这部分针对不同 MCU 自己实现单字节发送
{
=
tem ( unsignedchar )*;pStriot_uart_write
(,port& ,tem1 );++
pStr;//address data add }
}
int
2.4 测试demo
appimg_enter (void* )paramUsart_cfg_init
{
(,DEBG_UART_PORT115200);=
sy_test_task_handle iot_os_create_task (,sy_test_taskNULL ,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_lenwhile
(1)={
write_len iot_uart_write (,UART_PORT2( *UINT8),write_buffstrlen ()write_buff);iot_os_sleep
(100);//这个是必须的 }
}
Usart_cfg_init
3特别说明
整个程序配置下来看着很简单是不是?对的,整个流程都跟简单。但是这里有一点需要特别注意,如果串口打开过了,就不能二次打开,否则就会引起串口打开失败而不工作。错误代码例子如下:
BOOL (,E_AMOPENAT_UART_PORT port) E_AMOPENAT_UART_BAUD baud=
{
T_AMOPENAT_UART_PARAM uartCfg 0x0 {};unsigned
char ; retmemset
(&,uartCfg0 ,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条)