Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.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++应用程序。这是一个重要的需求,因为它使用modbus通过无线电传输接收消息,并且传输结束时间由3.5个字符长度的持续时间定义,因此我必须能够逐字节获取消息。目前的系统使用DOS来完成这项工作,它使用硬件中断。我们希望使用Linux作为该软件的操作系统,但我们缺乏这方面的专业知识。为此,我尝试了很多方法——首先使用非阻塞读取轮询,使用具有非常短超时值的select,将串行端口的读取缓冲区大小设置为一个字节,甚至在SIGIO上使用信号处理程序,但这些方法都不能完全满足我的要求。我的老板告诉我,我们当前运行的DOS应用程序使用硬件中断来获取通知,当有东西可以从串行端口读取并且可以直接访问硬件时。是否有任何方法可以从用户空间Linux应用程序获得此功能?如果我编写了一个自定义驱动程序,我能做到这一点吗(尽管我以前从未这样做过,而且对内核的工作原理几乎一无所知)??。我听说Linux是用于硬件控制和嵌入式设备的非常流行的操作系统,所以我猜这种事情一定有可能以某种方式实现,但到目前为止,我已经花了数周的时间来研究这个问题,仍然不知道如何最好地继续。_C++_Linux_Serial Port_Hardware_Embedded Linux - Fatal编程技术网

获取串行端口已准备好从中读取的通知 我必须编写一个从字节序列读取的C++应用程序。这是一个重要的需求,因为它使用modbus通过无线电传输接收消息,并且传输结束时间由3.5个字符长度的持续时间定义,因此我必须能够逐字节获取消息。目前的系统使用DOS来完成这项工作,它使用硬件中断。我们希望使用Linux作为该软件的操作系统,但我们缺乏这方面的专业知识。为此,我尝试了很多方法——首先使用非阻塞读取轮询,使用具有非常短超时值的select,将串行端口的读取缓冲区大小设置为一个字节,甚至在SIGIO上使用信号处理程序,但这些方法都不能完全满足我的要求。我的老板告诉我,我们当前运行的DOS应用程序使用硬件中断来获取通知,当有东西可以从串行端口读取并且可以直接访问硬件时。是否有任何方法可以从用户空间Linux应用程序获得此功能?如果我编写了一个自定义驱动程序,我能做到这一点吗(尽管我以前从未这样做过,而且对内核的工作原理几乎一无所知)??。我听说Linux是用于硬件控制和嵌入式设备的非常流行的操作系统,所以我猜这种事情一定有可能以某种方式实现,但到目前为止,我已经花了数周的时间来研究这个问题,仍然不知道如何最好地继续。

获取串行端口已准备好从中读取的通知 我必须编写一个从字节序列读取的C++应用程序。这是一个重要的需求,因为它使用modbus通过无线电传输接收消息,并且传输结束时间由3.5个字符长度的持续时间定义,因此我必须能够逐字节获取消息。目前的系统使用DOS来完成这项工作,它使用硬件中断。我们希望使用Linux作为该软件的操作系统,但我们缺乏这方面的专业知识。为此,我尝试了很多方法——首先使用非阻塞读取轮询,使用具有非常短超时值的select,将串行端口的读取缓冲区大小设置为一个字节,甚至在SIGIO上使用信号处理程序,但这些方法都不能完全满足我的要求。我的老板告诉我,我们当前运行的DOS应用程序使用硬件中断来获取通知,当有东西可以从串行端口读取并且可以直接访问硬件时。是否有任何方法可以从用户空间Linux应用程序获得此功能?如果我编写了一个自定义驱动程序,我能做到这一点吗(尽管我以前从未这样做过,而且对内核的工作原理几乎一无所知)??。我听说Linux是用于硬件控制和嵌入式设备的非常流行的操作系统,所以我猜这种事情一定有可能以某种方式实现,但到目前为止,我已经花了数周的时间来研究这个问题,仍然不知道如何最好地继续。,c++,linux,serial-port,hardware,embedded-linux,C++,Linux,Serial Port,Hardware,Embedded Linux,我不太确定逐字节阅读如何帮助您接收分数字符,除非字符之间的间隔时间中有编码的信息,所以你需要知道他们被接收的时间 无论如何,我怀疑您将需要对串行端口内核驱动程序进行自定义修改;在一个项目中,这并不是那么糟糕,你会学到很多。您可能还需要更改UART“芯片”(实际上只是一些较大设备的一个小角落)的配置,使其在仅一个字节(即模拟16450)后中断,而不是在通常的16字节(模拟16550)缓冲区半满时中断。dos程序的代码实际上可能有帮助。如果波特率不是太快,另一种选择是在内核或实时扩展中轮询硬件(或者

我不太确定逐字节阅读如何帮助您接收分数字符,除非字符之间的间隔时间中有编码的信息,所以你需要知道他们被接收的时间

无论如何,我怀疑您将需要对串行端口内核驱动程序进行自定义修改;在一个项目中,这并不是那么糟糕,你会学到很多。您可能还需要更改UART“芯片”(实际上只是一些较大设备的一个小角落)的配置,使其在仅一个字节(即模拟16450)后中断,而不是在通常的16字节(模拟16550)缓冲区半满时中断。dos程序的代码实际上可能有帮助。如果波特率不是太快,另一种选择是在内核或实时扩展中轮询硬件(或者如果它真的很慢,可能在HF无线链路上,甚至在用户空间中)


如果我需要知道字符接收的时间,另一个选择是将接收卸载到带有双UART(或者更好,一个UART和一个USB接口)的微控制器上。然后,您可以让micro监视串行流,并将包含一个接收字符和时间戳的小数据包输出到PC(在另一个串行端口上以更快的波特率,或在USB上),甚至让它为您解码协议。这样做的好处是,它可以让您获得操作系统独立性,并且可以在传统的免费机器上工作(使用现成的USB串行加密狗,逐字节访问可能会失败)。你甚至可以用一些便宜的评估板来制作,而不必制造任何定制的硬件

谢谢你的回答。不幸的是,最后一段对我来说毫无意义。我是一名应用程序开发人员,在工作中一直处于进退两难的境地。我实际上不需要读取字节,但我需要能够检测到它们何时到达,这样我就可以检测到表示传输结束的3.5个字符长度的时间延迟。谢谢,不过你的回复中有很多有用的东西,我可以去研究一下。我想我需要买一些书……我很想建造一个缺失的脉冲检测器,你可以用arduino(或任何USB连接的微控制器)之类的东西,或者你甚至可以用模拟电路,比如555,甚至是电阻和电容器,输入并行端口的状态信号(如果您还有一个)您可以在内核中将其设置为GPIO中断,并在相应的sysfs节点上执行阻塞读取。如果您有一个真正的串行端口,则在内核中执行此操作当然也是可能的,但这些端口越来越少。认真地说,您能不能推荐一个合适的资源来开始使用嵌入式linux。2个月前,我我甚至没听说过这个表达。这对我来说并不是一个嵌入式linux项目。好吧,也许串行驱动程序mods会像这样(尽管你实际上可能不想使用串行驱动程序作为基础)。如果您的应用程序的当前版本需要未来的验证,我会大力研究arduino或类似产品作为辅助板的想法,因为您不再依赖PC平台的细节。尽管您没有提到的一件事是您需要采取什么样的延迟(以及如何采取行动)在3.5个字符的中断后。波特率是多少?57.6K波特率。我对我将使用的硬件没有发言权。最终,我要编写的软件必须使用CAN总线驱动程序和TCP套接字-串行端口方面只是硬件单元接收modbus请求的一种方式。什么(大致)定义什么是嵌入式linux项目?