tcsetaddr并学习编程串口

时间:2014-03-10 17:48:41

标签: c++ linux serial-port fcntl termios

我正在尝试学习如何在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电缆在两者之间发送数据(这样做的代码基本上是相同的,唯一的区别是设备文件对吗?),这只是我迈出的第一步。

0 个答案:

没有答案