我正在通过串行端口使用 QModbusDevice 编写一个小程序(使用 QModbusRtuSerialMaster 类)并且遇到了一些问题。
其中一个问题好像是串口的流控不对。检查串行端口嗅探器,我看到工作客户端在发送请求时将 RTS 设置为打开,然后关闭 RTS 以接收回复。当我使用 QModbusRtuSerialMaster 发送没有发生的消息时。
与工作客户端相比,消息被正确发送(有时,是另一个问题的主题)。只是控制流不起作用,导致服务器无法回复。
我已将相关 COM 端口的 Windows 端口设置设置为硬件流量控制,但没关系,嗅探器仍然报告没有流量控制。
有没有办法让QModbusRtuSerialMaster按照我的意愿设置流量控制?或者有没有办法手动处理流量控制(这是工作客户端所做的)?或者是跳过 Qt modbus 类并直接使用串口自己编写的唯一解决方案?
我正在做的事情的简短总结...
首先初始化QModbusRtuSerialMaster对象:
QModbusDevice* modbusDevice = new QModbusRtuSerialMaster(myMainWindow);
modbusDevice->setConnectionParameter(QModbusDevice::SerialPortNameParameter, "COM3");
modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter, QSerialPort::NoParity);
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter, QSerialPort::Baud115200);
modbusDevice->setConnectionParameter(QModbusDevice::SerialDataBitsParameter, QSerialPort::Data8);
modbusDevice->setConnectionParameter(QModbusDevice::SerialStopBitsParameter, QSerialPort::OneStop);
modbusDevice->setTimeout(100);
modbusDevice->setNumberOfRetries(3);
modbusDevice->connectDevice();
然后我如何发送请求:
auto response = modbusDevice->sendReadRequest(QModbusDataUnit(QModbusDataUnit::Coils, 0, 1), 1);
最佳答案
QtModbus 没有实现 RTS 线路的自动切换,因为它希望您的硬件自行完成(使用专用线路)。
大多数 RS485 转换器(即使是便宜的)都应该是这种情况。如果你有一个单独的收发器,比如 this one,你只需要 RTS 线。带有 DE/~RE 输入。
如果您使用的是 Linux 并且有一些特定的硬件,您可以尝试使用 RS485 mode自动为您切换 RTS 线路。但你似乎不在 Linux 上,支持的硬件肯定非常有限。
您也可以使用 port.setRequestToSend(true) 手动切换线路,参见 here .但请注意,根据您正在通话的设备的时间需求,此软件解决方案可能不是很可靠。这个特殊问题已被详细讨论 here .也看看我的答案中的链接,我用 libmodbus 做了一些基准测试,结果很好。
在驱动程序上启用或禁用流量控制不会对此问题产生任何影响,因为这实际上不是流量控制问题,而是方向控制问题。 Modbus 经常在双线半双工链路上运行,这意味着您需要一种方法来指示允许哪个设备始终在总线上通话。来自 RS232 端口的 RTS(流量控制)可作为软件变通方案用于此目的。
最后,如果您将收发器替换为 one 就不会那么令人头疼了。支持硬件方向控制。如果你有一个带有 FTDI 引擎的串口,你应该可以使用 TXEN 线来达到这个目的。有时,此硬件线未直接路由且在引脚上可用,但您可以使用 MProg 重新路由它。 .
我想强调一下,您没有提到您是否在 RS485 上运行 Modbus。我想假设你是公平的,但如果你只有几个设备彼此相邻,你可能会使用 RS232(即使在 TTL 电平上)而忘记方向控制(你将使用三根线运行全双工:TX , RX 和 GND)。
关于c++ - Qt modbus串口流控处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57732275/
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我对图像处理完全陌生。我对JPEG内部是什么以及它是如何工作一无所知。我想知道,是否可以在某处找到执行以下简单操作的ruby代码:打开jpeg文件。遍历每个像素并将其颜色设置为fx绿色。将结果写入另一个文件。我对如何使用ruby-vips库实现这一点特别感兴趣https://github.com/ender672/ruby-vips我的目标-学习如何使用ruby-vips执行基本的图像处理操作(Gamma校正、亮度、色调……)任何指向比“helloworld”更复杂的工作示例的链接——比如ruby-vips的github页面上的链接,我们将不胜感激!如果有ruby-
我有一个super简单的脚本,它几乎包含了FayeWebSocketGitHub页面上用于处理关闭连接的内容:ws=Faye::WebSocket::Client.new(url,nil,:headers=>headers)ws.on:opendo|event|p[:open]#sendpingcommand#sendtestcommand#ws.send({command:'test'}.to_json)endws.on:messagedo|event|#hereistheentrypointfordatacomingfromtheserver.pJSON.parse(event.d
我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“
我正在尝试解析网页,但有时会收到404错误。这是我用来获取网页的代码:result=Net::HTTP::getURI.parse(URI.escape(url))如何测试result是否为404错误代码? 最佳答案 像这样重写你的代码:uri=URI.parse(url)result=Net::HTTP.start(uri.host,uri.port){|http|http.get(uri.path)}putsresult.codeputsresult.body这将打印状态码和正文。
有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=
出于某种原因,heroku尝试要求dm-sqlite-adapter,即使它应该在这里使用Postgres。请注意,这发生在我打开任何URL时-而不是在gitpush本身期间。我构建了一个默认的Facebook应用程序。gem文件:source:gemcuttergem"foreman"gem"sinatra"gem"mogli"gem"json"gem"httparty"gem"thin"gem"data_mapper"gem"heroku"group:productiondogem"pg"gem"dm-postgres-adapter"endgroup:development,:t