【发布时间】:2011-10-17 09:13:03
【问题描述】:
我正在尝试将程序从 Windows 移植到 linux。
问题是我无法成功设置波特率(代码如下)
我已经在连接到串行端口的电缆上设置了一个示波器。在 windows 版本中,我可以在 25 微秒时看到一个模式,但在 linux 版本中,我可以在 250 微秒时看到相同的模式,告诉我信息是正确的,但它发送的速度很慢。
我尝试将波特率设置为几个不同的值,但在示波器上仍然得到相同的结果。
我正在寻找的是一个程序,它将串行端口设置为 115200 波特、标记奇偶校验、1 个停止位和 8 个数据位并通过线路发送一些东西,以便我可以在超级终端上看到它。 c++ 中的程序会很棒,因为如果它有效,我可以将它与我的程序进行比较。
我认为有些东西以某种方式将波特率设置在某个值,如果我从其他人那里得到一个确认可以工作的程序,我可以说它是 linux 的设置。我在不同的计算机上尝试过,但它们都是由我们的系统管理员以相同的方式配置的
我已经尝试了 3 周,并且已经完成了数百个串口教程,作为一个 linux 菜鸟,我现在不知道该怎么做。
idComDev[i] = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
if (idComDev[i] == -1)
{
perror("open_port: Unable to open /dev/ttyS0 - ");
ret = false;
}
else
{
fcntl(idComDev[i], F_SETFL, 0);
struct termios options;
tcgetattr(idComDev[i], &options); // get current settings
cfsetspeed(&options, B9600); // set baud rate
test = tcsetattr(idComDev[i], TCSANOW, &options);// save the settings
options.c_cflag &= ~CSIZE; // Mask the character size bits
options.c_cflag |= CS8; // 8 bit data
options.c_cflag &= ~PARENB; // set parity to no
options.c_cflag &= ~PARODD; // set parity to no
options.c_cflag |= CSTOPB; //set one stop bit
options.c_cflag |= (CLOCAL | CREAD);
options.c_oflag &= ~OPOST;
options.c_lflag &= 0;
options.c_iflag &= 0; //disable software flow controll
options.c_oflag &= 0;
tcsetattr(idComDev[i], TCSANOW, &options);// save the settings
printw("Seg %d = COM%hd",i,CommNo[i]);
if(test!= -1)
printw("test success");
【问题讨论】:
-
运行程序后,您可以运行
stty -F /dev/ttyS0 -a并检查设置吗?这应该会告诉您哪些设置没有被采用。 -
@Adrian Cox 该命令获得“没有这样的文件或目录”可能是因为我在根目录中并且似乎无法向上移动一个:(
-
我不确定根目录中的存在与它有什么关系。你的代码引用了
/dev/ttyS0,所以我很困惑为什么你不能从命令行访问/dev/ttyS0。您使用的是什么 Linux 发行版? -
@Adrian Cox centos,并且因为 linux 是区分大小写的,这仍然让我在这里和那里感到抱歉。它说波特设置为 115200,这是我想要的,但我将其设置为 9600 atm 以进行测试,或者尽管 termios 声称成功,但没有发生任何事情
-
我的想法已经不多了。最后要尝试的事情:在您的最终
tcsetattr之后调用tcgetattr并与预期值进行比较。尝试使用stty更改波特率。查看stty源(在 coreutils 中)进行比较。
标签: c++ linux serial-port