问题标签 [rs485]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2957 浏览

interrupt - STM32F303:在 RS485 总线冲突后重复触发 USART 中断的问题

我对 USART 行为有疑问,想知道你们是否可以提供帮助!我正在使用一个 STM32F303,它的三个 USART 正在使用中,其中 USART1 配置为异步 RS485 端口,其 DE 线自动控制。微控制器的 TX、RX 和 DE 引脚连接到 TI SN65HVD1792 RS485 收发器,该收发器向用户提供四根线(TX+、TX-、RX+、RX-)进行通信。

我正在使用中断驱动的 USART 通信,在大多数情况下都可以正常工作。但是,我在处理 RS485 链路配置为双线(TX+/RX+ 和 TX-/RX- 连接在一起,以形成用于两者的 +ve/-ve 线对的错误情况时遇到问题)传输和接收)并且总线上的多个设备尝试同时传输。发生这种情况时,STM32 将停止响应所有串行通信,直到重新上电。

仔细看看发生了什么,我看到 stm32f3xx_it.c 中的 USART1_IRQHandler 被反复调用——一遍又一遍,直到我重新启动电路板。这会调用stm32f3xx_hal_uart.c中的HAL_UART_IRQHandler(&huart1),其作用是检查发生了哪个中断(奇偶校验错误、帧错误、噪声错误、溢出、从停止中唤醒、rx寄存器不为空、tx准备好、tx完成),适当处理,然后清除中断状态。但是,这些特定中断都没有被识别为已触发 - 执行只是通过所有“if”语句,函数退出,然后再次运行 - 无休止。

我找不到任何方法来识别这已经发生,因为它不会抛出任何公认的错误条件。我知道 RS485 总线冲突是应该通过良好的系统设计来避免的,但我们不能排除在客户安装系统时会发生这种情况的可能性 - 它需要能够识别错误,忽略“冲突”消息并继续 - 需要重新启动它是不可接受的。

有没有人知道如何识别这种情况/阻止系统进入中断循环?

提前致谢

中断例程如下(HAL 文件版本 1.2.0,日期 15 年 11 月 13 日)

0 投票
2 回答
69 浏览

c# - C#:等待从 RS485 发送的特定字符

在我的应用程序中,我正在向微控制器发送数据。我发送数据,微控制器进行编程,然后发送字符(“K”)。我的应用程序应该等待这个字符。收到这个字符后,它应该再次发送数据。

我收到这个角色有问题。函数 BytesToRead 是否有权读取字符?当我的程序到达这个我的功能等待时,它总是会下降

0 投票
1 回答
538 浏览

vba - RS232 代码不适用于 RS485 通信

我正在使用 VBA for Excel 通过串行通信与硬件进行通信。该代码使用与此处类似的 API 调用:http: //dev.emcelettronica.com/serial-port-communication-in-excel-vba

我在 rs232 上取得了成功,但它不适用于 rs485。发送数据并读回响应后,读取超时并读取已发送的相同数据。

我可以访问其他人开发的软件并且他们的软件可以工作,所以我知道硬件没问题。我使用了串行端口嗅探器,他们的代码似乎有很多冗余,但看起来它使用相同的配置并发送与我的代码相同的数据。但是他们的代码得到了有效的响应,而我的没有。

有人可以分享一些针对此类问题的基本故障排除技巧吗?

0 投票
1 回答
2072 浏览

c# - 使用串行端口和 ReadAsync 超时的正确方法

我以前使用过串行端口及其原始方法,如 BytesToRead、Read 和 Write。据说这些是不可靠的,我有很多忙等待我试图切换到它的异步方法。

我需要从具有 2 个不同超时的串行端口读取。第一次超时在两条消息之间(此处为 2000 毫秒),第二次超时在 2 个字符之间(此处为 10 毫秒)。因此,我为每个 ReadAsync 调用更改 ReadTimeout,如下所示:

发生 AggregateException 且未收到任何字节时的输出:

异常 1:操作已超时。超时:2014 毫秒
异常 1:操作已超时。超时:2014 毫秒
异常 1:操作已超时。超时:2014 毫秒
异常 1:操作已超时。超时:2014 毫秒
异常 1:操作已超时。超时:2014 毫秒
异常 1:操作已超时。超时:3584 毫秒
异常 1:操作已超时。超时:2014 毫秒
异常 1:操作已超时。超时:2017 毫秒
异常 1:操作已超时。超时:2012 毫秒
异常 1:操作已超时。超时:2011 毫秒
异常 1:操作已超时。超时:2016 毫秒
异常 1:操作已超时。超时:2012 毫秒
异常 1:操作已超时。超时:2011 毫秒
异常 1:操作已超时。超时:2013 毫秒
异常 1:操作已超时。超时:2013 毫秒

我现在的问题是:

  • 这是将 ReadAsync 方法与 .Wait() 一起使用的正确方法吗?
  • 每次调用 ReadAsync 之前都可以更改 ReadTimeout 吗?
  • 我是否应该在 ReadAsync 中使用 CancellationToken 作为参数,如果是,最好的方法是什么?
0 投票
1 回答
202 浏览

vb.net - 如何将接收到的串行文本放入多个文本框中?

我正在做一个串行通信项目,并希望根据单击哪个按钮来发送初始字符串并调用响应,将接收到的字符串放入文本框中。

ReceivedText 的代码是:

这只会导致接收到的字符串进入两个盒子而不是一个或另一个。

有没有办法让文本进入适当的框中?

0 投票
1 回答
961 浏览

python - Rasperry pi uart 和基于 rs485 的自定义协议

我正在尝试从 Arduino Nano 发送的树莓派上读取来自主 uart /dev/ttyAMA0 的数据。

arduino 端的库https://gitlab.com/creator-makerspace/rs485-nodeproto

所以我使用一个简单的 python 脚本来验证来自 arduino 的数据:

但是出来的数据在 n 次中有 x 次是损坏/错误的。

一个好的数据包看起来像 A0 2 1 4F 50 45 4E B7 1B 80

大部分时间的坏包:13 0a 7a 41 15 39 dd 1b 80 00

当使用连接到 rs485 收发器而不是内部 uart 的 USB 到 UART 时,测试脚本也可以正常工作。

关于我做错了什么的建议?

0 投票
0 回答
437 浏览

c++ - 简单的 C++/CLI SerialPort ReadByte (至少,我认为......)

因此,我正在 VisualStudio 中使用 C++/CLI 和基于 Arduino 的开发板。我的目标是通过 RS485 实现 MODBUS。

所以我的开发设置如下......

笔记本电脑通过 FTDI USB-RS485 接口电缆连接到连接到 Arduino 串行端口“Serial1”的 Maxim MAX3485 芯片。

我一直在 Visual Studio 中编写我的 MODBUS 协议,并通过要求 Arduino 响应 5 个寄存器(一个 5 字节数组)的内容来对其进行测试。除了某种原因,一切正常,当我检查结果时,返回字节被分成两部分。

IE .. 我正在从 Arduino 发送以下字节:

A实际上是“0A”,但终端窗口只显示为“A”。计算机上的软件接收字节,并将它们存储在一个数组中。然后我将屏幕上接收到的字节显示为文本。我得到的是:

这看起来是正确的,除了“1 & 4”、“2 & 8”等之间的空格。这告诉我我有 14 个字节而不是我发送的 10 个字节。

我在屏幕上显示每个字节,用空格分隔。我使用单独的 com 端口上的终端窗口验证了留下的字节格式正确,所以问题一定出在字节的读取上?

我的 Arduino 代码:

视觉工作室代码

读取字节......

显示字节...

0 投票
3 回答
3768 浏览

stm32 - “Freemodbus”协议作为主机

是否可以使用“Freemodbus”作为主端?我将在 stm32f4xx ARM 处理器上实现它

如果不是,请向我介绍适用于 RS485 物理层的替代协议...

0 投票
1 回答
671 浏览

python-2.7 - 使用 pySerial(Delta Solar Inverter)读取 RS485 数据时缺少字节

太阳能逆变器(Delta RPI M6A)具有主从 RS485 总线。主机每秒几次要求逆变器发送响应数据集,然后逆变器会执行此操作。总通信集为 176 字节。Raspberry Pi 3B 使用 FTDI FT232 USB 串行 (UART) I2C 转换器连接到此总线。

Python 程序用于读取总线上传输的数据。仅当没有被解释为特殊字符的字节时(至少,我认为),这才有效。我首先一次读取输入 1 个字节。一旦找到了正确的“传输开始”序列(STX 后跟 ACK 后跟inverterID=1),那么就需要 160 字节的数据集加上一个结束序列。读取的最后一个字节应该是 ETX (= ascii 3)。

预期输出为: 预期输出截图

我认为问题在于,如果某些字节相当于转义或换行等特殊字符,那么 ser.read() 命令不会“看到”这些字节。然后我会提前几个字节获得 ETX 字节,这表明中间某处的某些字节没有被捕获。

代码的相关部分是:

稍后处理捕获的字节以允许写入数据库。

我一直在尝试 ser.read() 和 ser.readline(),结果相同。

我将不胜感激任何可以为我指明正确方向的提示。

谢谢,布拉姆

0 投票
1 回答
1010 浏览

serial-port - 使用 USB 设备生成 10 MBit RS485 (UART) 数据流

我需要使用 USB 设备生成 10 MBit RS485 (UART) 数据流。到目前为止,我认为 FT2232H 非常适合,但据我了解,FT2232H 只能生成 12 MBit 或 8 Mbit,因为主分频器 0 和 1 的细分数有限。USB 设备应在 PC 上以串行方式枚举支持 10 Mbit 波特率的接口。

那么知道哪种芯片适合特定任务吗?

谢谢。