问题标签 [baud-rate]

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 投票
3 回答
17931 浏览

c++ - 串口编程 RS485

我的任务是通过 RS485 2 线系统实现 ModBus 协议。(实际上是三根线,A/B 和 GND)。ModBus 不是重点,但在此之前的步骤……通过接口进行简单的 I/O。

我正在使用 FTDI USB-RS485 转换器将 Linux 主机(不可互换)连接到 Windows 主机(可与另一台 Linux 主机互换,但我想避免这种情况)

编码应该是 19200, 8, n, 1。但它似乎不起作用。

我手头没有确切的代码,但在 Linux 上我正在这样做:

接下来,我配置端口。

目前还没有计划奇偶校验和流量控制,因为最终结果将连接到一个低级电路板,我需要自己处理信号。此外,没有任何电线可以实现“不受限制的通信”。(毕竟我不希望 XON/XOFF 字符限制我可以传输的字节范围)

所有这些功能都正确执行并设置了数据。

在 Windows 上,我像这样打开串行端口:

奇偶校验和流量控制被禁用。字节大小设置为 8。

编辑:既然有人问过,这是我在 Windows 上的波特率代码(来自内存) SP.DCBlength= sizeof(SP); SP.BaudRate = 19200; SP.奇偶校验 = 无奇偶校验;SP.StopBits = ONESTOPBIT;SetCommState(hSerial, &SP);

同样,所有这些功能都可以完美运行。

现在,对于让我头疼的测试用例。

在 Linux 主机上,我创建了一个 256 字节大小的字节缓冲区。这个缓冲区填充了从 0 到 255 的字符值......然后通过网络通过写入发送。同时,对方正在用“ReadFile”等待数据到达。

使用此配置,对于“其他 Linux 主机”以及 Windows 主机,256 字节到达......但是它不是 0-255 的数字,而是 00 06 等。

当我在设置我真正想要的选项之前将 termios 结构的所有成员设置为 0 时,我可以让 Linuxhost 工作。我猜,这是因为控制字符......但是如果我这样做,Windows 主机要么只接收 256 个字节中的 4 个。

正如我所说,不幸的是我手头没有代码。如果有人知道我可以从什么角度解决这个问题,我将不胜感激。一旦我再次可以访问它,我将发布更多代码。

我如何实现读取操作:

需要注意的是,我确实设置了超时,但不记得确切的值。

编辑:因为我现在可以再次访问我的工作地点,所以这是实际的(当前)代码。

}

至于实际的发送/接收代码:

}

至于示波器:我已经测试了发送的两个方向。两人都非常出色地完成了他们的工作。

0x55 的信号在 50 微秒的长度上是一个恒定的 Up/Down(应该如此,因此设置波特率也没有问题)。

那么我的“接收”代码中有什么我做错了吗?“选择”错了吗?

0 投票
2 回答
1631 浏览

c - Dealing with serial port at 100 baud rate

I am looking to know if it is possible to read from a serial port at 100 baud rate. As per termio.h there is no provision to set 100 as baud rate. I am working in Linux. The communicating device on the other end is sending data at 100 baud rate and it is fixed. I would like to know if my baud rate is set to 110, would it guarantee that the data I am receiving is correct? or is there any solution for this?

Kindly guide.

0 投票
7 回答
110649 浏览

linux - 如何在 Linux 上设置自定义波特率?

我想通过我在 Linux 上的串行端口与具有未在termios.h.

我尝试了这篇文章中的“波特率别名”方法,但是当我执行我的 C 程序(我将其命名为“testprogram”)时,Linux 说"testprogram sets custom speed on ttyS0. This is deprecated."

我在 Google 上进行了一些搜索,似乎还有另一种(更新的?)方法可以将波特率更改为非标准值:在http://sourceware.org/ml/libc-help/2009-06 /msg00016.html作者说c_flagofstruct termios必须与BOTHER (=CBAUDEX | B0).

使用这种方法,波特率直接在 . 的c_ispeedc_ospeed- 成员中设置struct termios。但是,我不知道如何在我的 C 程序中使用这种方法。就像作者说的,当我包含时没有BOTHER定义/可用termios.h,那么应该怎么做才能以这种方式设置波特率呢?

如何在不更改内核的情况下将波特率设置为非标准值?

0 投票
2 回答
40698 浏览

embedded - 是时候通过 9600 波特串行发送 32KB 了?

我想知道我的数学是否正确。如果我的波特率为 9600,那么这意味着每秒发送 9600 位,对吗?如果是这样,那么:

因此,发送 32KB 需要:

那是对的吗?

0 投票
1 回答
567 浏览

serial-port - 通过 pl2303 连接器和 serialstream.h/libserial 在 ubuntu 上设置 buad 速率时出错

我正在 Ubuntu 上开发一个串行通信应用程序。我正在使用 pl2303 转换器和libserial

我的问题是我无法设置波特率。执行下面的源代码后,我得到错误状态 = 2。

我的源代码是:

0 投票
1 回答
1608 浏览

c - 有没有办法在 C 中获得支持的波特率?

我有一个应用程序在 PC 和带有运行 uCLinux 的微控制器的板之间进行通信。当我通过 PC 发送消息时,/dev/TTYS0我会在 PC 端收到消息,但消息却是乱码。我很确定我有某种波特率不匹配。

在 PC 端,我使用提供的波特率:

在 Linux 板方面,我在代码中设置了相同的波特率:

当我测试 PC (Win 7)->Linux Box (OpenSuse) 时,这对我有用,所以我知道这个理论是合理的。现在我已经将它移植到我的真正目标(运行 uCLinux 的冷火微控制器板)上,我得到了垃圾。

所以我的第一个选择是以各种波特率“猜测和检查”,看看我是否能找到一个可行的方法,但我不想以编程方式找到一种方法来识别特定目标支持的波特率。

我确定有一些 API,但我还没有找到。想法?

编辑: 似乎可以使用COMMPROP 结构在 Windows 上获得最大波特率。Linux上是否存在这样的东西?

0 投票
1 回答
1754 浏览

c - 为什么输入和输出波特率总是一样的?

我有一个简单的程序设置串行(RS232)端口的波特率。我正在使用cfsetospeed()andcfsetispeed()函数独立设置输入和输出速率。根据手册页,如果我使用这些函数和适当的常量,这应该是可能的:

cfsetispeed() sets the input baud rate stored in the termios structure to speed, which must be specified as one of the Bnnn constants listed above for cfsetospeed(). If the input baud rate is set to zero, the input baud rate will be equal to the output baud rate.

cfsetospeed() sets the output baud rate stored in the termios structure pointed to by termios_p to speed, which must be one of these constants: ... B600 ... B19200

我的问题是,我设置的第二个(输入或输出)似乎是两者的最终值。我正在尝试设置两个独立的速度。

代码:

我的getBRate()函数只是一个简单的(丑陋的)开关来返回波特率的字符串版本:

这里的输出将是:

如果我像这样反转两个“设置”行:

我的输出将更改为:

有任何想法吗?

编辑:
由于问题出现,此代码将在使用 Coldfire 528X(5280 或 5282)的板上运行。无论如何,根据 UART 的参考手册,RX 和 TX 应该能够具有不同的速率:

23.3.4 UART Clock Select Registers (UCSRn)
The UCSRs select an external clock on the DTIN input (divided by 1 or 16) or a prescaled internal bus clock as the clocking source for the transmitter and receiver. See Section 23.4.1, “Transmitter/Receiver Clock Source.” The transmitter and receiver can use different clock sources.

0 投票
0 回答
560 浏览

android - 安卓蓝牙获取波特率

嗨,目前正在从事一个通过蓝牙工作的项目。

我与之交谈的设备有几种不同的模式。这些模式中的每一种都使用不同的波特率。

我在这个项目中使用了蓝牙聊天示例。

我的问题如下

这些设备的每个返回都发回不同的结束字符串。("\r\n" , "\r")

我希望能够知道设备处于什么模式。我能想到的最好方法是找到设备当前的波特率。有什么方法可以从连接中找到信息吗?

0 投票
5 回答
48677 浏览

c# - 使用 serialport.open() 时出现 I/O 异常错误

最后更新

它一直是我们的固件。在某种程度上令人尴尬,但我很高兴我们可以继续前进,我可以推迟一天学习 Java。我的答案如下。

更新

所以我或多或少地放弃了这一点。我认为这是一个归结为 API 的错误,但我既没有时间、资源也没有技能来深入了解它。我认为存在一些 Windows 只是竖起中指的硬件。我已经下载了 Eclipse,切换到 Java 并尝试看看是否可行。如果没有,你会在这里看到我。但是,我绝对很想解决这个问题,所以如果有人有时间或有兴趣深入研究这个问题,我很想看看你想出了什么。显然我会不时回来这里查看。请确保您在评论中“@”我,以便我收到提醒。


原帖

我知道还有其他一些人在处理这个问题,但我希望有人能帮助我。我正在尝试连接到COM 端口,但是当我尝试使用以下serialport.Open()命令时出现 I/O 异常:

我正在使用 Stellaris LM4F232 来模拟 COM 端口。我可以使用 Termite(终端程序)打开、访问并获得良好的结果,但是每当我尝试使用 Visual Studio 时,它甚至都无法连接,并且出现此错误。现在我什至不知道这个错误是什么意思,尽管尝试在其他地方阅读,我仍然感到迷茫。

谁能向我解释这里发生了什么,也许我可以开始尝试解决这个问题?我可以包含更多代码,但老实说那里没有多少;串行端口设备的所有属性都正常,并且仅在此设备上发生(我可以使用 MSP430 没有问题,细节相同)。

我的代码如下所示,供希望查看的人使用(请注意,这只是一个“沙箱”,不是实际程序,但症状是相同的):

其他设置由属性管理器完成(唯一的区别是波特设置为 230400;所有其他设置为默认值)。我可以用这个(一个 MSP430)打开 COM4,从所有意图和目的来看,它都是一个相同的设备。我可以用 Termite 打开 COM5,所以我知道连接良好)。不,我不想同时打开它们。如果您需要更多信息,请告诉我,我可以发布更多信息。

编辑:我在第三天试图解决这个问题,但仍然没有运气。我真的不明白为什么我可以通过终端程序而不是我自己的程序访问这个 COM 端口,而在我所见的情况下,绝对没有区别。是否有可以“检查” COM 端口以查看其属性的程序(我的意思是 Windows 管理器除外)?我变得非常沮丧并且在我的项目中处于停滞状态,直到我弄清楚这一点......

EDIT2:我找到了一个明显的解决方法,但我还没有让它在这里工作。现在我得到了一些不同的 I/O 错误,但至少它是运动(不确定它是否是进度)。我还了解到这是一个 .NET 错误,自 2.0 以来就存在。我仍然希望得到任何帮助,但如果我弄清楚了,我会报告回来。Zach 的代码(上面链接的解决方法)如下所示:

EDIT3:第 6 天:我仍在努力解决这个问题。我的饮水量很低,但我仍然在努力。我觉得帮助肯定就在眼前。谁找到了这本日记,就把我的遗体带回加拿大并找到妮可。告诉她我爱她。

但说真的,我不知道是什么导致了这个问题。我想知道它是否纯粹在嵌入式方面;可能是因为它是USB On-The-Go (OTG),或者因为该设备也能够成为主机。有没有人遇到过这个问题?但它并没有解释为什么我可以使用 Termite(一个终端程序,对于那些刚刚加入我们的观众)。我一直在尝试找到一个开源终端程序,它 a) 可以工作并且 b) 参见 a)。像往常一样,如果我在这里发现这个问题,我会报告回来,因为我现在发现了无数的论坛,听起来人们可以追溯到 2006 年。

EDIT4:所以根据给出的建议,我下载了一个端口监控软件应用程序(我得到了Eltima Serial Port Monitor),它看起来确实像一个波特问题:

Eltima 的屏幕截图

但奇怪的是,无论我设置什么波特,它仍然失败。也有人可以解释上/下的意思吗?我试着用谷歌搜索它,但关键字太笼统了。像往常一样,我会继续报告任何变化。

另外,作为记录,我可以使用 Eltima 以 115200 的波特率(与 Termite 相同)进行连接。不幸的是,这在 Visual Studio 中不起作用。

EDIT5:我们的情节出现了意外的转折。我正在监视当 Termite 连接到有问题的 COM 端口和 BLAM 时会发生什么!Termite 会抛出与我的程序完全相同的错误,但它会忽略它。天才,对吧?马虎,但它的工作原理。现在我需要学习如何忽略 IOExceptions。等我弄明白了再汇报。

EDIT6:所以事实证明这是一个波特率问题,但它更深入。我一直在使用 Eltima 串口监控软件,它非常直观易用。我会推荐它。经过一些研究,我了解到您不能忽略此异常并仍然使用 .NET 的库连接到串行端口。

所以我必须深入了解 Win32 API 并编写自己的 API。我找到了一些涉及到这一点的页面,但老实说我以前从未做过这样的事情,所以我可能需要一段时间才能报告,但我一定会弄清楚这一点并回复给大家。受这个问题困扰的人太多了。

我找到了很多论坛和网站,在那里我可以看到完全相同的症状,但除了说“是的,.NET 很烂”之外,没有人真正做过很多事情。我计划编写一个完整的静态库类,然后在我的网站、这里和其他任何我可以发布的地方发布。希望 .NET 会引起注意(这个错误自 2.0 以来就存在)。

0 投票
1 回答
967 浏览

linux - 如何在 Linux 上使用 cfsetispeed 和 tcsetattr 命令将波特率配置为 9600 的端口?

我现在正在使用以下代码,我想知道它哪里错了。