IrDA发现的默认设置(波特率,位,停止,奇偶校验,流量控制等)

时间:2012-07-05 13:16:12

标签: c macos serial-port infrared

我正在尝试编写一个工具,使用IrDA与Mac上的Uwatec潜水电脑进行通信。我正在使用的USB IrDA设备提供了一个可用于发送和接收数据的串行设备(/dev/cu.IrDA-IrCOMM0/dev/tty.IrDA-IrCOMM0)。不幸的是,Mac没有提供IrDA套接字层。

我已经确认使用设备驱动程序附带的命令行工具,它可以侦听并接收来自其他设备的IrDA通信。但是,虽然命令行工具告诉我它以9600波特率进行通信,但其余设置(位,停止位,奇偶校验,流量控制等)不会返回给我。

我已经尝试编写自己的程序来收听数据,但它无法接收任何数据,我相信原因是因为这些设置不正确。所以,假设我只是试图收听正在发送的9600波特IrDA发现数据包,我需要使用的其他设置是什么?

如果有帮助,这里是我正在使用的代码片段来设置通信参数 - 这不起作用:

#define DEVICE "/dev/cu.IrDA-IrCOMM0"

int main(void) {
    FILE *device;
    struct termios ttystate;

    device = fopen(DEVICE, "rw");

    //get the terminal state
    tcgetattr(fileno(device), &ttystate);
    //turn off canonical mode and echo
    ttystate.c_lflag &= ~(ICANON | ECHO);
    //minimum of number input read.
    ttystate.c_cc[VMIN] = 1;

    cfsetspeed(&ttystate, B9600); // Set 9600 baud····
    ttystate.c_cflag |= (CS8 | // Use 8 bit words
                         PARENB   | // parity enable
                         PARODD   | // odd parity
                         CCTS_OFLOW | // CTS flow control of output
                         CRTS_IFLOW);// RTS flow control of input

    //set the terminal attributes.
    tcsetattr(fileno(device), TCSANOW, &ttystate);
    return EXIT_SUCCESS;
}

1 个答案:

答案 0 :(得分:0)

以下是我在Linux上用于EXAR XR17C15的IrDA初始化代码。 此外,您必须将波特率设置为此示例中未设置的值。 我希望这会有所帮助。

//
// Set up IrDA hardware interface through UART

bool CeIrDA::SetupIrDA()
{
    struct termios termios;
    tcgetattr(hComPort, &termios);
    cfmakeraw(&termios);

    termios.c_iflag = IGNPAR;
    termios.c_oflag = 0;
    termios.c_cc[VTIME] = 1;    // timeout in 0.1s between 2 characters
    termios.c_cc[VMIN] = 1;     // min # of characters

    tcsetattr(hComPort, TCSANOW, &termios);

    xrioctl_rw_reg input;
    struct timespec delay = {0, 500};
    struct timespec delayrem;
    //EFR: Allowing Enhanced Functions and RTS/DTR flow control
    input.reg=0x09;
    input.regvalue=0x50;
    ioctl(hComPort,WRITE,&input);

    nanosleep(&delay, &delayrem);

    //MCR: Flow control RTS enabled
    input.reg=0x04;
    input.regvalue=0x40;
    ioctl(hComPort,WRITE,&input);

    nanosleep(&delay, &delayrem);

    //MCR: RTS pin high
    input.reg=0x04;
    input.regvalue=0x00;
    ioctl(hComPort,WRITE,&input);

    nanosleep(&delay, &delayrem);

    //MCR: RTS pin low
    input.reg=0x04;
    input.regvalue=0x02;
    ioctl(hComPort,WRITE,&input);

    nanosleep(&delay, &delayrem);

    //MCR: Infrared Mode
    input.reg=0x04;
    input.regvalue=0x42;
    ioctl(hComPort,WRITE,&input);

    nanosleep(&delay, &delayrem);

    //EFR: Allowing Enhanced Functions and RTS/DTR flow control
    input.reg=0x09;
    input.regvalue=0x40;
    ioctl(hComPort,WRITE,&input);

    nanosleep(&delay, &delayrem);

    //LCR: Allowing changes of DLL and DLM
    input.reg=0x03;
    input.regvalue=0x80;
    ioctl(hComPort,WRITE,&input);

    nanosleep(&delay, &delayrem);

    //DLL: Speed configuration
    input.reg=0x00;
    input.regvalue=0x02;
    ioctl(hComPort,WRITE,&input);

    nanosleep(&delay, &delayrem);

    //DLM: Speed configuration
    input.reg=0x01;
    input.regvalue=0x00;
    ioctl(hComPort,WRITE,&input);

    nanosleep(&delay, &delayrem);

    //LCR: configuration for parity, word length....
    input.reg=0x03;
    input.regvalue=0x03;
    ioctl(hComPort,WRITE,&input);

    nanosleep(&delay, &delayrem);
    return true;
}