Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
UART
关于STM32串口通信的问题
发布于 2016-04-26 17:20:40 浏览:4105
订阅该版
为什么这个程序每次都读写一个字符,最后却能够完成多字符通讯。如果我想自己编写通讯协议,在which内怎么能够同时判定多字符(which内每次读写一个字符) ```c #include
struct rx_msg { rt_device_t dev; rt_size_t size; }; /* 用于接收消息的消息队列*/ static rt_mq_t rx_mq; /* 接收线程的接收缓冲区*/ static char uart_rx_buffer[512]; static char uart_sx_buffer[512]; /* 数据到达回调函数*/ 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; } void device_thread_entry(void* parameter) { struct rx_msg msg; int count = 0; rt_device_t device, write_device; rt_err_t result = RT_EOK; /* 查找系统中的串口1设备 */ device = rt_device_find("uart1"); if (device!= RT_NULL) { /* 设置回调函数及打开设备*/ rt_device_set_rx_indicate(device, uart_input); rt_device_open(device, RT_DEVICE_OFLAG_RDWR); } /* 设置写设备为uart1设备 */ write_device = device; /* 查找系统中的串口2设备 */ device= rt_device_find("uart2"); if (device != RT_NULL) { /* 设置回调函数及打开设备*/ rt_device_set_rx_indicate(device, uart_input); rt_device_open(device, RT_DEVICE_OFLAG_RDWR); } while (1) { /* 从消息队列中读取消息*/ result = rt_mq_recv(rx_mq, &msg, sizeof(struct rx_msg), 50); // if (result == -RT_ETIMEOUT) // { // /* 接收超时*/ // rt_kprintf("timeout count:%d ", ++count); // } // /* 成功收到消息*/ if (result == RT_EOK) { rt_uint32_t rx_length; 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] = '�'; /* 写到写设备中*/ if (write_device != RT_NULL) rt_device_write(write_device, 0, &uart_rx_buffer[0], rx_length); } } } static struct rt_messagequeue s_your_mq;//消息队列控制块对象 static char s_msg_pool[1024];//消息池 int rt_application_init() { /* 创建devt线程*/ rt_thread_t thread = rt_thread_create("devt", device_thread_entry, RT_NULL, 1024, 25, 7); rt_mq_init(&s_your_mq,"test",&s_msg_pool[0],sizeof(struct rx_msg),sizeof(s_msg_pool),RT_IPC_FLAG_FIFO);//初始化消息队列控制块 rx_mq =&s_your_mq;//将rx_mq再指向s_your_mq /* 创建成功则启动线程*/ if (thread != RT_NULL) rt_thread_startup(thread); } ```
查看更多
8
个回答
默认排序
按发布时间排序
skyline
2016-05-18
这家伙很懒,什么也没写!
我也在这段代码上遇到同样问题;区别是我把接收到的字符输出到lcd; 从结果上看 每次只能显示一个或者2个字符; 我的目的是把从uart1接收到的数据帧 解码成可读信息输出到lcd显示
一个潘一个锐
2016-05-18
这家伙很懒,什么也没写!
开一个线程,循环读取串口缓存的数据,1字节或者多字节读到buff里,直到确定为一帧长度或者你约定某个结束符为一帧,即去处理。跟裸机fifo缓存处理方式是一样的。
zqty467896321d
2018-09-26
这家伙很懒,什么也没写!
不知道楼主解决了吗?我也是这样的问题,我想读取串口缓存的数据,来判定接收的数据是不是完整的?但是缓存的数据变化的很快,不知道怎么办?
rockjg0917
2018-09-27
这家伙很懒,什么也没写!
用DMA接收
jeasey
2018-10-25
这家伙很懒,什么也没写!
你好,你使用的库函数还是HAL?我使用的HAL库,rt-thread版本为3.1.1接收数据基本就死在了串口中断里面。 你串口中断怎么处理的,能参考一下吗?谢谢!
venus5712
2018-10-25
这家伙很懒,什么也没写!
我是再自己程序里用到了一个简单的状态机,每接收一个字节读取判断改变状态。解析协议没得问题的。
wszdxmh
2021-04-09
这家伙很懒,什么也没写!
如果是定长数据,可以用DMA接收,做起来比较方便,如果是不定长数据,可以用中断的方式,比较简单,每接收一个数据,按通讯的协议进行判断,如按帧头,帧长度,帧命令字,校验码等进行判断,检验通过后发送信号给相关任务。也可以用DMA+空闲中断的方式,可以搜索一下DMA+环形缓存。
撰写答案
登录
注册新账号
关注者
0
被浏览
4.1k
关于作者
qq_夜止
这家伙很懒,什么也没写!
提问
1
回答
0
被采纳
0
关注TA
发私信
相关问题
1
rt thread 2.0.2 usart 接收缓存问题
2
STM32F1+RTT串口接收终端数据丢失问题
3
UART TX丢数据?
4
RTT打开串口的时候如何自定义波特率呢?
5
STM32F4的USART数据接收问题
6
串口1234使用问题
7
串口接收回调函数
8
LPC18xx UART问题讨论
9
x1000串口配置的失败问题
10
如何用串口输出一个字符
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
机器人操作系统 (ROS2) 和 RT-Thread 通信
4
五分钟玩转RT-Thread新社区
5
国产MCU移植系列教程汇总,欢迎查看!
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
ulog组件多端绑定的demo案例
2
记录rt-thread消息队列的调试方法
3
AT32的ADC使用
4
aht10 终端:The aht10 is under an abnormal status
5
github高阶加速,速度可达带宽峰值,测试到146Mbit/s
热门标签
RT-Thread Studio
串口
LWIP
Env
AT
SPI
Bootloader
FinSH
ART-Pi
CAN总线
Hardfault
USB
文件系统
RT-Thread
DMA
SCons
线程
MQTT
RT-Thread Nano
STM32
RTC
rt-smart
ESP8266
flash
ota在线升级
WIZnet_W5500
FAL
I2C
packages_软件包
UART
cubemx
freemodbus
潘多拉开发板_Pandora
定时器
BSP
PWM
ADC
socket
中断
rt_mq_消息队列_msg_queue
keil_MDK
SDIO
Debug
AB32VG1
MicroPython
编译报错
C++_cpp
msh
ulog
QEMU
本月问答贡献
出出啊
1501
个答案
338
次被采纳
小小李sunny
1390
个答案
276
次被采纳
张世争
715
个答案
157
次被采纳
crystal266
522
个答案
153
次被采纳
whj467467222
1216
个答案
146
次被采纳
本月文章贡献
出出啊
1
篇文章
12
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
2
篇文章
2
次点赞
crystal266
2
篇文章
5
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部