2

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

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

Serial<id=0x1efb320, open=True>(port='COM4', baudrate=9600, bytesize=8, parity='
N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)

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

tcgetattr(fd, &options);
cfsetispeed(&options, 9600);
cfsetospeed(&options, 9600);
tcsetattr(fd, TCSANOW, &options);
tcgetattr(fd, &options);

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

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

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

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

4

1 回答 1

2

请阅读cfsetospeed()手册页。speed参数必须是常数:, B50, B75.., B9600, B19200, B38400, B57600, B115200, 或B230400,而不仅仅是数字的速率。

要确定是否支持特定速率,只需设置它cfset?speed()+ tcsetattr(),然后读回设置(使用tcgetattr()+ cfget?speed()),并检查速度是否设置为所需值。我相信,驱动程序应该拒绝无效的波特率。

于 2012-10-16T15:57:42.667 回答