Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
[分享]stm32+rt 串口操作实例
发布于 2013-03-14 13:48:43 浏览:5000
订阅该版
大家好,在一般情况下,我们处理USART操作都是一个字符一个字符收到,到时候进行打印输出。 我现在实现的方式是,接收的字符放入缓冲中,设置一个超时定时器。等超时后处理对应的buffer就可以了。 大体代码如下: ```#define USART_BUFFER_SIZE 255 /* 定时器的控制块 */ static struct rt_timer timer_uart_tg; static char tg_timeout_start = RT_FALSE; char tg_uart_buffer[USART_BUFFER_SIZE]; rt_uint8_t tg_buffer_position = 0 ; void timer_static_init() { /* 初始化定时器 */ rt_timer_init(&timer_uart_tg, "timer_tg", /* 定时器名字是 timer1 */ tg_read_timeout, /* 超时时回调的处理函数 */ RT_NULL, /* 超时函数的入口参数 */ 10, /* 定时长度,以OS Tick为单位,即10个OS Tick */ RT_TIMER_FLAG_ONE_SHOT); /* 单次定时器 */ } //串口中断接收函数 static rt_err_t tg_rx_ind(rt_device_t device, rt_size_t size) { //RT_ASSERT(shell != RT_NULL); /* release semaphore to let finsh thread rx data */ //rt_sem_release(&shell->rx_sem); //先不用线程的方式 char ch; /* read one character from device */ while (rt_device_read(device, 0, &ch, 1) == 1) { /* handle CR key */ if (ch == ' ') { char next; if (rt_device_read(device, 0, &next, 1) == 1) ch = next; else ch = ' '; } //rt_kprintf("%c", ch); if (tg_timeout_start == RT_FALSE) { tg_timeout_start = RT_TRUE; /* 启动定时器 */ rt_timer_start(&timer_uart_tg); } ///* it's a large line, discard it */ if (tg_buffer_position >= USART_BUFFER_SIZE) tg_buffer_position = 0; ///* normal character */ tg_uart_buffer[tg_buffer_position] = ch; ch = 0; tg_buffer_position ++; //shell->use_history = 0; /* it's a new command */ } /* end of device read */ return RT_EOK; } /* 定时器tg超时函数 */ static void tg_read_timeout(void* parameter) { //rt_kprintf("one shot timer is timeout "); rt_uint8_t position = 0; tg_timeout_start = RT_FALSE; tg_uart_buffer[tg_buffer_position] = 0; for (position=0; position
查看更多
9
个回答
默认排序
按发布时间排序
bernard
2013-03-14
这家伙很懒,什么也没写!
不过,tg_rx_ind这个函数最好不要做过多复杂的处理,因为它是在中断上下文中被调用的。
longzhiyou
2013-03-14
这家伙很懒,什么也没写!
是的,如果处理复杂事件就得用线程和信号量的方法了。到时候我做优化的时候在使用。
fengzi
2013-03-14
这家伙很懒,什么也没写!
``` ///* it's a large line, discard it */ if (tg_buffer_position >= USART_BUFFER_SIZE) tg_buffer_position = 0; ``` 这个地方直接丢弃的方法不是很好 处理接收数据应该不只考虑接收超时一个因素吧 还应考虑一个条件——待处理数据已经足够多 即当【数据足够多】或【接收超时】时,通知处理线程来取数据 这样比较合理
小ARM菜菜
2013-04-07
这家伙很懒,什么也没写!
似乎这样不太完善吧,是不是考虑用个缓冲队列比较好啊!判断读写指针的位置!串口这个搞不好就丢失字节,但是就要不停的轮训,也是很头痛的事情,占用了太多的系统时间片,好的方法如果有的话推荐个
longzhiyou
2013-04-10
这家伙很懒,什么也没写!
关于串口这里,我已经有了好的解决方案,现在已经测试ok。主要的思想就是字符间隔超过一定的时间说明串口数据接收完毕。 ``` /* 启动定时器 */ //rt_timer_stop(&puart->timer); //rt_timer_start(&puart->timer); if (puart->timeout_start == RT_FALSE) { rt_timer_start(&puart->timer); puart->timeout_start = RT_TRUE; } else puart->timer.timeout_tick = rt_tick_get()+INTER_FRAME_TIMER; ``` 当收到一个字节后,就重新计算定时器,这样可以不用考虑波特率以及timer设置的时间问题了。
nongxiaoming
2013-04-14
rt-thread大师兄
会不会接收过快时,定时器还没有超时buf不够装溢出?
小ARM菜菜
2013-04-28
这家伙很懒,什么也没写!
串口超时怎么感觉不靠谱呢 ,毕竟是被动啊,有什么办法可以主动啊
longzhiyou
2013-05-14
这家伙很懒,什么也没写!
>会不会接收过快时,定时器还没有超时buf不够装溢出? --- 我用这个其实每次中断来的时候,是线程本身直接timeout_tick+超时的tick的。目前我应用没有问题。即使波特率是115200,只有在两个字节或者说中断时间超过指定的timer时,才真正触发timer函数,去手机数据。 其实不可能做一个非常通用的,要根据自己的项目来定制更好。
撰写答案
登录
注册新账号
关注者
0
被浏览
5k
关于作者
longzhiyou
这家伙很懒,什么也没写!
提问
1
回答
4
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
【RT-Thread】【ci】【scons】将ci.attachconfig.yml和scons结合使用
2
Rt-thread中OTA下载后,bootloader不搬程序
3
ulog 日志 LOG_HEX 输出时间改为本地日期时间
4
在RT-Thread Studio中构建前执行python命令
5
研究一了一段时间RTT,直接标准版上手太难,想用nano,但又舍不得组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
出出啊
1518
个答案
343
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
5
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部