您尚未登录。

#1 2018-11-15 18:19:40

zhen8838
会员
注册时间: 2018-01-19
已发帖子: 32
积分: 32

单片机程序移植到Linux下,串口接收什么方式比较好?

我现在移植一个单片机程序到Linux下,主要是操作一个串口模块进行操作,需要在发送AT命令数据后读取串口接收,并且也要一直监听串口去读取透传过来的数据。
在单片机中,是通过串口接收中断实现的,每一位数据都存放在一个buf中。只要每次发送AT后等待一段时间即可。
现在在Linux下,我本来是想每次串口发送结束后,去read串口。但是这样的话感觉要实现一个长时间的监听透传的数据不太好。或者有好的,但我不知道。。。
现在我是准备开一个线程,去模拟串口接收中断,我在想是写无限阻塞读取1位,还是每次读取的位数多一些比较好?
或者有没有更好的实现方式,大佬们提点一下;-)

离线

#2 2018-11-15 19:04:26

basicdev
会员
注册时间: 2017-10-02
已发帖子: 159
积分: 159

Re: 单片机程序移植到Linux下,串口接收什么方式比较好?

用阻塞+线程没有问题

离线

#3 2018-11-15 22:10:22

zhen8838
会员
注册时间: 2018-01-19
已发帖子: 32
积分: 32

Re: 单片机程序移植到Linux下,串口接收什么方式比较好?

basicdev 说:

用阻塞+线程没有问题

OK 谢谢指导

离线

#4 2018-11-15 22:17:42

晕哥
管理员
注册时间: 2017-09-06
已发帖子: 9,191
积分: 9191

Re: 单片机程序移植到Linux下,串口接收什么方式比较好?

离线

#5 2018-11-16 09:02:24

zhen8838
会员
注册时间: 2018-01-19
已发帖子: 32
积分: 32

Re: 单片机程序移植到Linux下,串口接收什么方式比较好?

谢谢晕哥指导:-)

离线

#6 2021-03-25 16:10:58

szchen2006
会员
注册时间: 2019-10-09
已发帖子: 195
积分: 195

Re: 单片机程序移植到Linux下,串口接收什么方式比较好?

楼主,移植好了吗?

离线

#7 2021-03-25 17:33:06

JasonWoo
会员
注册时间: 2019-06-04
已发帖子: 70
积分: 68.5

Re: 单片机程序移植到Linux下,串口接收什么方式比较好?

一个线程 非阻塞模式 select + write/read 就可以啦。

离线

#8 2021-03-25 18:50:06

SdtElectronics
会员
注册时间: 2020-07-27
已发帖子: 59
积分: 357.5

Re: 单片机程序移植到Linux下,串口接收什么方式比较好?

前几天我正好也遇到这样一个需求,感觉每次read 1byte的系统调用overhead太大了,于是在StackOverflow上问了这个问题,得到了一个相当详尽的解答,结论是有办法控制阻塞模式下串口一次read的最小数据量。答者还指出使用select()或poll()+非阻塞模式是非常不可取的方法:

If your program uses non-blocking mode but does not perform useful work while waiting for data, and instead uses select() or poll() (or even worse calls sleep()), then your program is unnecessarily complex and ineffecient.

不想读大段的英文也没关系,我正准备写一篇文章来分享自己读完那个答案之后的心得

离线

#9 2021-03-26 10:31:43

海石生风
会员
注册时间: 2019-07-02
已发帖子: 2
积分: 2

Re: 单片机程序移植到Linux下,串口接收什么方式比较好?

简单来说,单独开一条线程来接收,如果只接收一个串口就用阻塞式、如果要同时接收多个串口就用select或poll;收到期望的数据后就发消息或信号来告知其他线程。

离线

#10 2021-03-26 10:47:49

JasonWoo
会员
注册时间: 2019-06-04
已发帖子: 70
积分: 68.5

Re: 单片机程序移植到Linux下,串口接收什么方式比较好?

他这个说的是有前提的,如果有多个串口,一个线程同时处理多个串口的读和写,不用poll你是怎么实现的。而且对于读+写的场景,阻塞的方式真的是最高效的么?

SdtElectronics 说:

前几天我正好也遇到这样一个需求,感觉每次read 1byte的系统调用overhead太大了,于是在StackOverflow上问了这个问题,得到了一个相当详尽的解答,结论是有办法控制阻塞模式下串口一次read的最小数据量。答者还指出使用select()或poll()+非阻塞模式是非常不可取的方法:

If your program uses non-blocking mode but does not perform useful work while waiting for data, and instead uses select() or poll() (or even worse calls sleep()), then your program is unnecessarily complex and ineffecient.

不想读大段的英文也没关系,我正准备写一篇文章来分享自己读完那个答案之后的心得

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn