我正在尝试学习如何在xubuntu linux 12.10中使用C / C ++(主要是C ++)的串口。我发现了一些有用的教程,但是,正如所有教程中的情况一样,文本是固定的,并没有解决很多“陷阱”。我正在尝试做一些简单的事情:打开一个串口(作为命令行参数发送),获取初始端口设置并将其打印出来,然后将端口初始化为新设置。
这是我到目前为止所做的:
#include <termios.h>
#include <iostream>
#include <string>
#include <cstdlib>
#include <unistd.h>
#include <fcntl.h>
#include <cstdio>
using namespace std;
int main(int count, char* parms[])
{
if (count != 2)
exit(1);
//open port
string fname = parms[1];
cout << fname << ": ";
int fd = open(fname.c_str(), O_RDWR | O_NOCTTY | O_NDELAY );
if (!fd)
{
cout << "error" << endl;
exit(1);
}
termios getPortSettings, setPortSettings;
//get current port settings
tcgetattr(fd,&setPortSettings);
getPortSettings = setPortSettings;
speed_t iBaud = cfgetispeed(&getPortSettings),
oBaud = cfgetospeed(&getPortSettings);
cout << "iBaud: " << iBaud << " oBaud: " << oBaud << endl;
cout << "\nPress Enter to change port status";
cin.get();
//set baud rate 19200
cfsetispeed(&setPortSettings,B19200);
cfsetospeed(&setPortSettings,B19200);
//set to no parity
setPortSettings.c_cflag &= ~PARENB;
//one stop bit
setPortSettings.c_cflag &= ~CSTOPB;
//clear out current word size
setPortSettings.c_cflag &= ~CSIZE;
//set 8 data bits
setPortSettings.c_cflag |= CS8;
//apply settings
int ret = tcsetattr(fd,TCSAFLUSH,&setPortSettings);
if (ret < 0)
{
cout << "error ("<< ret <<") in applying settings!\n";
exit(1);
};
tcgetattr(fd,&setPortSettings);
iBaud = cfgetispeed(&getPortSettings);
oBaud = cfgetospeed(&getPortSettings);
cout << "iBaud: " << iBaud << " oBaud: " << oBaud << endl;
//close port
close(fd);
return 0;
}
当我测试时,我正在测试/ dev / ttyS0这样的串口,虽然/ dev / ttyS31(我在这里选择的确无关紧要吗?)。我能够打开几乎每个界面并从中获取设置(我想知道如何提取其他设置,它只是波特率看起来像低悬的果实,我需要让自己回到需要的按位数学提取其他一切)。
基本上,每次调用tcgetattr()时,它都会失败并返回泛型-1返回代码。最后,我想尝试挂起我的两台计算机并使用简单的零调制解调器电缆或USB电缆在两者之间发送数据(这样做的代码基本上是相同的,唯一的区别是设备文件对吗?),这只是我迈出的第一步。