uint32_t uart_send_data(uint8_t* pData, uint16_t len) { uint8_t *bufEntry; int32_t sent_data_len; /* Wait until previous tx is done (buffer might currently be accessed by DMA) */ //uint32_t tickstart = HAL_GetTick(); //while ((uart_data.TxState == UART_TRANSMITTING));// && ((HAL_GetTick() - tickstart) < UART_TXDATA_TIMEOUT_MS)); if (uart_data.TxState == UART_TRANSMITTING) { return 0; } if (len > COBS_DATA_LEN_MAX) { len = COBS_DATA_LEN_MAX; } bufEntry = cobs_Encode((uint8_t *) pData, len, (uint8_t *) dma_buffer_tx); *bufEntry++ = UART_FRAME_DELIMITER; sent_data_len = uart_send_bytes((uint8_t *) dma_buffer_tx, (uint16_t) (bufEntry - dma_buffer_tx)); sent_data_len -= (bufEntry - dma_buffer_tx - len); // subtract overhead return (uint32_t) MAX(0, sent_data_len); }
int main(int argc, char *argv[]){ char test_str[] = "Hello World"; int bytes = strlen(test_str); // get number of bytes in test string char buf[BUF_SIZE]; int ret; // return value int bus; // which bus to use // Parse arguments if(argc!=2){ //argc==2 actually means one argument given print_usage(); return -1; } else bus = atoi(argv[1]); if(!(bus==0||bus==1||bus==2||bus==5)){ print_usage(); return -1; } // Initialization initialize_board(); printf("\ntesting UART bus %d\n\n", bus); if(initialize_uart(bus, BAUDRATE, TIMEOUT_S)){ printf("Failed to initialize_uart%d\n", bus); cleanup_board(); return -1; } // Flush and Write printf("Sending %d bytes: %s \n", bytes, test_str); flush_uart(bus); uart_send_bytes(bus, bytes, &test_str[0]); // Read memset(buf, 0, BUF_SIZE); ret = uart_read_bytes(bus, bytes, &buf[0]); if(ret<0) printf("Error reading bus\n"); else if(ret==0)printf("timeout reached, %d bytes read\n", ret); else printf("Received %d bytes: %s \n", ret, buf); // close up close_uart(bus); cleanup_board(); return 0; }
/* 发送采样数据 */ static void send_capture_data(void) { uint32_T type = 0; /* 避免函数退出 栈内存被破坏(DMA传输 要求内存数据保持) */ static uint8_T frame_buf[COMM_FRAME_CAPTURE_FRAME_MAX_SIZE] = {0}; uint32_T len = 0; uint32_T i = 0; uint32_T fill_bytes_count = 0; uint32_T crc32_calculated = 0; uint32_T now_ms = 0; f32_T quat[4] = {0.0f}; f32_T euler[CTRL_EULER_MAX] = {0.0f}; f32_T pid_out[CTRL_EULER_MAX] = {0.0f}; int32_T accelerator_max = 0; int32_T accelerator[PWM_MAX] = {0}; uint32_T *p_ui32 = NULL; static uint32_T last_ms = 0; /* 无帧可发 */ if(!(s_send_interval || s_send_accelerator_flag || s_send_dmp_quat_flag || s_send_euler_flag || s_send_pid_flag)) { return; } /* 可以发送 */ now_ms = HAL_GetTick(); if(now_ms - last_ms > s_send_interval) { /* 上行且有传感数据长度32 */ type = COMM_FRAME_SENSOR_DATA_BIT | COMM_FRAME_DIRECTION_BIT; /* 跳过type和len域 */ len += 8; /* 填充时间 */ frame_buf[len++] = (uint8_T)(now_ms >> 24); frame_buf[len++] = (uint8_T)((now_ms >> 16)); frame_buf[len++] = (uint8_T)((now_ms >> 8)); frame_buf[len++] = (uint8_T)(now_ms); if(s_send_dmp_quat_flag) { mpu9250_get_quat(quat); #if 0 /* 调试上位机绘图基准 */ quat[0] = 1.0f; quat[1] = 0.0f; quat[2] = 0.0f; quat[3] = 0.0f; #endif p_ui32 = (uint32_T *)quat; for(i = 0; i < 4; i++) { frame_buf[len++] = (uint8_T)( (uint32_T)p_ui32[i] >> 24); frame_buf[len++] = (uint8_T)(((uint32_T)p_ui32[i] >> 16)); frame_buf[len++] = (uint8_T)(((uint32_T)p_ui32[i] >> 8)); frame_buf[len++] = (uint8_T)( (uint32_T)p_ui32[i]); } type |= COMM_FRAME_DMP_QUAT_BIT; } /* 油门数据 */ if(s_send_accelerator_flag) { ctrl_get_acceleralor(accelerator, &accelerator_max); for(i = 0; i < PWM_MAX; i++) { frame_buf[len++] = (uint8_T)(accelerator[i] >> 24); frame_buf[len++] = (uint8_T)(accelerator[i] >> 16); frame_buf[len++] = (uint8_T)(accelerator[i] >> 8); frame_buf[len++] = (uint8_T)(accelerator[i]); } frame_buf[len++] = (uint8_T)(accelerator_max >> 24); frame_buf[len++] = (uint8_T)(accelerator_max >> 16); frame_buf[len++] = (uint8_T)(accelerator_max >> 8); frame_buf[len++] = (uint8_T)(accelerator_max); type |= COMM_FRAME_ACCELERATOR_DATA_BIT; } /* 欧拉角 */ if(s_send_euler_flag) { mpu9250_get_quat(quat); math_quaternion2euler(euler, quat); p_ui32 = (uint32_T *)euler; for(i = 0; i < CTRL_EULER_MAX; i++) { frame_buf[len++] = (uint8_T)(p_ui32[i] >> 24); frame_buf[len++] = (uint8_T)(p_ui32[i] >> 16); frame_buf[len++] = (uint8_T)(p_ui32[i] >> 8); frame_buf[len++] = (uint8_T)(p_ui32[i]); } type |= COMM_FRAME_EULER_DATA_BIT; } /* pid数据 */ if(s_send_pid_flag) { ctrl_get_pid_out(pid_out); p_ui32 = (uint32_T *)pid_out; for(i = 0; i < CTRL_EULER_MAX; i++) { frame_buf[len++] = (uint8_T)(p_ui32[i] >> 24); frame_buf[len++] = (uint8_T)(p_ui32[i] >> 16); frame_buf[len++] = (uint8_T)(p_ui32[i] >> 8); frame_buf[len++] = (uint8_T)(p_ui32[i]); } type |= COMM_FRAME_PID_DATA_BIT; } /* 填充 */ fill_bytes_count = len & 0x03; for(i = 0; i < fill_bytes_count; i++) { frame_buf[len++] = COMM_FRAME_FILLED_VAL; } /* 填写type域 */ frame_buf[0] = (uint8_T)(type >> 24); frame_buf[1] = (uint8_T)(type >> 16); frame_buf[2] = (uint8_T)(type >> 8); frame_buf[3] = (uint8_T)(type); /* 计入crc长度 */ len += 4; len -= 8; /* len中长度值不包括type+len */ /* 填写len域 */ frame_buf[4] = (uint8_T)(len >> 24); frame_buf[5] = (uint8_T)(len >> 16); frame_buf[6] = (uint8_T)(len >> 8); frame_buf[7] = (uint8_T)(len); /* len偏移到crc位置 */ len += 4; /* 计算校验 */ crc32_calculated = HAL_CRC_Calculate(&s_crc, (uint32_T *)frame_buf, len / 4); frame_buf[len++] = (uint8_T)(crc32_calculated >> 24); frame_buf[len++] = (uint8_T)(crc32_calculated >> 16); frame_buf[len++] = (uint8_T)(crc32_calculated >> 8); frame_buf[len++] = (uint8_T)(crc32_calculated); /* 发帧 */ if(len > COMM_FRAME_SENDED_MIN) { #if 0 /* 出错 用于检查 crc是否为0 */ if(0 == frame_buf[n-1]) { ERR_STR("crc错误."); } #endif uart_send_bytes((drv_uart_T *)s_comm_uart, frame_buf, len); last_ms = now_ms; } }