- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个 RPi (是的,我知道,也许有人认为这属于 RPi 站点,但我认为它通常与 Linux 相关,所以 StackOverflow 是正确的地方) 并且我'我使用 Python3 和 pySerial 通过 MAX485 在一些 Arduinos 之间进行通信.这或多或少是有效的,因为我发现我需要做一些奇怪的解决方法才能让一切“正常”工作。
如果我发送数据:
GPIO.output(23, 1) # Pulling transmit pin high to send
comport.write("Some data".encode()) # Writing data
comport.flush() # Flushing the buffer
GPIO.output(23, 0) # Pulling pin down to receive
Arduino 收到数据并立即响应,但由于 pySerial 不知何故还没有准备好,它什么也没有返回,我们有一个丢失的数据包。
但是,如果我这样尝试:
GPIO.output(23, 1)
comport.write("Some data".encode())
time.sleep(.001) # Add some delay of only 1ms
comport.flush()
GPIO.output(23, 0)
然后数据被发送和接收。这让我想到了一个问题:flush
命令是否正常工作?我尝试这样做:
GPIO.output(23, 1)
comport.write("Some data".encode())
time.sleep(.001) # Add some delay
# -- No flush --
GPIO.output(23, 0)
令人惊讶的是它也有效。似乎 sleep “取代”了 flush
命令。
为什么 pySerial 的缓冲区没有刷新?我知道,这可能是一种方法,但sleep
只会添加一段(通常)不必要的代码,导致整个代码等待(超过 500 行)并且这不是很好。
我已经在网上搜索过了,有人说是 USB TTL Adapter 不支持 flush
ing(这里不是这种情况,这个是板载的),其他人说可能是 Linux 内核错误,所以对我来说没有任何意义。
如果有人可以解释为什么 flush 命令不起作用以及如何让它起作用(如果有办法的话),我和这个问题的 future 访问者可能会非常高兴。
最佳答案
您没有具体说明,但我认为假设您在半双工模式下使用 MAX485 是公平的。如果是这种情况,那么您尝试做的事情将无法可靠地工作。
问题是什么?
半双工通信使用 same pair of wires向任一方向传输。但是一次只有一端可以传输。因此,这需要某种方式来协调当前传输的人员。
我相信你对这里的问题有一个很好的总结:
the Arduino receives the data and responds imediately, but because pySerial is somehow not ready yet, it becomes nothing back and there we have a lost packet.
然而,不是 PySerial 没有准备好,而是您的 MAX485 和 GPIO-23 的状态。
一切都在时机
这是从 Moxa 的一篇优秀技术说明中抄录的图片在半双工 485 上,标题为 The Secrets of RS-485 Half-duplex Communication
这张图片显示您需要在适当的时候更改 GPIO-23(这张图片中的 MASTER-RTS)的状态,否则您的通信将失败。该技术说明值得完整阅读,我相信很好地描述了您面临的挑战。
我该如何解决?
答案是,视情况而定。您的问题可能是太早或太晚切换 GPIO-23。如果可能,最简单但性能最低的方法是让您的 Arduino 在响应之前等待一段时间。这将允许您sleep()
一段时间以确保您的数据包已完成传输,然后在 Arduino 开始响应之前切换 GPIO-23 的状态。
如果此解决方案不可行或不可取,那么您将需要研究其他驱动 GPIO-23 的方法。在 SW 中还有很多其他方法可以做到这一点,有些方法会比其他方法更好。但请注意,仅使用 python 代码切换 GPIO-23 线永远不会 100% 可靠。如果需要高可靠性,几乎肯定需要某种硬件辅助。
最后一点,除非需要 RS-485,否则您可以考虑使用 RS-422 或什至 RS-232 的全双工。
关于linux - 串行端口未正确刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43681253/
我想知道两者都可以 UnicastRemoteObject.exportObject(Remote,portNo) & LocateRegistry.createRegistry(portNo); p
我有一个运行 tomcat 8.0.23 和 apache httpd 服务器的 vps。在 tomcat 中我有 3 个项目让我们用下面的名字来调用它们: /firstpro /secondpro
我试图将非 SSL 端口 8080 上的流量重定向到 SSL 端口 8443(在 Jboss 4.2.3.GA 版本上),但它不起作用。当我在此端口上访问我的 web 应用程序时,它会停留在该端口上并
跟进: Possible to query the native inbox of a mobile from J2ME? 我怎么知道Kannel将 SMS 发送到 native 收件箱端口(我想是端
我想用 python 开发一个代码,它将在本地主机中打开一个端口并将日志发送到该端口。日志只是 python 文件的命令输出。 喜欢: hello.py i = 0 while True:
我的 tomcat 在我的 linux 机器上独立运行在端口 7778 上。我已经将 apache 配置为在端口 443 上的 ssl 上运行。 我的 httpd.conf 如下: Liste
我正在使用 React Native 作为我想要部署到 iOS 和 Android 的头像生成器。我正在为我的服务器使用 Express,它使用 localhost:3000,react native
我正在使用主板(MSI Gaming主板)和两个支持NIC卡的e1000e驱动程序构建自定义操作系统。我想使用NIC卡中的端口而不是板载端口。 为了禁用板载端口,我尝试使用 70-persistanc
我目前使用的是xampp 1.7.0,我的php版本是5.2.8 我将我的 php.ini 文件更改为: [mail function] ; For Win32 only. SMTP = smtp.g
我有以下代码来配置 Jetty 服务器: @Configuration public class RedirectHttpToHttpsOnJetty2Config { @Bean p
我使用 Ubuntu 使用 Certbot 生成了一个 SSL。这已经自动更新了我的 Nginx 配置文件并添加了一个额外的监听端口。我担心我是否只需要监听一个端口(80 或 443)而不是两个端口,
我被困在一个点,我必须调用 pentaho API 来验证来自 reactJS 应用程序的用户。两者都在我的本地机器上。到目前为止我尝试过的事情: a) 在 reactJS 配置文件 - packag
我的 native 项目在 android 模拟器上运行 但是每当我尝试将我的项目与我的 android 设备连接时,就会出现上述错误。 注意:我的手机和笔记本电脑使用相同的 wifi 连接。 请帮我
我正在运行 Elasticsearch 服务器。除了 9200/9300 端口外,Elasticsearch 还开放了很多端口,如下所示。 elasticsearch-service-x64.exe
<portType> 元素是最重要的 WSDL 元素 <portType>可描述一个 web service、可被执行的操作,以及相关的消息 我们可以把 <portT
Stack Overflow 的其他地方有一个关于让 Icecast 出现在端口 80 上的问题,我已经阅读了该问题,但仍然无法让我的服务器在端口 80 上工作。 我的 icecast.xml 有这些
如果这是一个简单的问题,我很抱歉,我对这种事情不熟悉。 我正在尝试确定我的代理服务器 ip 和端口号,以便使用 google 日历同步程序。我使用谷歌浏览器下载了 proxy.pac 文件。最后一行是
我想知道 cassnadra 是否对所有 JMX 连接/节点间通信使用 7199 端口?与早期版本一样,7199 仅用于初始握手,但后来它使用随机选择 1024-65355 端口之间的任何端口。 谢谢
在docker hub中,有一个容器,该容器在启动时会默认打开9000端口。可以通过传递环境变量server__port来覆盖该端口。 我正在尝试在dockerfile中传递Heroku $ PORT
我已经在互联网上公开的虚拟机中安装了 docker。我已经在 VM 的 docker 容器中安装了 mongodb。Mongodb 正在监听 27017港口。 我已经使用以下步骤安装 docker
我是一名优秀的程序员,十分优秀!