首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux下应用层操作UART的四种方式

作者:亚洲程序员盟主

串口文件

在linux中,针对所有的周边设备都提供了设备文件供用户访问,所以如果要访问串口,只要打开相关的设备文件即可。

在LInux下串口文件是位于/dev下的

COM1串口一为/dev/ttyS0

COM2串口2为/dev/ttyS1

或者

COM1串口一为/dev/ttyUSB0

COM2串口2为/dev/ttyUSB1

命令查询串口:

方法1:轮询

1. 打开串口

2. 配置串口

其中,tcgetattr 和 tcsetattr 函数用于获取和设置串口参数。cfsetispeed 和 cfsetospeed 函数用于设置串口的输入和输出波特率,这里设置为 115200。options.c_cflag 表示控制标志位,用于配置串口控制参数,具体含义如下:

CLOCAL:忽略调制解调器的状态线,只允许本地使用串口。

CREAD:允许从串口读取数据。

PARENB:启用奇偶校验。&= ~PARENB则为禁用校验。

CSTOPB:使用两个停止位而不是一个。&= ~CSTOPB停止位为1。

CSIZE:表示字符长度的位掩码。在这里设置为 0,表示使用默认的 8 位数据位。

CS8:表示使用 8 位数据位。

CRTSCTS:启用硬件流控制,即使用 RTS 和 CTS 状态线进行流控制。

在示例程序中,我们将 CLOCAL 和 CREAD 标志位置为 1,表示允许本地使用串口,并允许从串口读取数据。我们将 PARENB、CSTOPB 和 CRTSCTS 标志位都设置为 0,表示不启用奇偶校验、使用一个停止位和禁用硬件流控制。最后,我们将 CSIZE 标志位设置为 0,然后将 CS8 标志位设置为 1,以表示使用 8 位数据位。

3. 读写

4. 关闭串口

完整示例

方法2:中断读取示例

上面给出的串口示例是使用轮询的方式读取串口数据,这种方式在某些场景下可能会占用大量 CPU 资源。实际上,对于 Linux 系统来说,还可以使用中断方式接收串口数据,这样可以大大减少 CPU 的占用率,并且能够更快地响应串口数据。

要使用中断方式接收串口数据,可以使用 select 函数来监听串口文件描述符的可读事件。当串口数据可读时,select 函数将返回,并且可以调用 read 函数来读取串口数据。这种方式可以避免轮询操作,只有在串口数据可读时才会执行读取操作,因此能够减少 CPU 的占用率。

以下是一个简单的使用中断方式接收串口数据的示例程序:

需要注意的是,在使用中断方式接收串口数据时,需要对串口文件描述符设置为非阻塞模式,以便在 select 函数返回时立即读取串口数据。可以使用 fcntl 函数来设置文件描述符的标志位,如下所示:

方法3:信号的方式接收数据

上述代码中,使用了 fcntl 函数将串口文件描述符设置为异步通知模式,并使用 SIGIO 信号来通知程序串口数据已经可读。当程序接收到 SIGIO 信号时,会调用 sigio_handler 函数来读取并处理串口数据。

在这段代码中,sigemptyset(&sa.sa_mask);的作用是将信号处理函数在执行时要屏蔽的信号集合清空,即将其设置为空集。

每个进程都有一个信号屏蔽字,它表示了当前被阻塞的信号集合。当一个信号被阻塞时,它将被加入到信号屏蔽字中,而当信号被解除阻塞时,它将被从信号屏蔽字中移除。如果信号处理函数在执行时需要屏蔽其他的信号,则可以使用sigaddset等函数将需要屏蔽的信号添加到信号屏蔽字中。但是,在本例中,我们需要处理的信号是SIGIO,它通常不需要被屏蔽,因此我们使用sigemptyset函数将信号屏蔽字清空,以确保在处理SIGIO信号时不会屏蔽任何其他信号。

在Linux系统中,使用sigaction函数注册信号处理函数时,可以设置一些标志来指定信号处理的行为。例如,可以使用SA_RESTART标志来指定当系统调用被信号中断时自动重启该系统调用。在本例中,由于我们并不需要设置任何标志,因此将sa.sa_flags字段设置为0即可。这表示信号处理函数不需要任何特殊的行为,只需要按照默认的方式处理信号即可。

方法4:使用线程接收串口数据:

上述代码中,创建了一个读取线程,不断读取串口数据并进行处理。主线程可以在读取线程运行的同时进行其他处理逻辑。

这是一口君的新书,感谢大家支持!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230622A03EN400?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券