BSP

stm32f10x串口只能发送数据,无法接收

发布于 2015-12-12 19:10:46
用串口助手发送后stm32单片机卡住无响应,崩溃了。
调试了一天代码实在不知道是哪里有问题?大家碰到过吗,有什么建议吗?
第一次用RT-Thread,第一次发帖,希望多多照顾。
这是我参考手册写的一部分代码:

// 数据到达回调函数
// rt_err_t(*)(rt_device_t dev, rt_size_t size)
rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{
struct rx_msg msg;
msg.dev = dev;
msg.size = size;
// 发送消息到消息队列中
rt_mq_send(rx_mq, &msg, sizeof(struct rx_msg));
return RT_EOK;
}

static void uart2_thread_entry(void* parameter)
{
rt_err_t result = RT_EOK;
struct rx_msg msg;
//int count = 0;
rt_device_t stm32_uart2;
rt_uint32_t rx_length;

// 根据注册名查找设备
stm32_uart2 = rt_device_find("uart2");
if (stm32_uart2 != RT_NULL)
{
// 初始化设备
rt_device_init(stm32_uart2);
// 设置回调函数(当设备接收到数据执行)
rt_device_set_rx_indicate(stm32_uart2, uart_input);
// 打开设备
rt_device_open(stm32_uart2, RT_DEVICE_OFLAG_RDWR);
}

rt_device_write(stm32_uart2, 0, &uart_tx_buffer[0], 18);

while(1)
{
// 从消息队列中读取消息
result = rt_mq_recv(rx_mq, &msg, sizeof(struct rx_msg), 50);
if (result == -RT_ETIMEOUT)
{
// 接收超时
//rt_kprintf("timeout count:%d
", ++count);
rt_device_write(stm32_uart2, 0, &timeout[0], 12);
}
// 成功收到消息
else if (result == RT_EOK)
{


rt_device_write(stm32_uart2, 0, &recvOk[0], 12);

rx_length = (sizeof(uart_rx_buffer) - 1) > msg.size ?
msg.size : sizeof(uart_rx_buffer) - 1;

// 读取消息
rx_length = rt_device_read(msg.dev, 0, &uart_rx_buffer[0], rx_length);
uart_rx_buffer[rx_length] = '';

// 回显观察
//rt_device_write(stm32_uart2, 0, &uart_rx_buffer[0], rx_length);

}

rt_thread_delay( 10 );
}

}
int rt_application_init(void)
{
// 初始化消息队列
rt_mq_init(&my_rx_mq, "mqt", &msg_pool[0], sizeof(struct rx_msg), sizeof(msg_pool), RT_IPC_FLAG_FIFO);
rx_mq = &my_rx_mq;
// 动态创建 usart2 线程
uart2_id = rt_thread_create("uart2", // 线程名称
uart2_thread_entry, // 线程入口入口函数
RT_NULL, // 线程入口入口函数参数
2048, // 线程栈大小
19, // 线程优先级
10); // 线程时间片大小
if (uart2_id != RT_NULL)
rt_thread_startup(uart2_id);
.......

查看更多

关注者
0
被浏览
2.2k
7 个回答
bernard
bernard 2015-12-12
打开串口设备需要额外加参数了
qq_Huangtao!
qq_Huangtao! 2015-12-12
并没有用的。
我用的是2.0版本,没有用components的serial。自己重写了serial.c和usart.c
打开串口最终调用这个
// 打开设备
static rt_err_t rt_serial_open(rt_device_t dev, rt_uint16_t oflag)
{
struct stm32_serial_device* uart;
// 获得真实的UART设备对象
uart = (struct stm32_serial_device*) dev->user_data;
if (dev->flag & RT_DEVICE_FLAG_INT_RX)
{
// 中断接收模式,使能中断
USART_ITConfig(uart->uart_device, USART_IT_RXNE, ENABLE); //开启中断 接收中断

}
return RT_EOK;
}
void rt_hw_usart_init()
{
USART_InitTypeDef USART_InitStructure;
USART_ClockInitTypeDef USART_ClockInitStructure;

RCC_Configuration();

GPIO_Configuration();

NVIC_Configuration();

//DMA_Configuration();
......
rt_hw_serial_register(&uart2_device, "uart2",
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_STREAM,
&uart2);

/* enable interrupt */
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);

......
其实在这里初始化中断就已经打开了,它在startup.c有调用。

其实我想了下,手册里uart = (struct stm32_serial_device*) dev->user_data;这里的两个不同结构体里面的变量对的上吗?
qq_Huangtao!
qq_Huangtao! 2015-12-12
最后还是用了components的serial的,可以了,可能自己写的驱动有错误,哈哈。
解决了。
串口可以收到了!!
labi41
labi41 2016-03-17
请问是怎么解决的,我的情况跟你的一模一样。呵呵

原来的1.2版本使用好用的,怎么2.0这么多问题
huang2017
huang2017 2019-01-02
labi41 发表于 2016-3-17 21:49
请问是怎么解决的,我的情况跟你的一模一样。呵呵

原来的1.2版本使用好用的,怎么2.0这么多问题 ...


我也是遇到这个问题,能发送不能接收。
huang2017
huang2017 2019-01-02
huang2017 发表于 2019-1-2 13:51
我也是遇到这个问题,能发送不能接收。


最后是怎么解决的,可以分享一下吗

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友