李金召
李金召
这家伙很懒,什么也没写!

注册于 5年前

回答
6
文章
0
关注者
0

发布于5年前

你好,你的做成功么,我这一直有问题


我没有直接用rtthread工程生成usb做控制台,而是通过手动修改的方式把控制台使用的串口输入输出函数替换为cdc的输入输出函数,目前使用一切正常,替换如下,修改相应的读写机制,

static const struct rt_uart_ops stm32_vcom_ops =
{
usbvcom_configure,
usbvcom_control,
usbvcom_putc,
usbvcom_getc,
};
static const struct rt_uart_ops stm32_uart_ops =
{
stm32_configure,
stm32_control,
stm32_putc,
stm32_getc,
};

/////////////////////////////////////////////////////////////
static int bendich = ‘6’;
static int getflag = 0;
void set_bendi_CH(int ch)
{
bendich = ch;
getflag = 1;
}

rt_err_t usbvcom_configure(struct rt_serial_device serial, struct serial_configure cfg)
{

  1. return RT_EOK;

}

rt_err_t usbvcom_control(struct rt_serial_device serial, int cmd, void arg)
{

  1. return RT_EOK;

}

extern rt_device_t vcom_dev;
int usbvcom_init_flag=0;
int usbvcom_putc(struct rt_serial_device *serial, char c)
{
if(usbvcom_init_flag)
{
rt_device_write(vcom_dev, 0, &c, 1);
}
return 1;
}

int usbvcom_getc(struct rt_serial_device *serial)
{
if(getflag)
{
getflag = 0;
return bendich;
}
else
{
return -1;
}
}

void usbvcom_uart_isr(void)
{

}
//////////////////////////////////////////////////////
/ 接收数据回调函数 /
static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{
/ 串口接收到数据后产生中断,调用此回调函数,然后发送接收信号量 /
rt_sem_release(&rx_sem);

  1. return RT_EOK;

}

static void serial_thread_entry(void *parameter)
{
char ch;

  1. while (1)
  2. {
  3. /* 从串口读取一个字节的数据,没有读取到则等待接收信号量 */
  4. while (rt_device_read(vcom_dev, -1, &ch, 1) != 1)
  5. {
  6. /* 阻塞等待接收信号量,等到信号量后再次读取数据 */
  7. rt_sem_take(&rx_sem, RT_WAITING_FOREVER);
  8. }
  9. /* 读取到的数据通过串口错位输出 */
  10. set_bendi_CH(ch);
  11. rt_hw_serial_isr(&serial1, RT_SERIAL_EVENT_RX_IND);

// rt_device_write(vcom_dev, 0, &ch, 1);
}
}

发布于5年前

楼上用的什么芯片,可以发一下demo代码么


stm32f103zet6

/ 用于接收消息的信号量 /
static struct rt_semaphore rx_sem;
static rt_device_t serial;

/ 接收数据回调函数 /
static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{
/ 串口接收到数据后产生中断,调用此回调函数,然后发送接收信号量 /
rt_sem_release(&rx_sem);

  1. return RT_EOK;

}

static void serial_thread_entry(void *parameter)
{
char ch;

  1. while (1)
  2. {
  3. /* 从串口读取一个字节的数据,没有读取到则等待接收信号量 */
  4. while (rt_device_read(serial, -1, &ch, 1) != 1)
  5. {
  6. /* 阻塞等待接收信号量,等到信号量后再次读取数据 */
  7. rt_sem_take(&rx_sem, RT_WAITING_FOREVER);
  8. }
  9. /* 读取到的数据通过串口错位输出 */
  10. rt_device_write(serial, 0, &ch, 1);
  11. }

}

int main(void)
{
int err = 0;
rt_thread_t tid;
//创建并启动交互任务
tid = rt_thread_create(“led”, led_task, RT_NULL, RT_MAIN_THREAD_STACK_SIZE, 25, 20);
RT_ASSERT(tid != RT_NULL);
rt_thread_startup(tid);

  1. tid = rt_thread_create("iic", iic_task, RT_NULL, RT_MAIN_THREAD_STACK_SIZE, 24, 20);
  2. RT_ASSERT(tid != RT_NULL);
  3. rt_thread_startup(tid);
  4. serial = rt_device_find("vcom");
  5. if (!serial)
  6. {
  7. rt_kprintf("find failed!\n");
  8. return RT_ERROR;
  9. }
  10. err = rt_device_init(serial);
  11. if (!serial)
  12. {
  13. rt_kprintf("find failed!\n");
  14. return RT_ERROR;
  15. }
  16. err = rt_device_open(serial, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX);
  17. //初始化信号量
  18. rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO);
  19. // 设置接收回调函数
  20. rt_device_set_rx_indicate(serial, uart_input);
  21. rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10);
  22. if (thread != RT_NULL)
  23. {
  24. rt_thread_startup(thread);
  25. }
  26. while (1)
  27. {
  28. rt_thread_mdelay(100);
  29. }
  30. return RT_EOK;

}

发布于5年前

找到问题了,把这个rt_device_open(serial, RT_DEVICE_OFLAG_RDWR);
改成这个rt_device_open(serial, RT_DEVICE_FLAG_RDWR);
就好了,没弄清区别

发布于5年前

怎么解决

发布于5年前

这个和rtt没什么关系啊


这是scons的用法呀,加不进去,scons编译就报错,不知道怎么加呀

发布于5年前

这是scons的用法呀,加不进去,scons编译就报错,不知道怎么加呀

回到
顶部

发布
问题

投诉
建议