完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
请问大家一个问题,串口第一次接收的时候最后一个字符是0x40,然后串口第二次接收的时候还会接收一次这个字符。如图,应该清哪个寄存器呢?第一次接收是rtthread的设备框架,第二次接收是中断服务函数里写入寄存器接收。 透传的时候发现的,发送出来的数据,每次前面都多一个字符 void USART3_IRQHandler(void) |
|
相关推荐
6个回答
|
|
我看右边那张图的数据,应是就第一条有0x40,后边的就没有了吧。
从你的代码看,应该是uart3接收数据,并直接通过uart6发出去。有几个问题: 1.具体uart3的数据是从哪里来的呢,发送方有没有多发这个0x40?正常来说中断里直接读的uart3寄存器值,应该是收到数据且进入中断的,这里多了0x40,肯定是有发这个数据的。 2.你说的第一次接收用的rt框架,第二次接收用自己写的中断,就是这个uart3么,具体他俩怎么切换的呢,同时存在还是什么; |
|
|
|
|
|
|
|
|
|
|
|
你这样实现透传的做法不好,建议使用一个线程完成两个串口间桥接,这样不破坏驱动代码的可移植性,也便于保持应用配置的灵活性(比如:uart6换为uart5)。以下是我曾经使用过和桥接器代码,可供参考。
static rt_err_t pb_vcom_rx_ind(rt_device_t dev, rt_size_t size) { pb_inst_t *hinst = (pb_inst_t *)(dev->user_data); rs485_break_recv(hinst->rs485); return(RT_EOK); } static void pb_thread_entry(void *args) { pb_inst_t *hinst = (pb_inst_t *)args; int len = 0; hinst->stop_req = 0; hinst->running = 1; hinst->vcom->user_data = hinst; rt_device_set_rx_indicate(hinst->vcom, pb_vcom_rx_ind); rs485_set_recv_tmo(hinst->rs485, RT_WAITING_FOREVER); while(1) { if (hinst->stop_req) { break; } len = rt_device_read(hinst->vcom, -1, hinst->buf, hinst->bufsize); if (len > 0) { rs485_send(hinst->rs485, hinst->buf, len); continue; } len = rs485_recv(hinst->rs485, hinst->buf, hinst->bufsize); if (len > 0) { rt_device_write(hinst->vcom, -1, hinst->buf, len); } } hinst->running = 0; } |
|
|
|
你这是rs485收到数据,转发给vcom吗?有点没看懂
|
|
|
|
就是串口有数据时向线程发事件,线程根据事件读出串口数据,发到另一个串口
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1039 浏览 0 评论
AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV
3425 浏览 0 评论
tms320280021 adc采样波形,为什么adc采样频率上来波形就不好了?
1465 浏览 0 评论
2146 浏览 0 评论
1640 浏览 0 评论
75345 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-28 16:45 , Processed in 0.862996 second(s), Total 81, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号