CC1310的SDK开发之串口应用
适用
CC1310
\CC2640R2F
等基于TI-RTOS的SDK开发
配置
- 注意:
1、UART_read(mUartHandle, uartRxDataTemp, UART_read_length);
UART_read_length:表示能接收到的数据长度,如果接收到的数据长度超过该参数,会造成串口宕机
2、UART_control(mUartHandle, UART_CMD_RESERVED, NULL);
开启硬件超时检测,超时后会自动调用Uart_ReadCallback
/** * @funtion: 串口参数配置 * * @param1:baudRate=>波特率,最大=3Mbps * @param2:dataLength=>数据单元长度=5,6,7,8 * @param3:stopBits=>停止位=1位,2位 * @param4:parityType=>校验位=无校验,偶校验,奇校验,总为0,总为1 * @ret: =1 配置成功,=0 配置失败 */ char config_uart(uint32_t baudRate, UART_LEN dataLength, UART_STOP stopBits,UART_PAR parityType) { if(mUartHandle != NULL){ UART_close(mUartHandle); mUartHandle = NULL; }else{ initUartRxBuffer(); // setTagPriority("peripheral", 0); Board_initUART(); /* Create a mUartHandle with data processing off. */ UART_Params_init(&uartParams); //加载默认参数 } uartParams.readCallback = Uart_ReadCallback; //获取串口读取回调函数 // uartParams.writeCallback = Uart_WriteCallback; //获取串口写回调函数 uartParams.readMode = UART_MODE_CALLBACK; //设置串口读模式:回调模式 // uartParams.writeMode = UART_MODE_BLOCKING; //设置串口写模式:默认为阻塞模式 uartParams.writeDataMode = UART_DATA_BINARY; uartParams.readDataMode = UART_DATA_BINARY; uartParams.readReturnMode = UART_RETURN_FULL; uartParams.readEcho = UART_ECHO_OFF; //设置读取反馈开关,关闭 uartParams.baudRate = baudRate; //波特率 uartParams.dataLength = dataLength; //数据长度 uartParams.stopBits = stopBits; //停止位 uartParams.parityType = parityType; //奇偶检验 // uartParams.readTimeout = getRxTimeOutTm(); // uartParams.readTimeout = UART_WAIT_FOREVER; //设置读取超时时间,默认总是等待, //readMode=UART_MODE_CALLBACK时一定要设置为forever mUartHandle = UART_open(Board_UART0, &uartParams); if (mUartHandle == NULL) { // System_abort("Error opening the mUartHandle"); return 0; }else{ UART_control(mUartHandle, UART_CMD_RESERVED, NULL); //开启自动超时检测 UART_read(mUartHandle, uartRxDataTemp, UART_read_length); return 1; } }
接收回调
回调函数中尽量不要处理耗时工作,每次读取完成后都要调用一次UART_read();。
参数:void *buf
ΪUART_read(mUartHandle, uartRxDataTemp, UART_read_length);
传入的缓存地址
void Uart_ReadCallback(UART_Handle handle, void *buf, size_t count) { size_t subPackageCnt=0,nextPackageIndex,memcpyLen; size_t countTemp = count; while( !( (countTemp / subPackageUnitLength == 0) && (countTemp % subPackageUnitLength == 0) ) ){ if(countTemp >= subPackageUnitLength){ countTemp = countTemp - subPackageUnitLength; memcpyLen = subPackageUnitLength; }else{ memcpyLen = countTemp; countTemp = 0; } nextPackageIndex = subPackageCnt * subPackageUnitLength; memcpy(uartRxData[uartRxDataIndex].buffer, &uartRxDataTemp[nextPackageIndex], memcpyLen); uartRxData[uartRxDataIndex].length = memcpyLen; uartRxData[uartRxDataIndex].isEmpty = false; memcpy(uartRxData2Uart[uartRxDataIndex].buffer, &uartRxDataTemp[nextPackageIndex], memcpyLen); uartRxData2Uart[uartRxDataIndex].length = memcpyLen; uartRxData2Uart[uartRxDataIndex].isEmpty = false; uartRxDataIndex ++; if(uartRxDataIndex == uartRxBufferMaxIndex){ uartRxDataIndex = 0; } subPackageCnt ++; } uartEventPost(); uartSemaphore_post(); UART_read(mUartHandle, uartRxDataTemp, UART_read_length); //等待下一次串口接收 }
文章来源: https://blog.csdn.net/LinQiPing233/article/details/89842611