Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

串口读多个寄存器模拟器直接死机 #8

Open
vip404 opened this issue Jul 16, 2020 · 5 comments
Open

串口读多个寄存器模拟器直接死机 #8

vip404 opened this issue Jul 16, 2020 · 5 comments

Comments

@vip404
Copy link

vip404 commented Jul 16, 2020

平台安卓:4.4.2
操作:读多个保持寄存器

现象:死机;但是读单个没有问题,modbustcp读多个不会死机
大佬有没有遇到啊?

@autukill
Copy link

这个问题, 我研究了两周, 花了很多精力. 我本身不搞 android, 但项目遇到 andrid modbus rtu. 根据 pc 端 modbus 经验, 在 android 不会有什么问题. 但还是花了很多时间, 走了很多弯路, 没有从串口出发, 尝试了 Xamarin Android 来搞, 发现也卡在读多个保持寄存器

全网搜了下, 没有解决方案:

  1. 这个文章的评论有涉及, 提到使用 Genymotion. https://blog.csdn.net/Shirley0207/article/details/100544726
  2. stackoverflow 没有人回复

先说结论: 排除 root\权限 等各种因素, 问题出在 Android 模拟器, 必须使用其他模拟器, 我电脑只有雷电模拟器才正常

解决经过
1.Android Studio的模拟器
直接通过 adb shell 向 ModSim32 读多个保持寄存器
echo -en "\x01\x03\x00\x00\x00\x64\x44\x21" > /dev/ttyS1
执行这个命令, android emulator 直接卡死了, adb shell 连跳几个错误后崩溃:
detected a hanging thread 'QEMU2 main loop'

如果读一个保持寄存器, 是能够正常取值的. 之后的测试都可以使用以上这条命令.

2.尝试 Genymotion
他用的是 virtualbox, 我从 Android 5 到 Android 9 都试了边. 要么无法启动卡在 booting, 要么也是串口崩溃.
比如引导卡在: Running second stage...
比如引导卡在: cannot find '/system/bin/vinput_seamless', disabling 'vinput_seamless'

Genymotion 兼容性不好

3.雷电模拟器
安装Genymotion时, 附带给我安装了 VirtualBox. 联想到以前打游戏安装了雷电, 这些模拟器也用 virtualbox. 运行并查看雷电模拟器的设置界面, 没有找到串口配置. 就到雷电安装路径下找虚拟机文件, 发现了\LDPlayer64\vms\leidian0\leidian.vbox. VirtualBox 可以编辑这个文件 (vbox是xml格式), 串口配置好之后, 再把 leidian.vbox 修改为只读文件. 因为雷电模拟器启动时候会覆盖这个文件.
可以直接文本编辑加上串口配置:
<Port slot="1" enabled="true" IOBase="0x2f8" IRQ="3" path="COM3" hostMode="HostDevice"/>
表示: VirtualBox 开启端口2, 对应本机 COM3, 虚拟机默认对应ttyS1. 可以通过虚拟串口驱动看到, 雷电模拟器使用[9600-N-1]

@vip404
Copy link
Author

vip404 commented Mar 16, 2022

感谢!的确是模拟器问题,在真实机器上不会有同样的问题;哈哈哈,同样不是搞安卓的,当时也花了很长时间去尝试解决这个问题,甚至换库都是解决不了,最后发现真实机器上正常就没继续琢磨了,再次感谢!

@lintianlin
Copy link

这个问题, 我研究了两周, 花了很多精力. 我本身不搞 android, 但项目遇到 andrid modbus rtu. 根据 pc 端 modbus 经验, 在 android 不会有什么问题. 但还是花了很多时间, 走了很多弯路, 没有从串口出发, 尝试了 Xamarin Android 来搞, 发现也卡在读多个保持寄存器

全网搜了下, 没有解决方案:

  1. 这个文章的评论有涉及, 提到使用 Genymotion. https://blog.csdn.net/Shirley0207/article/details/100544726
  2. stackoverflow 没有人回复

先说结论: 排除 root\权限 等各种因素, 问题出在 Android 模拟器, 必须使用其他模拟器, 我电脑只有雷电模拟器才正常

解决经过 1.Android Studio的模拟器 直接通过 adb shell 向 ModSim32 读多个保持寄存器 echo -en "\x01\x03\x00\x00\x00\x64\x44\x21" > /dev/ttyS1 执行这个命令, android emulator 直接卡死了, adb shell 连跳几个错误后崩溃: detected a hanging thread 'QEMU2 main loop'

如果读一个保持寄存器, 是能够正常取值的. 之后的测试都可以使用以上这条命令.

2.尝试 Genymotion 他用的是 virtualbox, 我从 Android 5 到 Android 9 都试了边. 要么无法启动卡在 booting, 要么也是串口崩溃. 比如引导卡在: Running second stage... 比如引导卡在: cannot find '/system/bin/vinput_seamless', disabling 'vinput_seamless'

Genymotion 兼容性不好

3.雷电模拟器 安装Genymotion时, 附带给我安装了 VirtualBox. 联想到以前打游戏安装了雷电, 这些模拟器也用 virtualbox. 运行并查看雷电模拟器的设置界面, 没有找到串口配置. 就到雷电安装路径下找虚拟机文件, 发现了\LDPlayer64\vms\leidian0\leidian.vbox. VirtualBox 可以编辑这个文件 (vbox是xml格式), 串口配置好之后, 再把 leidian.vbox 修改为只读文件. 因为雷电模拟器启动时候会覆盖这个文件. 可以直接文本编辑加上串口配置: <Port slot="1" enabled="true" IOBase="0x2f8" IRQ="3" path="COM3" hostMode="HostDevice"/> 表示: VirtualBox 开启端口2, 对应本机 COM3, 虚拟机默认对应ttyS1. 可以通过虚拟串口驱动看到, 雷电模拟器使用[9600-N-1]

你好,请教一下,为什么我是用雷电模拟器以后,点击“连接”按钮没反应呢,我的串口已经绑定成功了,在虚拟串口工具上已经可以看到,雷电模拟器对应的[9600-N-1]。我是用系统自带的模拟器是可以连接成功,也能读取单个寄存器,只是在读取多个寄存器的时候也会出现死机的情况。但是我用雷电模拟器按照你说的那样配置以后,进入应用出现了“连接”按钮点击没反应的情况。

@lintianlin
Copy link

lintianlin commented Aug 2, 2022

这个问题, 我研究了两周, 花了很多精力. 我本身不搞 android, 但项目遇到 andrid modbus rtu. 根据 pc 端 modbus 经验, 在 android 不会有什么问题. 但还是花了很多时间, 走了很多弯路, 没有从串口出发, 尝试了 Xamarin Android 来搞, 发现也卡在读多个保持寄存器
全网搜了下, 没有解决方案:

  1. 这个文章的评论有涉及, 提到使用 Genymotion. https://blog.csdn.net/Shirley0207/article/details/100544726
  2. stackoverflow 没有人回复

先说结论: 排除 root\权限 等各种因素, 问题出在 Android 模拟器, 必须使用其他模拟器, 我电脑只有雷电模拟器才正常
解决经过 1.Android Studio的模拟器 直接通过 adb shell 向 ModSim32 读多个保持寄存器 echo -en "\x01\x03\x00\x00\x00\x64\x44\x21" > /dev/ttyS1 执行这个命令, android emulator 直接卡死了, adb shell 连跳几个错误后崩溃: detected a hanging thread 'QEMU2 main loop'
如果读一个保持寄存器, 是能够正常取值的. 之后的测试都可以使用以上这条命令.
2.尝试 Genymotion 他用的是 virtualbox, 我从 Android 5 到 Android 9 都试了边. 要么无法启动卡在 booting, 要么也是串口崩溃. 比如引导卡在: Running second stage... 比如引导卡在: cannot find '/system/bin/vinput_seamless', disabling 'vinput_seamless'
Genymotion 兼容性不好
3.雷电模拟器 安装Genymotion时, 附带给我安装了 VirtualBox. 联想到以前打游戏安装了雷电, 这些模拟器也用 virtualbox. 运行并查看雷电模拟器的设置界面, 没有找到串口配置. 就到雷电安装路径下找虚拟机文件, 发现了\LDPlayer64\vms\leidian0\leidian.vbox. VirtualBox 可以编辑这个文件 (vbox是xml格式), 串口配置好之后, 再把 leidian.vbox 修改为只读文件. 因为雷电模拟器启动时候会覆盖这个文件. 可以直接文本编辑加上串口配置: <Port slot="1" enabled="true" IOBase="0x2f8" IRQ="3" path="COM3" hostMode="HostDevice"/> 表示: VirtualBox 开启端口2, 对应本机 COM3, 虚拟机默认对应ttyS1. 可以通过虚拟串口驱动看到, 雷电模拟器使用[9600-N-1]

你好,请教一下,为什么我是用雷电模拟器以后,点击“连接”按钮没反应呢,我的串口已经绑定成功了,在虚拟串口工具上已经可以看到,雷电模拟器对应的[9600-N-1]。我是用系统自带的模拟器是可以连接成功,也能读取单个寄存器,只是在读取多个寄存器的时候也会出现死机的情况。但是我用雷电模拟器按照你说的那样配置以后,进入应用出现了“连接”按钮点击没反应的情况。

打断点发现,初始化的时候,在ModbusWorker.java文件的init(final ModbusParam param, final ModbusCallback callback)方法中正常流程是走onNext(ModbusMaster modbusMaster)方法,但是在安装在雷电模拟器中点击“连接”按钮后,走了void onSubscribe(Disposable d)方法。。。

@autukill
Copy link

@lintianlin
你先确保通过 adb 发送是正常的:

直接通过 adb shell 向 ModSim32 读多个保持寄存器
echo -en "\x01\x03\x00\x00\x00\x64\x44\x21" > /dev/ttyS1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants