示例#1
0
文件: uart.c 项目: osannolik/calmeas
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);
}
示例#2
0
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;
}
示例#3
0
文件: comm.c 项目: yougukepp/flyer
/* 发送采样数据 */
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;
        }
    }