Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在Linux&;上迭代com端口并打印到控制台;C++;?_C++_Linux_Loops_Serial Port - Fatal编程技术网

C++ 如何在Linux&;上迭代com端口并打印到控制台;C++;?

C++ 如何在Linux&;上迭代com端口并打印到控制台;C++;?,c++,linux,loops,serial-port,C++,Linux,Loops,Serial Port,我觉得这应该是相当容易的,但它继续困扰着我,所以它在这里。我一直在试图找到一个简单的解决方案,迭代linux上可用的UART串行端口(我运行的是最新版本的Manjaro linux),然后将这些端口打印到控制台。然而,到目前为止,我发现的所有解决方案都令人难以置信地复杂,或者它们最终抛出了一堆我在测试它们时无法弄清楚的错误 所以,我求助于回到这里,看看是否还有其他人有任何想法。在Windows上,有一个Windows的System::IO::Ports的GetPortNames(),也许一个类似

我觉得这应该是相当容易的,但它继续困扰着我,所以它在这里。我一直在试图找到一个简单的解决方案,迭代linux上可用的UART串行端口(我运行的是最新版本的Manjaro linux),然后将这些端口打印到控制台。然而,到目前为止,我发现的所有解决方案都令人难以置信地复杂,或者它们最终抛出了一堆我在测试它们时无法弄清楚的错误

所以,我求助于回到这里,看看是否还有其他人有任何想法。在Windows上,有一个Windows的
System::IO::Ports
GetPortNames()
,也许一个类似的API调用将是最理想的

更新:


因此,在收到答案并使用这些信息了解更多关于在linux上与串行端口交互的信息后,我最终找到了一种很好的方法来实现这种效果,即遍历可用端口。它不像一行命令那么简单,但是它可以工作,所以我觉得它很好。我在/sys/class/tty目录中找到了这种迭代/排序方法,作为对另一个问题的回答(我使用的代码的作者名叫瑟伦·霍姆),您可以看看这一点。

两种简单的可能性:

  • linux上的串行端口是字符设备文件,您可以在
    /dev/ttyS*
    上看到它们。usb设备创建的串行端口位于
    /dev/ttyUSB*
    中。这将把您的问题简化为直接的迭代

  • 还有一个名为sysfs的东西,它本质上是一个运行时的、非持久的内核内部注册表,通过虚拟文件系统导出到用户空间。通常它安装在
    /sys
    下面。在
    /sys/bus/serio/devices
    下面,您可以找到这些设备


  • 关于可能性#1下列出的dirent迭代,/dev目录包含更多的文件,并非所有文件都是串行端口,因此我设想,通过迭代这些文件并返回目录中的所有条目,我需要以某种方式筛选这些文件并找到真正的串行端口。在我对文件进行迭代之后,我将如何通过编程来确定文件的性质?经过一些搜索,我实际上找到了一个解决方案,作为进行迭代的一种方法(我将为最终可能遇到这个问题的任何人更新上面的问题)。感谢您为我指明了正确的方向,我将此标记为correct是的,但不太多,而且/dev也是一个虚拟文件系统,大约十年来,因此您可以非常快速地阅读其内容。好吧,你不必担心你可能错过了一个串行设备,或者你打开了一个非串行设备,尽管这是可能的(你可以简单地将它们重命名/删除为root),但我一生中从未遇到过这样的情况。但是,如果你想100%确定,那么你可以尝试调用一个只读
    ioctl()
    仅在串行端口上可用。例如,询问他们的比特率或数据停止奇偶校验设置。如果它返回错误,则它不是串行设备。我怀疑,您甚至可以在大约20行代码中重新实现
    GetPortNames()
    调用。