我正在寻找工业串口转USB转换器.我想在我的JAVA应用程序中使用它来与各种设备进行通信.因此,串行适配器必须为RS232,RS422和RS485提供模式.此外,应该有一个库,使我能够启用和禁用串行适配器中的缓冲区.
我尝试了MOXA Uport 1150,它做得很好.此适配器的问题是,无法在Java应用程序中更改串行模式(232,422,485),也无法启用/禁用MOXA的缓冲区.
我希望有一个人可以帮助我!
迈克尔
我的任务是通过RS485 2线系统实现ModBus协议.(实际上它是三根线,A/B和GND).虽然ModBus不是重点,但是之前的步骤......界面上的简单I/O.
我正在使用FTDI USB-RS485转换器将Linux主机(不可互换)连接到Windows主机(可与其他Linux主机互换,但我想避免这种情况)
编码应该是19200,8,n,1.但它似乎不起作用.
我没有准确的代码,但在Linux上我这样做:
int fd = open("/dev/ttyS3", O_RDWR | O_CTTY);
if(fd == -1) return "Error while opening the port";
Run Code Online (Sandbox Code Playgroud)
接下来,我配置端口.
struct termios tty;
tcgetattr(fd, &tty);
cfsetispeed(&tty, B19200);
cfsetospeed(&tty, B19200);
tty.c_cflag = CS8; //Empties the cflags and sets the character width.
tty.c_cflag |= (CLOCAL | CREAD); //Sets 'recommended' options.
tty.c_lflag = 0;
tty.c_iflag = 0;
tty.c_oflag = 0;
tcgetattr(fd, TCSANOW, &tty);
Run Code Online (Sandbox Code Playgroud)
奇偶校验和流量控制目前尚未规划,因为最终结果将连接到低级别的电路板,我需要自己处理信号.此外,没有任何电线,这将允许"不受约束的通信".(毕竟我不希望XON/XOFF字符限制我可以传输的字节范围)
所有这些功能都能正常运行并设置数据.
在Windows上,我打开这样的串口:
DCB SP;
HANDLE hSerial = CreateFile("COM6", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); …
Run Code Online (Sandbox Code Playgroud) 我试图在ARM板上使用UART连接从RS485适配器读取寄存器但没有成功
机
连接器
从设备连接到ARM板
能量功率计< - rx/tx电缆 - > SENA RS485适配器< - 串行公/公适配器+串口到迷你串行电缆 - > ARM板迷你串口
看到设置的图像:
使用的设备树: am335x-sbc-t335.dts
设备树资源: http ://get-album.com/dts/
从设备连接到PC
能量功率计< - 2线rx/tx - > SENA RS485适配器< - > PC
注意:主板上的迷你串口与用于串口控制台通信的端口相同(在波特115200上) - 这没有问题
下面是使用libmodbus库从连接的从设备读取第一个寄存器的ac代码
libmodbus_test.c - 从设备读取和打印第一个reigster:
#include <sys/types.h>
#include <string.h>
#include <modbus.h> …
Run Code Online (Sandbox Code Playgroud) 有人可以建议用于Microchip PIC18处理器的Modbus RTU从器件的开源实现吗?我正在寻找用于RS-232/RS-485的Modbus RTU的实现,但也欢迎Modbus TCP/IP实现.
我的大脑是炒的,所以我想我会把这个传给社区.
当向我的嵌入式系统发送1个字符时,它始终认为它接收2个字符.第一个接收的字符似乎映射到传输的字符(以某种未知的方式),第二个接收的字符总是0xff.
这是我观察到的:
Tx char (in hex) Rx character (in hex), I left out the second byte (always ff)
31 9D
32 9B
33 99
61 3D
62 3B
63 39
64 37
65 35
41 7D
42 7B
43 79
Run Code Online (Sandbox Code Playgroud)
我检查了我的时钟,它们似乎没问题.这个非工作版本与之前版本的唯一区别是我现在使用的是RS485芯片.
我已将信号一直跟踪到MCU并且看起来很好(确认了RX引脚上的位值)
不熟悉Modbus并使用Modbus RTU开发应用程序.我想知道如何找出RTU消息帧分离时间.在Modbus RTU规范中,它提到了3.5个字符时间,但没有更多关于我如何决定这个间隔的数据.和wat是计算分离时间的步骤?
我正在尝试使用运行 Angstrom(3.8 内核)的 Beaglebone Black 与位于 9600-N-8-1 的半双工 RS-485 网络上的设备进行通信。
我正在尝试使用与此类似的 RS-485 分线板:https : //www.sparkfun.com/products/10124,但芯片是 MAX3485 http://www.maximintegrated.com/datasheet/index .mvp/id/1079。我购买了预先组装有引脚和端子条的电路板。我的一个朋友用示波器对其进行了测试,并声称 RS-485 板确实可以工作。该板有五个连接到 BBB 的引脚。3-5V(电源)、RX-I、TX-O、RTS 和 GND。
我在 BBB 上禁用了 HDMI 支持,以便UART4_RTSn
和UART4_CTSn
引脚可用。
mkdir /mnt/boot
mount /dev/mmcblk0p1 /mnt/boot
nano /mnt/boot/uEnv.txt
#change contents of uEnv.txt to the following:
optargs=quiet capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN
Run Code Online (Sandbox Code Playgroud)
然后我找到了一个覆盖来启用带有 RTS/CTS 控制的 UART-4:
/*
* Modified version of /lib/firmware/BB-UART4-00A0.dtbo to add RTS so we can reset Arduinos
*/
/dts-v1/;
/plugin/;
/ {
compatible = "ti,beaglebone", "ti,beaglebone-black";
part-number = …
Run Code Online (Sandbox Code Playgroud) 我正在尝试配置我的串行端口(/dev/ttyS0)以自动控制 RTS 引脚。我已经可以通过 ioctl TIOCM_RTS 标志切换从用户空间执行此操作,但在我的情况下它太慢 - 从设备响应太快,我错过了它。
我尝试通过启用 RS485 模式来实现它,但最终出现以下错误:
unable to set IOCTL:: Inappropriate ioctl for device
Run Code Online (Sandbox Code Playgroud)
我的实现
port_fd = open(port.c_str(), O_RDWR);
if (port_fd != -1) {
struct serial_rs485 rs485conf={0};
rs485conf.flags |= SER_RS485_ENABLED;
rs485conf.flags |= SER_RS485_RTS_ON_SEND;
rs485conf.delay_rts_before_send = 0;
int rv = ioctl(port_fd,TIOCSRS485, &rs485conf);
if(rv){
printf("rv = %d\n", rv);
perror("unable to set IOCTL:");
}
Run Code Online (Sandbox Code Playgroud)
dmesq 输出:
[ 0.000000] console [tty0] enabled
[ 1.338716] 00:01: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a 16550A
[ …
Run Code Online (Sandbox Code Playgroud) 我正在尝试通过在两台 Linux 计算机之间发送数据来学习 RS-485 接口。主计算机运行ubuntu16.04,另一台运行基于内核4.19的debian系统。
主PC有一个USB转RS-485适配器,另一台PC有RS-485接口。
最初我以为我可以简单地在界面上回显数据,但我不能。如果我连接到 picocom,我可以输入数据但不能发送它。通过环顾四周,我意识到这是因为两台电脑都在等待 RTS,需要以某种方式进行切换。
然后我得出结论,我需要某种 C 程序来初始化接口(如果我错了,请纠正我)。
我去了https://www.kernel.org/doc/Documentation/serial/serial-rs485.txt 其中是设置 RS-485 的示例代码。
但是,当我尝试运行时,它总是失败:
status = ioctl(fd,TIOCSRS485, &ctrl485);
if (status) {
printf("ERROR PORT 1! TIOCSERSETRS485 failed %i", status);
return -1;
}
Run Code Online (Sandbox Code Playgroud)
我已经用谷歌搜索了我能想到的所有 RS-485 组合,但大多数信息都是关于 modbus 和传感器的。我还阅读了有关 ioctl 的内容,但我仍然陷入困境。
如果有人有经验或建议,我将非常感激。
最好的问候,W
问题
pymodbus主站/客户端可以向从站/服务器发送请求。从属/服务器使事物准备好返回,并正在等待主/客户端将它们捡起。尽管服务器/从机已准备就绪,但主服务器/客户端仅返回错误“ Modbus错误:[输入/输出] Modbus错误:[无效消息]接收到的消息不完整,预期至少2个字节(接收到0个字节)”。
设定
我使用带有此适配器的笔记本电脑作为服务器/从机:https : //www.amazon.com/dp/B076WVFXN8/ref=twister_B076X1BS4H?_encoding=UTF8&psc=1
我有一个Raspberry Pi 3 / BananaPi作为主服务器/客户端,并带有此适配器:https ://www.aliexpress.com/item/32781613765.html?spm=a2g0s.9042311.0.0.1aec4c4d0EXx8M
我下面本教程的大部分的设置,除了Arduino是交换与笔记本电脑适配器:https://circuitdigest.com/microcontroller-projects/rs485-serial-communication-between-arduino-and-raspberry-pi - Raspberry的针脚连接方法与本教程中的相同。
我在笔记本电脑上将此程序作为服务器/从机:
#!/usr/bin/env python
from pymodbus.server.sync import StartTcpServer
from pymodbus.server.sync import StartUdpServer
from pymodbus.server.sync import StartSerialServer
from pymodbus.device import ModbusDeviceIdentification
from pymodbus.datastore import ModbusSequentialDataBlock, ModbusSparseDataBlock
from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext
from pymodbus.transaction import ModbusRtuFramer, ModbusBinaryFramer
import logging
FORMAT = ('%(asctime)-15s %(threadName)-15s'
' %(levelname)-8s %(module)-15s:%(lineno)-8s %(message)s')
logging.basicConfig(format=FORMAT)
log = logging.getLogger()
log.setLevel(logging.DEBUG)
def run_server():
slave_store1 = ModbusSlaveContext(co=ModbusSequentialDataBlock(0, [1]*16))
slave_store2 = ModbusSlaveContext(di=ModbusSequentialDataBlock(0, [1]*16))
slave_store3 …
Run Code Online (Sandbox Code Playgroud)